Arduinoで電子制御② もっとLチカ!複数のLEDを操る

数を増やしてみよう

前回の記事で基本的なLチカが実現しました。

【はじめの】プログラミング初心者がArduinoマイコンを使ってLEDを点滅させるための手引き【一歩】

そこで今度は、複数のLEDをArduinoで制御してみましょう。ちょっとした応用です。

LED2個でチカチカ

まずはLEDを2つ使って、マルチバイブレータのような動作をさせてみましょう。マルチバイブレータはマイコンを使わない電子工作でよく出てくる回路で、簡単にいうと二つのLEDを交互に光らせるような回路です。それではいってみましょう!

配線

Lチカ2_ブレッドボード

このようにLEDを2つ接続します。前回の配線図とGNDのつなぎ方が違うけど、このようなつなぎ方をして配線の数を節約するのがブレッドボードの基本です。見た目もわかりやすいですね。この配線ではArduinoの12、13番ピンにLEDを接続しましたが、DIGITALと書いてあるピンであれば0~13番までどこにつないでも問題ありません。

※0番と1番ピンには特別な役割があるので、ここは使わないで開けておく癖をつけた方がいいかもしれません。

ともかく重要なことは、自分がLEDを接続したピン番号を把握しておくことです。今回は12,13番に接続しています。

使用した部品
ブレッドボード1個
LED2個
抵抗(220Ω)2個
ジャンパー腺数本

スケッチ

配線できたら、今度はスケッチを作りましょう。必要な命令は前回と同じで、数が2つに増えるだけなので簡単です。

void setup(){
  pinMode(12,OUTPUT);    //12番ピンを出力に設定
  pinMode(13,OUTPUT);    //13番ピンを出力に設定
}

void loop(){
  digitalWrite(12,HIGH);  //12番のLEDを点灯
  digitalWrite(13,LOW);   //13番のLEDを消灯
  delay(100);         //100ミリ秒待機
  digitalWrite(12,LOW);   //12番のLEDを消灯
  digitalWrite(13,HIGH);  //13番のLEDを点灯
  delay(100);         //100ミリ秒待機
}

こんな感じになります。今回は13番ピンに加えて12番ピンも使用しているので、pinModeの設定もそれぞれに対して必要です。慣れてくるほど忘れがちです。2つのLEDを交互に点滅させたいので、loop関数内でピン番号とHIGH、LOWを交互に入れ替えて実現。ん?よくわからない?では一行ずつみてみましょう。

digitalWrite(12,HIGH); は「12番ピンからデジタル信号を出力します」という意味。ここで12番ピンのLEDが点灯します。

digitalWrite(13,LOW); は「13番ピンのデジタル信号を止めます」という意味。元々止まってるのでLEDは変化しません。(スケッチが繰り返されたときに13番のLEDを消灯させるための命令です)

delay(100); は「100ミリ秒待ちます」という意味。

digitalWrite(12,LOW); は「12番ピンのデジタル信号を止めます」という意味。先ほど点けた12番ピンのLEDが消灯します。

digitalWrite(13,HIGH); は「13番ピンからデジタル信号を出力します」という意味。ここで13番ピンのLEDが点灯です。

delay(100); で100ミリ秒待って、また最初から繰り返し。

余談

Arduinoに限らずプログラム言語は通常上の行から順番に処理されていきます。なので厳密には「12番ピンのLEDを消してから13番ピンのLEDを点灯」といった動作をしているのだけど、マイコンの処理速度は非常に高速だから、ほとんど同時と考えます。電子制御の世界で完全にタイミングを合わせようとするととても難しい話になってしまうので、ここではこれでいいことにするのです。

LED4個でチカチカ

LED2つで交互点滅できたので、調子に乗って4個に増やしてみましょう。

配線

Lチカ4_ブレッドボード
LED4個

先ほどと同じ要領でOK。今度はArduinoの10~13番ピンにLEDを接続しました。端から順番に点灯させていくようなスケッチを作ってみましょう。

スケッチ

void setup(){
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
}

void loop(){
  digitalWrite(10,HIGH);
  delay(1000);
  digitalWrite(11,HIGH);
  delay(1000);
  digitalWrite(12,HIGH);
  delay(1000);
  digitalWrite(13,HIGH);
  delay(1000);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);
  delay(1000);
}

だんだんスケッチが長くなって来ました。でもやってることは基本的に同じです。4つのピンを使っているから、pinModeの設定も4つ。このスケッチを実行すると、右端のLEDから順番に点灯していき、4つ点灯したら全部消えてまた右端から、という動作をするはず。もう解説がなくてもわかりますね。

気になること

LEDが4つになってくると、「あれ、何番ピンにどのLEDをつないだっけ?」という事態が稀に非常に良くあります。本当にあります。これが意外とイラつく原因に。そんなときは、こんな技を使うといいかもしれません。

#define LED1 10
#define LED2 11
#define LED3 12
#define LED4 13

void setup(){
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);
  pinMode(LED4,OUTPUT);
}

void loop(){
  digitalWrite(LED1,HIGH);
  delay(1000);
  digitalWrite(LED2,HIGH);
  delay(1000);
  digitalWrite(LED3,HIGH);
  delay(1000);
  digitalWrite(LED4,HIGH);
  delay(1000);
  digitalWrite(LED1,LOW);
  digitalWrite(LED2,LOW);
  digitalWrite(LED3,LOW);
  digitalWrite(LED4,LOW);
  delay(1000);
}

先頭に見慣れない4行を追加しました。

#define LED1 10 は、「プログラム中の”LED1”という文字列を”10”と定義する」という意味です。急に難しくなった感じがするかもしれませんが、なんてことはありません。

簡単にいうと、「LED1=10」 ということです。

もっと簡単にいうと、「10番ピンに”LED1”という名前を付ける」ということになります。

これをやっておけば、右端のLEDは何番ピンだっけ?といちいち配線を確認する必要がなくなります。

まとめ

複数のLEDを制御する場合も、基本的な考え方は一つのときと同じ

pinModeの設定は、使ってるピンの数だけ必要

#defineを用いると、ピン番号に名前を付けることができる

Arduino UNOには13個のデジタルピンがあるから、今回の方法で最大13個のLEDを一気に制御できるはず!やった!Yeah!!

次回はLEDの”明るさ”を制御する方法を紹介します。

Arduino UNOはAmazonでも買えます。

最初に買う参考書ならこちらがおススメ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です