11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【Arduino入門編②】複数のLEDを点滅(Lチカ)させてみる!デジタル出力の解説その②

前回、Arduino UNOを使いボードに搭載されたLED(ビルトインされたLED)を点滅させてみました。

【Arduino入門編①】ArduinoでLEDを点滅(Lチカ)させてみる!Arduinoの基本となるデジタル出力の解説その①

今回はその復讐&応用としてデジタル入出力ピン(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を接続しています。)

前回出てきた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を交互に点滅させてみたいと思います。

今回は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関数を使ってデジタルピンを出力に設定しています。
これまでと違うのは、直接ピン番号を指定するのではなく変数を使っている点ですね!

そしてdigitalWrite関数で2つのLEDの点灯・消灯を入れ替えて点滅させています。
こちらでもdigitalWrite関数内で変数を使ってピン番号を指定しています。

Arduinoにスケッチを書き込み実行すると2つのLEDが交互に点灯する動作が確認できます。
あとは変数の数字を変更し他のデジタルピンでも同様に動作確認していただければと思います。

アナログ入力ピンはデジタル出力ピンとしても使える!

これまでデジタル入出力ピン(D0~D13)をpinMode関数を使い出力(OUTPUT)に設定してLEDを接続して点滅させてきました。

Arduino UNOにはこの14本のデジタル入出力ピン以外にもアナログ入力ピン(A0~A5)が6本あります。(アナログピンは入力のみ)

こちらはまだ詳しくご紹介していないのですが、これまで使ってきたデジタルピンではHIGH(5V)かLOW(0V)しか扱うことが出来ませんでした。

こちらのアナログ入力ピンを使えばジョイスティック(可変抵抗)などのアナログ値の読み取りなどができます。
このアナログ入力に関してはまた今後詳しくご紹介できたらと思います。

そして実はこのアナログ入力ピンはデジタル出力として使う事も出来ます

MEMO
アナログ出力(PWM)もありますが、ここで紹介すると話が少しややこしくなるので別機会に詳しくご紹介出来たらと思います。

試しにやってみましょう。
上記で使ったスケッチと回路を少し変更ることにより確認できます。

まずはArduinoに繋がれているLEDの配線をアナログ入力ピンに入れ替えます。
アナログ入力ピンはA0~A5までの6本ありどのピンを使ってもいいのですが、今回はA0ピンとA5ピンにLEDを繋いでみましょう。
こんな感じですね。

あとはスケッチも少し修正しましょう。
先程使ったスケッチ内のLED_PIN1とLED_PIN2変数の値を変更することにより確認できます。
LED_PIN1変数にA0をLED_PIN2変数にA5を代入します。
変更はこれだけです。
やはり変数を使っていると変更の際の手間が少なくてすみますね!

スケッチを書き込むとLEDが交互に点灯します。

アナログ入力ピンを使ってこれまでのデジタル入出力ピン同様にデジタル出力ができました。

MEMO
デジタル入出力ピンの場合はピン番号は0~13までの数字で指定しましたが、アナログ入力ピンを使う場合はA0~A5と指定します。
また次の項目で説明しますがこのA0~A5は、14~19という数字に置き換えることも出来ます。

デジタルピン&アナログピンを使い20個のLEDを点滅させてみる

上記によりアナログピンもデジタル出力で使う事が出来ることが分かりました。

それでは最後にArduino UNOにあるデジタル入出力ピン(D0~D13)までの14本、そしてアナログ入力ピン(A0~A5)までの6本の計20本のピンを使い20個のLEDを同時に制御してみたいと思います。

回路はこれまでと同様に各ピンに抵抗を介してLEDを接続しているだけの単純な回路ですが、さすがに20回線となるとかなり配線が大変です。

実際はこれだけの入出力ピンを同時に使ってしまうとその他センサーやモーターなど接続できる余地が無いので好ましくありません。
I2C通信やシフトレジスタなどを使いArduinoに接続するピンの本数を減らしたりしますが・・・今回はテストという事でやってみましょう。

こちらのスケッチを使います。

まずばsetup関数内でpinMode関数を使い各ピンをデジタル出力出来る状態にします。
これまでのようにpinMode(0, OUTPUT)、pinMode(1, OUTPUT)・・・とやってもいいのですが大変なのでfor関数を使ってやっています。

制御文 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:設定したいピンの番号
mode:入力として使いたい場合「INPUT」、出力として使いたい場合は「OUTPUT」と記載。


【例】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秒停止させる。
intintは整数型の変数の宣言で使われ、数字の記憶に最も使われる宣言方法。【例】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足歩行などのロボットみたいな動くものが作りたくなりますよね!

何かワクワクしますが・・・
でも、少しその気持ちを抑えて基本から少しずつやっていきましょう。
という事で今回はこのへんで・・・。

その他 Arduino入門編 記事一覧
【Arduino入門編㉛】INA219モジュールで電圧・電流を計測する基本的な方法! 【Arduino入門編㉚】マイコンのデジタル端子(I/O)不足を解消!『I/Oエキスパンダー(MCP23017)』の基本的な使い方! 【Arduino入門編㉙】SPI通信の基礎知識!SPIで使われる信号線や接続方法などについて! 【Arduino入門編㉘】ソフトウェアシリアルを使ってみる! 【Arduino入門編㉗】赤外線(IR)モジュールを使いリモコンの信号を読み取り送受信する方法! 【Arduino入門編㉖】UARTシリアル通信の基礎知識!Arduino間でのデータのやり取りなどをやってみる! 【Arduino入門編㉕】ステッピングモーターを動かしその基礎を理解する!(28BYJ-48 & ULN2003) 【Arduino入門編㉔】Arduinoで7セグメントLEDを制御してみよう!(スタティック制御 / ダイナミック制御) 【Arduino入門編㉓】PCA9685 16チャンネルPWMサーボモータードライバを使って複数のサーボモーターを同時に制御してみる!(最大16台) 【Arduino入門編㉒】ArduinoでDCモーターを制御する。【L298Nデュアルモータードライバ】 【Arduino入門編㉑】温湿度センサー(DHT11)を使い温度と湿度を計測する! 【Arduino入門編⑳】Arduino Uno R3ボードのピン配列&基本機能まとめ! 【Arduino入門編⑲】RTC(リアルタイムクロック)モジュールDS3231を使いシンプルな時計を作る![I2C通信] 【Arduino入門編⑱】I2C通信の基礎!LCDディスプレイに文字を表示させてみる![後編] 【Arduino入門編⑰】LCDディスプレイに文字を表示させてみる![前編][1602 LCDモジュール] 【Arduino入門編⑯】サーボモーターをジョイスティックやシリアルモニタから動かしてみる! 【Arduino入門編⑮】Arduino Unoへの電力供給(外部電源)および電源出力端子の使い方!【追記】 【Arduino入門編⑭】センサーシールド(Sensor Shield)を使ってみる! 【Arduino入門編⑬】テスト環境に便利!Arduino拡張ボード(シールド)プロトタイプシールドを使ってみる! 【Arduino入門編⑫】光センサー(Cdsセル)をアナログ入力ポートで読み取り制御に使ってみる!

1 COMMENT

コメントを残す