前回、Arduino UNOを使いボードに搭載されたLED(ビルトインされたLED)を点滅させてみました。
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2020/10/arduino-builtin-led-flashing-24.jpg?fit=601%2C400&ssl=1)
今回はその復讐&応用としてデジタル入出力ピン(D0~D13)に繋げたLEDを点滅させてみたいと思います。
またArduinoのアナログ入力ピンはデジタル出力にも使う事が出来ます。
Arduino UNOの全てのデジタル入出力ピン&アナログ入力ピンを使い何台までLEDを制御出来るかもやってみたいと思います。
目次
【Arduino UNO】デジタル入出力ピンを使い複数のLEDを点滅させてみる!
今回の目標
前回、Arduino UNOボード上に標準で搭載されているビルトインLEDを点滅させてみました。
今回はその復習的な内容となりますが、デジタル入出力ピン(D0~D13)を使って外部に取り付けたLEDを実際に点滅させてみたいと思います。
デジタルピンを使う場合、pinMode関数で使うピンや入出力(INPUT or OUTPUT)を設定(初期化)し、digitalWrite関数を使って指定したピンに電圧(HIGH:5VやLOW:0V)を出力させます。
この一連の流れが理解できればと思います。
また、Arduino UNOにはA0〜A5までの計6本のアナログ入力ピンがあります。
アナログ入力ピンに関してはまだ詳しくご紹介していませんが、こちらのピンはデジタル出力ピンとして使う事も出来ます。
このあたりも踏まえてやっていきたいと思います。
【使用スケッチ】デジタル入出力ピンを使ってLEDを点滅させる
前回、Arduino UNOに内蔵されているLEDを点滅させてみました。
今回はデジタル入出力ピン(D0~D13)に実際にLEDを繋ぎこれを点滅させてみたいと思います。
とは言っても内容は前回と同じです。
前回の復習的な内容となりますが、setup()関数内でpinMode関数を使いデジタルピン(D1~D13)の任意のピンを出力(OUTPUT)に設定(初期化)し、digitalWrite関数を使い端子電圧をHIGH(5V)またはLOW(0V)にしてLEDを点滅させてみます。
こちらのスケッチを使いデジタル入出力ピンに繋がれたLEDを点滅させてみたいと思います。(今回はD4ピンにLEDを接続しています。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //Arduino入門② LEDを点滅 //https://burariweb.info // setup関数は電源投入時、またはリセットボタンを押した直後に1回だけ実行されます void setup() { pinMode(4, OUTPUT); // デジタルピン4を出力モードに設定 } // loop関数は何度も繰り返し実行されます void loop() { digitalWrite(4, HIGH); // LEDを点灯(HIGHは電圧レベルを5Vにする) delay(500); // 0.5秒間(500ms)待つ digitalWrite(4, LOW); // LEDを消灯(LOWは電圧レベルを0Vにする) delay(500); // 0.5秒間(500ms)待つ } |
前回出てきたArduinoの関数(コマンド)ですがもう一度復習しておきましょうか。
pinMode(pin,mode);
Arduinoが持っているデジタル入出力ピン(D0~D13)の設定をします。
Pin:設定したいピンの番号
mode:入力として使いたい場合「INPUT」、出力として使いたい場合は「OUTPUT」と記載。
【記述例】pinMode(4, OUTPUT);
digitalWrite(pin,value);
指定したpinにHIGHまたはLOWを出力します。
指定したピンがpinMode()関数でOUTPUTに設定されている場合、次の電圧にセットされます。
HIGH:5V
LOW:0V(GND)
【記述例】digitalWrite(4, HIGH);
delay(ms);
プログラムを指定した時間(ミリ秒間)停止させます。
delay(1000)の場合、1000ミリ秒=1秒停止させる。
使用回路
前回と違いデジタルピンにLEDを繋ぎました。
ここでLEDは直接Arduinoのピンには繋がず抵抗を介して接続しています。(今回150Ωの抵抗を使用)
LEDのアノード(プラス側)をD4ピン、カソード(マイナス側)をArduino UNOのGND端子に接続しています。
一般的にLEDには順方向電圧(LEDにかかる電圧)が約2Vとされています。
また流すことができる順方向電流は最大約20mA程度となっています。
これは使用するLEDの種類や色などにより変わってくるので詳しくは使用されるLEDのデータシート等で確認した方がいいのですが、一般的にこの値に近いものが多いようです。
Arduino UNOのデジタル出力はHIGH状態で5Vの電圧が出力されるので直接LEDをArduinoに接続すると短時間で壊れてしまいます。
そこでLEDの接続には制限抵抗を1本入れてあげるようにします。
実際の抵抗値はオームの法則で簡単に計算出来ます。
オームの法則 電流(I) = 電圧(E) / 抵抗(R)
よって求める抵抗(R)=電圧(E) / 電流(I)となります。
R=Arduinoからの出力電圧(5V) − 抵抗に掛かる電圧(2V) / 電流(20mA)
R=(5V -2V)/0.02A(20mA)=150Ωとなります。
実際には150Ω以上のもの、1KΩ位までの手持ちのものを使えばいいと思います。
回路を組み上記のスケッチをArduino UNOに書き込み動かすと、LEDが0.5秒間隔で点灯・消灯を繰り返すのが確認できます。
あとはLEDを他のピンに繋ぎ変えスケッチ内のpinMode設定で他のデジタルピンでも同様に動作するか確認していただければと思います。
複数のLEDを点滅させてみる
デジタルピンを使いLEDの点滅方法を理解できたかと思います。
それではLEDの数を少し増やしてみましょう。
回路はこんな感じでLEDの数を2つにしてみました。
そしてこちらのスケッチを使い2つのLEDを交互に点滅させてみたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //Arduino入門② LEDを交互に点滅 //https://burariweb.info int LED_PIN1 = 4; // 変数に4を割り当てる(デジタルピン4番) int LED_PIN2 = 7; // 変数に7を割り当てる(デジタルピン7番) void setup() { pinMode(LED_PIN1, OUTPUT); // デジタルピン4番を出力モードに設定 pinMode(LED_PIN2, OUTPUT); // デジタルピン7番を出力モードに設定 } void loop() { digitalWrite(LED_PIN1, HIGH); // デジタルピン4番に繋いだLEDを点灯 digitalWrite(LED_PIN2, LOW); // デジタルピン7番に繋いだLEDを消灯 delay(500); // 0.5秒間(500ms)待つ digitalWrite(LED_PIN1, LOW); // デジタルピン4番に繋いだLEDを消灯 digitalWrite(LED_PIN2, HIGH); // デジタルピン7番に繋いだLEDを点灯 delay(500); // 0.5秒間(500ms)待つ } |
今回はLEDの数が増えたので変数を使ってみました。
スケッチ内のint LED_PIN1 = 4;の部分がそれにあたります。
これまでのようにpinMode関数やdigitalWrite関数内に直接ピン番号を書き込んでもいいのですが、今後長いプログラム(スケッチ)を書く際に関数内の数字が何を意味しているのか分かりづらくなったりする場面が出てくるかと思います。
また後から出力させるピンを変更したい場合が出てくると、pinMode関数・digitalWrite関数両方の数字を変更しなければならなくなりと手間がかかります。
この変更の手間が少なくなるため、分かりやすい名前(変数)を使っていくと便利となります。
今回はLED_PIN1やLED_PIN2という変数名にしましたが、任意の分かりやすい名前を定義することが可能です。
ここではLED_PIN1やLED_PIN2という変数内にLEDを接続したピン番号が格納されるようにしています。
int(整数型)
intは整数型の変数の宣言で使われ、数字の記憶に最も使われる宣言方法となります。
【記載例】int abc = 7;
あとはこれまで同様setup関数内でpinMode関数を使ってデジタルピンを出力に設定しています。
これまでと違うのは、直接ピン番号を指定するのではなく変数を使っている点ですね!
8 9 10 11 12 | void setup() { pinMode(LED_PIN1, OUTPUT); // デジタルピン4番を出力モードに設定 pinMode(LED_PIN2, OUTPUT); // デジタルピン7番を出力モードに設定 } |
そしてdigitalWrite関数で2つのLEDの点灯・消灯を入れ替えて点滅させています。
こちらでもdigitalWrite関数内で変数を使ってピン番号を指定しています。
15 16 17 18 19 20 21 22 23 24 25 | void loop() { digitalWrite(LED_PIN1, HIGH); // デジタルピン4番に繋いだLEDを点灯 digitalWrite(LED_PIN2, LOW); // デジタルピン7番に繋いだLEDを消灯 delay(500); // 0.5秒間(500ms)待つ digitalWrite(LED_PIN1, LOW); // デジタルピン4番に繋いだLEDを消灯 digitalWrite(LED_PIN2, HIGH); // デジタルピン7番に繋いだLEDを点灯 delay(500); // 0.5秒間(500ms)待つ } |
Arduinoにスケッチを書き込み実行すると2つのLEDが交互に点灯する動作が確認できます。
あとは変数の数字を変更し他のデジタルピンでも同様に動作確認していただければと思います。
アナログ入力ピンはデジタル出力ピンとしても使える!
これまでデジタル入出力ピン(D0~D13)をpinMode関数を使い出力(OUTPUT)に設定してLEDを接続して点滅させてきました。
Arduino UNOにはこの14本のデジタル入出力ピン以外にもアナログ入力ピン(A0~A5)が6本あります。(アナログピンは入力のみ)
こちらはまだ詳しくご紹介していないのですが、これまで使ってきたデジタルピンではHIGH(5V)かLOW(0V)しか扱うことが出来ませんでした。
こちらのアナログ入力ピンを使えばジョイスティック(可変抵抗)などのアナログ値の読み取りなどができます。
このアナログ入力に関してはまた今後詳しくご紹介できたらと思います。
そして実はこのアナログ入力ピンはデジタル出力として使う事も出来ます。
試しにやってみましょう。
上記で使ったスケッチと回路を少し変更ることにより確認できます。
まずはArduinoに繋がれているLEDの配線をアナログ入力ピンに入れ替えます。
アナログ入力ピンはA0~A5までの6本ありどのピンを使ってもいいのですが、今回はA0ピンとA5ピンにLEDを繋いでみましょう。
こんな感じですね。
あとはスケッチも少し修正しましょう。
先程使ったスケッチ内のLED_PIN1とLED_PIN2変数の値を変更することにより確認できます。
LED_PIN1変数にA0をLED_PIN2変数にA5を代入します。
変更はこれだけです。
やはり変数を使っていると変更の際の手間が少なくてすみますね!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //Arduino入門② LEDを交互に点滅(アナログピン使用) //https://burariweb.info int LED_PIN1 = A0; // 変数にA0を割り当てる(アナログ0番ピン) int LED_PIN2 = A5; // 変数にA5を割り当てる(アナログ5番ピン) void setup() { pinMode(LED_PIN1, OUTPUT); // A0ピンを出力モードに設定 pinMode(LED_PIN2, OUTPUT); // A5ピンを出力モードに設定 } void loop() { digitalWrite(LED_PIN1, HIGH); // A0ピンに繋いだLEDを点灯 digitalWrite(LED_PIN2, LOW); // A5ピンに繋いだLEDを消灯 delay(500); // 0.5秒間(500ms)待つ digitalWrite(LED_PIN1, LOW); // A0ピンに繋いだLEDを消灯 digitalWrite(LED_PIN2, HIGH); // A5ピンに繋いだLEDを点灯 delay(500); // 0.5秒間(500ms)待つ } |
スケッチを書き込むとLEDが交互に点灯します。
アナログ入力ピンを使ってこれまでのデジタル入出力ピン同様にデジタル出力ができました。
また次の項目で説明しますがこのA0~A5は、14~19という数字に置き換えることも出来ます。
デジタルピン&アナログピンを使い20個のLEDを点滅させてみる
上記によりアナログピンもデジタル出力で使う事が出来ることが分かりました。
それでは最後にArduino UNOにあるデジタル入出力ピン(D0~D13)までの14本、そしてアナログ入力ピン(A0~A5)までの6本の計20本のピンを使い20個のLEDを同時に制御してみたいと思います。
回路はこれまでと同様に各ピンに抵抗を介してLEDを接続しているだけの単純な回路ですが、さすがに20回線となるとかなり配線が大変です。
実際はこれだけの入出力ピンを同時に使ってしまうとその他センサーやモーターなど接続できる余地が無いので好ましくありません。
I2C通信やシフトレジスタなどを使いArduinoに接続するピンの本数を減らしたりしますが・・・今回はテストという事でやってみましょう。
こちらのスケッチを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //Arduino入門② 20個のLEDを点灯させる //https://burariweb.info int WAIT = 30; // WAIT変数に待ち時間を入力 void setup() { for(int i=0; i<=19; i++){ // 0-19までのピン(D0-D13,A0-A5)を pinMode(i, OUTPUT); // デジタル出力に設定 } } void loop() { for(int i=0; i<=19; i++){ // 変数iを0から19まで1ずつ加算していく digitalWrite(i, HIGH); // i番ピンに接続したLEDを点灯 delay(WAIT); // 指定された時間停止 digitalWrite(i, LOW); // i番ピンに接続したLEDを消灯 } } |
まずばsetup関数内でpinMode関数を使い各ピンをデジタル出力出来る状態にします。
これまでのようにpinMode(0, OUTPUT)、pinMode(1, OUTPUT)・・・とやってもいいのですが大変なのでfor関数を使ってやっています。
7 8 9 10 11 | void setup() { for(int i=0; i<=19; i++){ // 0-19までのピン(D0-D13,A0-A5)を pinMode(i, OUTPUT); // デジタル出力に設定 } } |
制御文 for
【書式】for(初期化; 条件式; 加算){…}
まず初期化が一度行われます。
ループが行われるごとに加算が行われ、条件式が満たされている間ループが繰り返されます。
アナログピンをデジタル出力で使う場合、先程A0やA1のように指定するという話をしました。
しかしArduinoは非常に優秀です。
デジタルピン(D0~D13)はそのピン番号に0~13の数字で指定しましたが、13以上の数字になると自動的に14を引いた値に変換してくれアナログピンだと認識してくれます。
つまりピン番号に14を指定すると14を引いた0、つまりA0ピンとして認識してくれます。
15ならA1、16ならA2という具合に14〜19の数字でアナログピン番号を指定する事が出来ます。
実際の指定にはA0やA1と記載した方がアナログピンを使っているんだと後々確認の際分かりやすいのですが、今回のようにfor関数を使って数字で一気に指定する場合など便利なので覚えておくといいかもしれません。
実際に動かしてみましょう。
今回使った関数(コマンド)まとめ
関数 | 使用方法 |
pinMode(pin,mode); | Arduinoが持っているデジタル入出力ピン(D0~D13)の設定(入力 or 出力)をする。 pin:設定したいピンの番号 【例】pinMode(13, OUTPUT); |
digitalWrite(pin,value); | 指定したpinに”HIGH(5V)” または “LOW(0V)”を出力します。 pinMode()関数とペアで使い、指定したピンがpinMode()関数でOUTPUTに設定されている場合、次の電圧にセットされます。 HIGH:5V LOW:0V(GND) 【例】digitalWrite(13,HIGH); |
delay(ms); | プログラムを指定した時間(ミリ秒間)停止させます。 delay(1000);の場合、1000ミリ秒=1秒停止させる。 |
int | intは整数型の変数の宣言で使われ、数字の記憶に最も使われる宣言方法。【例】int abc = 7; |
for | 【書式】for(初期化; 条件式; 加算){ … } まず初期化が一度行われます。 |
今回のポイント
- Arduinoのデジタル出力によりLEDを点灯させる場合、制限抵抗が必要!
- アナログ入力ピン(A0~A5)はアナログ値が取得できる入力専用の端子ですが、pinMode設定によりデジタル出力端子として使う事も出来る!
- アナログ端子のピン番号は通常A0やA1のように指定しますが、14〜19の数字で指定する事も可能!
今回使ったパーツ
Arduino UNO
Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数メーカーから販売されています。
互換品でも正規品と比べて特に問題なく使用でき数百円程度で購入が可能なのでArduino学習用としていいですね!
Arduino スターターキット
また、これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。
私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)
そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)
参考 チュートリアルダウンロードELEGOO基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。
スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーなど必要なものを増やしていき・・・。
LEDセット
今回、最終的に20個のLEDを使いました。
ArduinoのスターターキットにもLEDは20個ほどは入っていました。(同色では揃いませんが)
LEDはArduinoを使っていろいろ回路を組んで試す際よく使うパーツです。
個別で購入するよりセットになっているものは非常にお安く1セット持っていると便利だと思います。(200個ほど入っています)
抵抗セット
抵抗も使用頻度が高いパーツの1つです。
こちらも1000本ほど入ったセットが数百円程度で売られているので1セット持っておくとこれから便利になるかと思います。
上記Arduinoスターターキットにもある程度の数(正確な本数数えてなくてすいません)入っており、LEDの制限抵抗としてやプルアップ・プルダウン用抵抗として使えます。
ブレッドボードを使い複数の回路を組んで同時にいろいろと試して・・・なんてやってると、やはり本数的にたくさん手元にあった方がいいと思います。
ジャンパーワイヤー
こちらも今回多く使用しました。
ジャンパーワイヤーは先端の形状が、オス-オスやオス-メス、メス-メス、そして長さや色もいろいろあります。
こちらも電子工作では使用頻度が最も高いパーツなので手元に多めにあると便利です。(スターターキットにもかなりの数入っています)
最後に!
前回から2回にわたりArduinoのデジタル出力についてやってきました。
Arduino UNOの場合、アナログピンも含め計20個のピンをデジタル出力として使う事が出来ることが分かりました。
これでデジタル出力に関しては雰囲気が掴めたのではないでしょうか?
デジタルなのでHIGHかLOW、つまりArduinoの場合5Vか0Vの組み合わせなので分かりやすいかと思います。
しかしLEDを徐々に明るくしたり暗くしたり、こんなアナログ的な動作はどうやって?
なんて察しのいい方は思われるかと思います。
そうなんです、デジタルの世界でこのようなアナログ的な動作をさせようと思うと少し厄介?な話となってきます。
これまでやってきたデジタルピンでのHIGHかLOWの出力だけでは対応出来ません。(厳密に言うとこのHIGHとLOWの組み合わせでやってるのですが!)
そこでアナログ的な動作、例えば先ほど出てきたLEDを徐々に明るくしたりなどの動作にはPWMという制御方法がよく使われます。
PWM制御に関しては次回詳しくご紹介したいと思いますが、このPWMを使えばサーボモーターを動かしたりする事も出来るようになります。
やはりArduinoを勉強し少しずつ使えるようになるとサーボモーターを使った2足歩行や4足歩行などのロボットみたいな動くものが作りたくなりますよね!
何かワクワクしますが・・・
でも、少しその気持ちを抑えて基本から少しずつやっていきましょう。
という事で今回はこのへんで・・・。
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2023/05/arduino-ina219-4.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2022/10/arduino-io-expander-4.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2022/09/arduino-spi-communication-21.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2022/03/arduino-software-serial-1.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2022/02/arduino-ir-module-use-1.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2022/02/arduino-uart-communication-1.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/11/arduino-stepping-motor-control-58.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/11/arduino-7segment-led-19.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/06/arduino-pca9685-servo-motor-driver-64.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/06/arduino-motor-driver-l298n-7.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/05/arduino-temperature-humidity-sensor-dht11-11.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/05/arduino-uno-r3-pin-array-basic-function-7.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/05/arduino-rtc-ds3231-i2c-module-6.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/05/arduino-i2c-communication-basics-47.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/05/arduino-lcd-module-display-6.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/05/arduino-servo-various-control-12.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/05/arduino-power-supply-method2-5.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/05/arduino-sensor-shield-7.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/05/arduino-expansion-board-prototype-shield-9.jpg?resize=520%2C300&ssl=1)
![](https://i0.wp.com/burariweb.info/wp-content/uploads/2021/04/arduino-optical-sensor-cds-26.jpg?resize=520%2C300&ssl=1)
[…] 【Arduino入門編②】複数のLEDを点滅(Lチカ)させてみる!デジタル出力の解説その② […]