[電子工作入門] Arduinoを使ってLEDを制御する

電子工作

皆さん,こんにちは.
おかしょです.

前回の記事ではブレッドボードを使って,LEDを点灯させるということをやりました.
これによってブレッドボードの使い方や回路の組み方がわかったかと思います.

そして,今回は点灯させるだけではなく,LEDを点滅させたり,明るさの制御をArduinoを使って行います.

この記事を読むと,以下のようなことがわかる・できるようになります.

  • LEDの点滅をさせるプログラム
  • LEDの明るさを制御する方法
  • イルミネーションを作る方法

 

この記事を読む前に

この記事ではブレッドボードとLEDを使います.電子回路はブレッドボードを使って組むので,ブレッドボードの使い方を知っている必要があります.

また,LEDを使用するには抵抗器を使って流れる電流を押さえなければなりません.そのための抵抗値の計算方法なども知っておかなければ,以下で解説していることを安全に行うことができないので,以下の記事をまず読むようにしてください.

 

必要なもの

今回は以下のものを使用します.

  • Arduino基板(ここではUnoを使用)
  • LED(複数個)
  • 抵抗器
  • ブレッドボード
  • ジャンパー線
  • 乾電池(9V)
  • バッテリースナップ

この中の下の二つはなくても大丈夫です.ただ,この二つがあれば,ArduinoをパソコンとつながなくてもLEDを点灯させることができるようになります.

Arduinoのデータシートを見ると,DCジャックから電源を供給する場合は入力電圧の推奨値が7~12 Vとなっています.DCジャックというのはArduino基板上にある黒くて丸い穴が開いている部品になります.そこに電源を供給することで,Arduino単体で動作させることが可能になります.しかし,プログラムを書き込んだりする際にはパソコンと接続しなければならないので,そこだけは勘違いしないようにしてください.

この時,電池とArduinoのDCジャックとを接続するのが,バッテリ―スナップです.これは図の上の方にある赤と黒の線に黒いコネクターが取り付けられた部品になります.

これらがあれば,わずらわしいUSBケーブルから解放されるので,あると便利だと思います.ロボットを作って自由に動き回れるようにしたいときなどは必須のものとなるので,買っておいて損はないと思います.

購入は秋月電子通商などでするとよいでしょう.

ブレッドボードなどのそのほかの部品がよくわからない方は前回の記事を参照してみてください.

 

回路を組む

それでは電子回路を組んでみましょう.今回は3個のLEDを制御します.前回の記事で作成した回路を基に,LEDを3つ点灯させることのできる回路を組みます.以下のような電子回路にすると問題なく動作させることができます.

回路図

上の図のSWITCHは実際には存在しませんが,ArduinoがこのSWITCHのような役割をします.つまり,ArduinoでこのSWITCHをONにしたり,OFFにしたりすることでLEDを点灯させることができます.

実際に組んだものが左の写真になります.

抵抗の大きさの決定方法は前回の記事で詳しく書いているので,そちらを参考にして決定してください.

 

プログラムを書く

それではLEDを制御するためのプログラムを書いていきます.今回は以下のようなプログラムを作成しました.

  1. LEDを点滅させる
  2. LEDの明るさを調整する
  3. LEDにさまざまな光り方をさせる

それでは一つずつ実際に書いたプログラムを見ながら解説していきます.

 

LEDを点滅させる

プログラムは以下のものを使用しました.

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {
  digitalWrite(4, LOW);
  digitalWrite(2, HIGH);
  delay(1000);

  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
  delay(1000);

  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  delay(1000);
}

Arduinoではsetup関数とloop関数を基盤としてプログラムを書いていきます.
最初のsetup関数では初期設定のような一度だけ実行されればよいプログラムを書きます.
loop関数では繰り返し実行したいプログラムを書きます.

今回のプログラムではsetup関数でArduino基板上のpinのモード設定を行っています.

pinMode(2, OUTPUT);

このコマンドでnumberで指定した番号のpinを出力もしくは入力として使えるように設定します.カンマの後にOUTPUTと入れれば出力として,INPUTと入れれば入力として使えるようになります.今回のようにLEDに電気を流したい場合は出力として利用するのでOUTPUTと書きます.INPUTと書くのはセンサなどのデータを読み込んだりするときです.

上記のプログラムでは2, 3, 4番目のpinをそれぞれ出力として設定しています.

次にloop関数では繰り返し実行されるプログラムを書きます.今回はLEDを点滅させたいので,LEDを点灯させたり,消灯させたりします.

ここで使用しているコマンドは以下のものです.

  digitalWrite(2, HIGH);
  delay(1000);

digitalWrite(2, HIGH)ではpin番号2番をHIGHにすることができます.つまり,2番のpinから5vを出力し,LEDを点灯させます.この時,HIGHと書かれているところをLOWにすれば0v,つまり電気が流れなくなりLEDは消灯します.

digitalWriteに続いて書かれているdelay(1000)では1000ms次のプログラムを遅らせることができます.msは1秒の1/1000なので,1000msで1秒という意味になります.

つまり,このプログラムでは2番pinとつながっているLEDが点灯し,

1秒後に消灯すると同時に3番pinにつながったLEDが点灯,

また1秒後に3番のLEDが消灯し,それと同時に4番のLEDが点灯するというのを繰り返します.

単純な光り方ですが,実際に光らせるときれいに見えるものなので,ぜひやってみてください.

 

LEDの明るさを調整する(その1)

LEDを点滅させることができたので,次は明るさを調整します.

この時に使用したプログラムは以下のものになります.基本的には先程のものを応用するとできます.

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
}

void loop() {
  digitalWrite(3, HIGH);
  digitalWrite(2, HIGH);
  delay(10);
  digitalWrite(2, LOW);
  delay(10);
}

ここでは二つのLEDしか使わないのでsetup関数は2番と3番のみ設定しています.

loop関数内で使っているコマンドは先ほどと同じなので,どのようなプログラムなのかはわかるかと思います.

3番と2番のLEDを点灯させ,10ms待ったら2番のLEDを消灯させるというのを繰り返します.なので,3番のLEDは点灯したままになります.

LEDの明るさ調整 (digitalWrite)

実際に実行してみると上の写真のように,真ん中のLEDと右側のLEDで明るさが異なっているのが確認できます.

ここでは違う色のLEDで試しにやってみましたが,同じ色のLEDを使った方が明るさの違いが分かりやすくなるかと思います.

さて,このようにすることで明るさの調整ができるのはわかりましたが,なぜこうなるのでしょうか.その理由について解説していこうと思います.

皆さんはPWMという言葉を聞いたことがあるでしょうか.

PWMとはpulse width modulationの略で出力される電圧の波形を制御することを言います.この波形というのは出力電圧のONとOFFによって作られるもので,ONにする時間やOFFにする時間を調整することで,ONとOFFの間の電圧を表現することができます.

例えば,ONとOFFの時間が同じだった場合,出力される電圧はONの時の半分の電圧と同じように出力されます.実際に半分の電圧が出力されるわけではないので注意してください.

このようにONとOFFの時間間隔を調整することによってLEDの明るさを調整することができます.なので,今回のプログラムのLOWにした後のdelayコマンドの()の中の数字を大きくすればLEDは暗くなり,反対にHIGHにした後のdelayコマンドの()の中の数字を大きくすればLEDは明るくなります.

実際にやって確かめてみれば,理解できるかと思います.

 

LEDの明るさを調整する(その2)

さて,先程のプログラムでPWM制御をすることでLEDの明るさを調整できることがわかりました.

しかし,delayの()の中の数字をいくつにしたらどの程度の明るさでLEDを光らせることができるのかイメージができません.そのため,明るさを自由自在に制御することができません.

そんな時に使えるコマンドがanalogWriteです.

まずは実際に使ったプログラムを見てみましょう.

int i;

void setup() {
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop() {
  for(i=0;i<=80;i=i+1)
  {
    analogWrite(3, i);
    analogWrite(5, i*2);
    analogWrite(6, i*3);
    delay(10);
  }
}

まず,setup関数内でそれぞれのpinの設定を行います.

ここで,先程とは違うことにお気づきでしょうか.

設定しているpinの番号が違います.

これはanalogWriteのコマンドが使えるpinと使えないpinがあるためです.Arduino Unoの場合は基板上に波線”~”が書かれているpinがanalog出力ができるピンです.今回は3, 5, 6番のpinを使いました.

次にloop関数を見ていきます.loop関数ではfor文という文法を使って変数iを更新していきます.

このfor文はプログラムを繰り返し実行したいときに使用します.for文の()の中の式を制御式と呼び,この制御式を満足している間for文の{}の中身を繰り返します.

()で囲われている制御式はカンマで3つに区切られます.まず一つ目の式で初期値を設定します.二つ目の式では範囲を指定します.この範囲を満足している間はfor文が実行されます.そして3つ目で更新式が定義されます.

つまり,今回のプログラムではiという変数が最初0で与えられます.そしてiが80以下の間はfor文を繰り返され,繰り返すたびにiが1ずつ増えていきます.この3つ目の式を忘れるとfor文から抜け出せず,iの値も変化しないので忘れないようにしてください.

そして,もう一つ注意することがこのiという変数です.プログラムを書く際に使用する文字は基本的に最初に宣言をしなければいけません.このプログラムではsetup関数の上で

int i;

と宣言しています.これによってiはint型で宣言されて,プログラム内で使うことができるようになります.int型というのは整数型のことで,今回はiは整数としてしか使わないので,この型で宣言しました.

さて,説明が長くなりましたが,最後にfor文の中身,{}の中を見てみましょう.

新たに,analogWriteというコマンドがあります.このコマンドによって,指定した番号のpinから指定した数値の出力がされます.今回は出力される数値をiを使って指定し,変化するようにしています.この時に指定する数値は0から255までですので,それを超えたり,下回ったりしないようにしてください.

そして最後にdelayコマンドで遅らせるのも忘れないでください.これを忘れると,iが高速に変化していき,明るさの変化が目で追えないので気を付けてください.

このプログラムを実行することで,LEDが明るくなる速さや最終的な明るさがそれぞれ違うことが確認できるかと思います.

 

イルミネーションを作ってみる

さて,Arduinoを使ったLEDの制御の仕方は以上になります.今回,使用したプログラムを組み合わせていろいろな光らせ方をしたり,LEDの数を増やすことでイルミネーション作品も作ることができます.

参考までにいろいろな光らせ方をするプログラムを以下に貼っておくので参考にしてみてください.

int i;
void setup() {
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop() {
  for(i=0;i<=3;i=i+1)
  {
    digitalWrite(3, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    delay(100);
    digitalWrite(3, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    delay(100);
  }
  for(i=0;i<=3;i=i+1)
  {
    digitalWrite(3, HIGH);
    delay(100);
    digitalWrite(3, LOW);
    digitalWrite(5, HIGH);
    delay(100);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    delay(100);
    digitalWrite(6, LOW);
  }
  for(i=0;i<=3;i=i+1)
  {
    digitalWrite(3, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    delay(200);
    digitalWrite(3, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    delay(200);
  }
  digitalWrite(3, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  for(i=0;i<=255;i=i+17)
  {
    analogWrite(3, i);
    delay(10);
  }
  for(i=255;i>=0;i=i-17)
  {
    analogWrite(3, i);
    delay(10);
  }
  for(i=0;i<=255;i=i+17)
  {
    analogWrite(5, i);
    delay(10);
  }
  for(i=255;i>=0;i=i-17)
  {
    analogWrite(5, i);
    delay(10);
  }
  for(i=0;i<=255;i=i+17)
  {
    analogWrite(6, i);
    delay(10);
  }
  for(i=255;i>=0;i=i-17)
  {
    analogWrite(6, i);
    delay(10);
  }
}

 

まとめ

この記事ではArduinoを使ったLEDの点滅や明るさの制御方法を解説しました.

ただのLEDですが,この記事に書かれていることを応用した作品がYouTubeにたくさん公開されていますので,そちらもご覧になって,作ってみると面白いと思います.

私も,いつか作ってこのブログで紹介できたらなと考えています.

 

続けて読む

この記事で電子工作入門のLED編は終了となります.

次はArduinoと通信をしてみます.その方法については以下で解説しているので,読んでみてください.

それでは,最後まで読んでいただきありがとうございました.

Twitterをやっているので,良ければフォローお願いします.
Twitterでは記事の更新情報や活動の進捗などを気ままにつぶやいています.

コメント

タイトルとURLをコピーしました