こんにちは、「メカのりまき」です。
この記事では、Arduinoの入出力ピンを使って、LEDの点灯を制御する方法について説明したいと思います。
この記事は、前回の記事の続きとなっております。
LEDを点灯させるための回路については、前回の記事で説明をしていますので、LEDを点灯させるための回路が良く分からないという方は、前回の記事を先にご覧になることをお勧めします。
また、この記事は、「Arduino IDE」の基本的な使い方を、理解していることを前提とした記事となっています。
「Arduino IDE」の使い方は以下のリンク先の記事で説明していますので、「Arduino IDE」の使い方が分からないという方は、以下のリンク先の記事を是非ご覧になってください。。
目次
本記事で使用するもの
本記事で私が使用した物は以下の通りです。
- 「Arduino IDE2.0.3」をインストールしたPC(Windows11)
- USBケーブル
- Arduino Uno R3(ELEGOO UNO R3でも可)
- ブレッドボード
- LED
- 抵抗器
- ジャンパーワイヤー
「Arduino Uno R3」の互換ボードであれば、「ELEGOO UNO R3」以外のボードでも、本記事と同様な手順で動作可能だと思われますが、動作検証はしていないので、その点はご了承ください。
以下のリンクのスターターキットを購入した場合、上記で述べた使用するものは、PC以外すべて入手することができます。
Arduinoをまだ購入していないという方やArduinoで動かすことができるたくさんのパーツが欲しいという方は、購入を検討してみてください。
入出力ピンでLEDを点灯させる
では、まず初めに、Arduinoの入出力ピンを使って、以下の画像のようにLEDを点灯させる方法について説明をしたいと思います。
前回の記事では、以下の画像のような回路を作成して、LEDを点灯させました。
今回の記事では、まず上記の回路の5Vピンに差さっている部分を3番ピンに差し替えて、LEDを点灯させる方法について説明したいと思います。
空のスケッチを書き込む
回路を作成する前に、空のスケッチ(「ファイル」タブの「New Sketch」をクリックしたときに出てくる何の処理も書かれていないスケッチ)を書き込みます。
そうすることにより、前に書き込んだスケッチが、新しく作成しようとしている回路に影響を及ぼすことを防げます。
新しい回路を作成するときは、いつもこの作業をやっておくと、安全に回路を作成することができます。
もし、Arduinoボードの接続の仕方やスケッチの書き込み方が分からくなった場合は、以下のリンク先の記事で説明しているので、やり方を確認してみてください。
回路を作成する
以下の画像のような、回路をブレッドボードで作成してください。
ブレッドボードでの回路作成の際は、Arduinoの電源が入っていない状態(USBケーブルを抜いた状態)で作業をすることをお勧めします。
上記の画像のように、ブレッドボードに部品を差し込み終わったら、USBケーブルでパソコンに接続します。
この段階では、3番ピンは何も出力していないのでLEDは点灯しません。
スケッチを書き込む
LEDを点灯させるために、以下のようなスケッチを書き込んでください。
1 2 3 4 5 6 7 |
void setup() { pinMode(3,OUTPUT); } void loop() { digitalWrite(3,HIGH); } |
回路の作成とスケッチの書き込みが正しく出来ていれば、LEDが点灯します。
もし、点灯していない場合は、USBケーブルを抜き、差し込んでいるピンの位置がずれていないか、しっかりと線が奥まで差し込めているか、LEDの向きはあっているか、書き込んだスケッチが正しいかなどをもう一度確認してみてください。
スケッチの解説
上記のスケッチでは、「pinMode(3,OUTPUT)」で3番ピンを出力ピンであると指定した後に、「digitalWrite(3,HIGH)」で3番ピンの出力を「HIGH」(GNDより5V高い電位)にしています。
すると、以下の画像のように、LEDと抵抗を繋いだ線に電圧が加わるため、電流が流れLEDが点灯するという仕組みになっています。
LEDを点滅させる
上記のスケッチでは、LEDの出力を常に「HIGH」の状態にしているため、5Vピンに差し込んでいたときと、変わりがありません。
今度は、以下の動画のように、LEDを点滅させる方法について説明をしたいと思います。
スケッチを書き込む
回路は上記のまま変更せず、スケッチを以下のように変更して書き込んでください。
1 2 3 4 5 6 7 8 9 10 |
void setup() { pinMode(3,OUTPUT); } void loop() { digitalWrite(3,HIGH); delay(200); digitalWrite(3,LOW); delay(200); } |
すると、先程の動画のようにLEDが点滅するのが確認できます。
スケッチの解説
3番ピンの出力を「HIGH」にするところまでは、前のスケッチと同じです。
新しいスケッチでは、その後、「delay(200)」により、200[ms](0.2秒)待機させた後、「digitalWrite(3,LOW)」により、3番ピンを「LOW」(GNDと同じ電位(0[V])」にしています。
さらにその後、もう一度「delay(200)」により、200[ms]待機させた後、void loop()の先頭である、「digitalWrite(3,HIGH)」に戻るというのを繰り返し行っています。
スケッチを図でまとめると以下のようになります。
つまり、上記のスケッチにより、回路内では、以下の画像のように、LEDに電流を流す、LEDに電流を流さないという動作が繰り返されており、それにより、LEDが点滅するという仕組みになっています。
PWM制御でLEDの明るさを制御する
続いては、PWM制御を使うことで、以下の画像のように、LEDの明るさを制御する方法について、説明をしたいと思います。
PWM制御
「Arduino Uno R3」の入出力ピンの中には、「PWM制御」というものを扱うことができるピンがいくつか存在します。
「Arduino Uno R3」の場合は、3、5、6、9、10、11番ピンがその「PWM制御」を扱うことができ、数字の脇に「~」マークがついています。
このPWM制御を利用すると、下の画像のように、指定した割合で「HIGH」と「LOW」を高速で切り替え続ける出力を出すことができます。
ここで、1周期内にあるHIGHの時間(パルス幅)の割合をデューティー比と呼び、これをスケッチで制御することができます。
PWM制御の使い方
PWM制御に対応しているピンであれば、以下のような文を書くだけで、簡単にPWM制御を利用することができます。
1 |
analogWrite(3,15); |
上記の文の「3」と書かれているのが、出力するピンの番号、「15」と書いている部分は、デューティー比を決める数値となっています。
デューティー比を決める数値は0~255の数値を入れることができ、数値が0の場合デューティー比が0%、数値が255の場合、デューティー比が100%となるように計算されます。
つまり、デューティー比を決める数値が大きいほど、HIGHとなっている時間が長くなるということになります。
PWM制御とLED
上記の説明で、PWM制御を利用すれば、指定した割合で「HIGH」と「LOW」を切り替え続ける出力を出すことができるということは、なんとなくご理解いただけたかと思います。
ですが、その出力をLEDに使用したとしても、LEDが点滅するだけで明るさとは関係ないのではと思う方も多いのではないでしょうか。
では、実際に試してみて、LEDの明るさを確認していただこうと思います。
スケッチを書き込む
回路はそのままで、以下のようなスケッチを書き込んでください。
1 2 3 4 5 6 7 |
void setup() { pinMode(3,OUTPUT); } void loop() { analogWrite(3,15); } |
すると、不思議なことに、LEDの点灯が以前より暗くなることが確認できると思います。
スケッチの解説
上記のスケッチでは、「analogWrite(3,15)」より、PWM制御を利用して、3番ピンの出力の「HIGH」と「LOW」を高速で切り替え続けています。
つまり、LEDは点滅をしている状態になっています。
しかし、PWM制御による「HIGH」、「LOW」の切り替えはとても速いものであり、人間の目ではその点滅を追うことが出来ません。
そのため、「HIGH」の状態が長いとより明るく、短いとより暗く点灯して見えるという現象が起こります。
上記のスケッチで、LEDが暗くなることが確認いただけましたら、次はデューティー比を決める数値(上記のスケッチでは15の部分)を0~255の範囲で自由に書き換えてみてください。
数値が大きいほど明るく、数値が小さいほど暗く点灯して見えるのが確認できると思います。
LEDをぼんやりと点滅させる
続いて、以下の動画のように、LEDをぼんやりと点滅させる方法について説明したいと思います。
ぼんやりと点滅させるためには、以下の画像のように、「analogWrite」の値(デューティー比)を徐々に変化させていけば、良いと考えられますが、0~255の変化を1文ずつ書いていくのはとても大変です。
上記のように、同じような文の数値だけを変えて繰り返したいときは、以下で説明する「for文」というものを利用すると、スケッチを簡潔にまとめることができます。
for文とは
「for文」は中に書いた文を繰り返し実行する文で、使用するときは、以下のような文を記述します。
1 2 3 4 5 |
for(int i=1;i<=3;i++){ //処理1; //処理2; } //次の処理 |
for文の( )内は、左から順に、初期化処理、条件式、後処理を表しています。
上記の文では、まず初めに「int型」の変数「i」を宣言し、それに「1」という値を入れています。
次に、「i」が3以下であるかを確かめて、3以下であれば、処理1、処理2が実行されます。
そして、中身の処理が終わると、「i++」によって、「i」に1がプラスされ、もう一度、「i」が3以下であるかを確かめて、3以下であれば、処理1、処理2が実行されます。
このような、処理が条件式の「i<=3」を満たされなくなるまで、繰り返されます。
つまり、上記の文の場合は、以下の図のように、処理1と処理2が3回繰り返されることになります。
上記で出てきた「変数の宣言」と「条件式」については、以下のリンク先の記事でまとめているので、詳細が気になる方はご覧ください。
for文についての基本的な使い方については以上です。
次は、「for文」を利用して、LEDをぼんやり点滅させるスケッチについて説明をしたいと思います。
スケッチを書き込む
回路はそのままで、以下のようなスケッチを書き込んでください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { pinMode(3,OUTPUT); } void loop() { for(int i=0;i<=255;i++){ analogWrite(3,i); delay(6); } delay(200); for(int i=255;i>=0;i--){ analogWrite(3,i); delay(6); } delay(200); } |
すると、先程の動画のようにLEDがぼんやりと点滅するのが確認できます。
スケッチの解説
上記のスケッチではまず、6行目から10行目の以下の文により、LEDをゆっくりと明るくさせています。
6 7 8 9 10 |
for(int i=0;i<=255;i++){ analogWrite(3,i); delay(6); } delay(200); |
上記の文では、analogWriteのデューティー比の値に、「for文」の( )内で宣言している「i」を使用しています。
これにより、analogWriteのデューティー比の値「i」を徐々に上げていくような、処理を行っています。
上記の処理を図でまとめると以下のようになります。
上記の処理が終わった後は、11行目から15行目の以下の文により、LEDをゆっくりと暗くさせています。
11 12 13 14 15 |
for(int i=255;i>=0;i--){ analogWrite(3,i); delay(6); } delay(200); |
上記の文では、先ほどの処理とは逆に「i」を255の状態からスタートさせて、「i- -」により、「i」の値を1ずつ下げていくような処理を行っています。
上記の処理を図でまとめると以下のようになります。
よって、上記のスケッチはLEDをゆっくりと明るくしたあと、ゆっくりと暗くする処理を繰り返し行い、ぼんやりとLEDを点滅させているということになります。
複数のLEDを制御する
今までの説明では、LEDを1つしか制御してきませんでしたが、Arduinoは複数のLEDを制御することも可能です。
続いては、3番ピンと9番ピンを出力として、以下の動画のように、2つのLEDの点灯を制御する方法について説明したいと思います。
回路を作成する
3番ピンと9番ピンを使って2つのLEDを制御したい場合は、以下のような回路を作成します。
上記のように、LEDや他の部品に繋げるピンを増やしても、GNDは共通のものを使用します。
「Arduino Uno R3」には3つのGNDピンがありますが、実はそれらは内側ですべて繋がっているので共通のものとなります。
また、繋げたいLEDが2つ以上でも、同じように、入出力ピンとGNDを繋げれば制御することが可能です。
ブレッドボードを使った回路は、以下の画像のようになります。
ブレッドボードでの回路作成の際は、Arduinoの電源が入っていない状態(USBケーブルを抜いた状態)で作業をすることをお勧めします。
上記の画像のように、ブレッドボードに部品を差し込み終わったら、USBケーブルでパソコンに接続します。
もし、上記のスケッチを上書きしていない場合は、3番ピンに繋いだLEDだけが点滅している状態になっていると思います。
スケッチを書き込む
9番ピンに繋いだLEDも一緒に点滅させるために、以下のスケッチを書き込んでください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void setup() { pinMode(9,OUTPUT); pinMode(3,OUTPUT); } void loop() { digitalWrite(9,HIGH); digitalWrite(3,HIGH); delay(200); digitalWrite(9,LOW); digitalWrite(3,LOW); delay(200); digitalWrite(9,HIGH); digitalWrite(3,LOW); delay(200); digitalWrite(9,LOW); digitalWrite(3,HIGH); delay(200); } |
回路とスケッチが正しければ、先程の動画のように、2つのLEDが点滅するのが確認できます。
スケッチの解説
出力先のピンが増えただけで、やっていることは、LEDが1つの時と変わりません。
それぞれのピンは独立しているため、別々に点灯を制御することができます。
スケッチの「void loop()」を図でまとめると以下のようになります。
for文を使って複数のLEDを制御する
「for文」は「analogWrite」のデューティー比を変化させる以外にも、同じパターンの繰り返しを、行わせるときに役に立ちます。
続いては、「for文」を利用して、以下の動画のように、各LEDを交互に3回ずつ点滅させる方法について、説明したいと思います。
スケッチを書き込む
回路はそのままで、以下のようなスケッチを書き込んでください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { pinMode(9,OUTPUT); pinMode(3,OUTPUT); } void loop() { for(int j=9;j>=3;j=j-6){ for(int k=1;k<=3;k++){ digitalWrite(j,HIGH); delay(200); digitalWrite(j,LOW); delay(200); } delay(500); } } |
スケッチが正しければ、先程の動画のように、2つのLEDが交互に点滅するのが確認できます。
スケッチの解説
今回のスケッチは「for文」が2重に使われているので、少し複雑ですが、1つ1つ順番に理解すれば、全体のスケッチがどのようなものか理解することが出来ます。
それでは、「void loop()」の中身について、順番に説明していきたいと思います。
まず、上記のスケッチでは、初めにfor文内で「int型」の変数「j」を宣言し、それに「9」という値を入れています。
次に、「j」が3以上であるかを確かめて、3以上であれば中身が実行されます。
そして、中身の処理が終わると、「j=j-6」によって、「j」に6がマイナスされ、もう一度、「j」が3以上であるかを確かめて、3以上であれば、中身が実行されます。
このような、処理が条件式の「j>=3」を満たされなくなるまで、繰り返しています。
ここまでを説明をまとめると、以下の図のようにjの値を変えながら、「中のfor文の処理」と「delay(500)」が2回繰り返されることになります。
次は、「中のfor文の処理」を説明していきます。
「中のfor文の処理」では、初めに「int型」の変数「k」を宣言し、それに「1」という値を入れています。
次に、「k」が3以下であるかを確かめて、3以下であれば中身が実行されます。
そして、中身の処理が終わると、「k++」によって、「k」に1がプラスされ、もう一度、「k」が3以下であるかを確かめて、3以下であれば、中身が実行されます。
このような、処理が条件式の「k<=3」を満たされなくなるまで、繰り返されます。
つまり、「中のfor文の処理」をまとめると以下の図のように、j番ピンのLEDを3回点滅させている処理を行っているということになります。
つまり、全体のスケッチを図でまとめると以下のようになるということが分かります。
上記のスケッチについて、ご理解いただけたでしょうか。
今後「for文」などが2重、3重で使われていて、スケッチの内容が良く分からないという場面に出くわしたときは、上記のように1つ1つ順番に理解してみてください。
そうすることで、スケッチの全体がどのようなものか理解することが出来るかもしれません。
Arduinoの入出力ピンを使って、LEDの点灯を制御する方法の説明は以上となります。
終わりに
LEDの点灯を制御する方法について、ご理解いただけたでしょうか。
上記の説明をすべて理解することが出来たのであれば、LEDの点灯を自在に操ることができるはずです。
最後に、色々なパターンでLEDを点滅させるスケッチを作成いたしましたので、このスケッチを参考に、ご自身でオリジナルのスケッチを作成し、色々な点滅パターンを試してみてください。
回路はそのままで、下記のスケッチを書き込むと以下の動画のように、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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
void setup() { pinMode(9,OUTPUT); pinMode(3,OUTPUT); } void loop() { //3番と9番を同時に点滅させるパターン for(int k=1;k<=2;k++){ digitalWrite(3,HIGH); digitalWrite(9,HIGH); delay(500); digitalWrite(3,LOW); digitalWrite(9,LOW); delay(500); } for(int k=1;k<=4;k++){ digitalWrite(3,HIGH); digitalWrite(9,HIGH); delay(250); digitalWrite(3,LOW); digitalWrite(9,LOW); delay(250); } //3番と9番を交互に点滅させるパターン1 for(int j=9;j>=3;j=j-6){ delay(500); digitalWrite(j,HIGH); delay(250); digitalWrite(j,LOW); delay(250); digitalWrite(j,HIGH); delay(500); digitalWrite(j,LOW); delay(500); digitalWrite(j,HIGH); delay(500); digitalWrite(j,LOW); delay(250); digitalWrite(j,HIGH); delay(1000); digitalWrite(j,LOW); delay(250); } //3番と9番を交互に点滅させるパターン2 for(int j=9;j>=3;j=j-6){ delay(500); digitalWrite(j,HIGH); delay(250); digitalWrite(j,LOW); delay(250); digitalWrite(j,HIGH); delay(500); digitalWrite(j,LOW); delay(500); digitalWrite(j,HIGH); delay(500); digitalWrite(j,LOW); delay(250); digitalWrite(j,HIGH); delay(375); digitalWrite(j,LOW); delay(125); digitalWrite(j,HIGH); delay(125); digitalWrite(j,LOW); delay(125); digitalWrite(j,HIGH); delay(250); digitalWrite(j,LOW); delay(250); } //暗く点灯させてから、一気に明るい点灯に切り替えるパターンを繰り返す for(int k=1;k<=2;k++){ for(int j=9;j>=3;j=j-6){ analogWrite(j,15); delay(1500); digitalWrite(j,HIGH); delay(250); digitalWrite(j,LOW); delay(250); } } //交互に点滅を繰り返すスピードを速くしていき最後は両方点灯させにゆっくり消灯させる for(int k=1;k<=4;k++){ digitalWrite(9,HIGH); digitalWrite(3,LOW); delay(500); digitalWrite(9,LOW); digitalWrite(3,HIGH); delay(500); } for(int k=1;k<=4;k++){ digitalWrite(9,HIGH); digitalWrite(3,LOW); delay(250); digitalWrite(9,LOW); digitalWrite(3,HIGH); delay(250); } for(int k=1;k<=8;k++){ digitalWrite(9,HIGH); digitalWrite(3,LOW); delay(125); digitalWrite(9,LOW); digitalWrite(3,HIGH); delay(125); } digitalWrite(3,LOW); delay(500); for(int i=255;i>=0;i--){ analogWrite(9,i); analogWrite(3,i); delay(6); } //5秒待機 delay(5000); } |
上記のスケッチの「//~」はコメントというものです。
「//」の後に入力した文字は、書き込まれるスケッチには影響を及ぼさないので、スケッチにメモを残しておきたいときなどに使用されます。
次回は、Arduinoでフルカラー(RGB)LEDを制御する方法について説明したいと思います。
本記事はここまでです。ご清覧ありがとうございました。
広告
LEDや抵抗器が大量に欲しい方は以下のようなセットがおすすめです。
楽天モーションウィジェットとGoogleアドセンス広告です。
気になる商品がございましたら、チェックをしてみてください。