はじめに
このページは「マイコンLチカ道場 Arduino編」の「0-1:定間隔でLチカ」に対応するページです。
一番簡単なLチカとしてまずは動作させてみます。
回路図・接続図
ボードはArduino Uno Rev.3、LEDは今回青色のものを使います。LEDの向きがわからなくなった場合は、テスターのダイオードチェック機能を使いましょう。回路図とブレッドボードに組んだ状態のイメージは下記のようになります。
※Fritzingというソフトを使用させてもらいました。まだ使い慣れてないですが、便利そうですね。
LEDの電流制限用の抵抗値の決め方
Lチカする際にはArduinoボードやLEDの保護のため、電流を制限する抵抗を介して接続しましょう。
今回は220Ωを使いました。LEDに流れる電流は、オームの法則「V=IR」より、「I=V/R」で計算できます。
ここで、Vは抵抗に掛かる電圧なので、Aruduinoの電圧5V、青色LEDの電圧を2.9Vとすれば、5-2.9=2.1Vとなります。
よってI=(5-2.9)/220≒0.0095A、mAに直せば約9.5mAです。
LEDの電圧VFは物にもよりますが、だいたい青色・白色:3.4V@20mA、赤色:2.1V@20mAなどです。実際には20mAも流すと眩しいので、半分くらいにしています。その時のVFはデータシートのIF-VF特性というグラフを参考にしましょう。ただ、秋月で売っているLEDのデータシートを確認してみたら、意外とIF-VF特性を載せてくれているものが少ないですね・・・
そこで、参考までに今回使う青色LEDの特性を測ってみたものを載せておきます。これにより、IF=10mA時はVFは約2.9Vなことがわかりますね。
IF(mA) | VF(V) No.1 | VF(V) No.2 | VF(V) No.3 | VF(V) AVE |
0.1 | 2.415 | 2.459 | 2.415 | 2.430 |
1 | 2.577 | 2.610 | 2.575 | 2.587 |
2 | 2.640 | 2.684 | 2.639 | 2.654 |
3 | 2.686 | 2.739 | 2.688 | 2.704 |
5 | 2.760 | 2.825 | 2.761 | 2.782 |
10 | 2.902 | 2.990 | 2.904 | 2.932 |
15 | 3.016 | 3.117 | 3.021 | 3.051 |
20 | 3.120 | 3.219 | 3.125 | 3.155 |
今回のLEDは5mAも流せば十分眩しいことと、LEDのVFやArduinoの電源5V、抵抗自体にも誤差がありますので、電流値はギリギリ20mAを狙わずに10mAとしています。
Lチカのプログラムを書いてみる
ボード上のLEDのLチカ
やっとですが、Lチカのプログラムを書いてみましょう。といっても、ここでは、Arduino IDEで「ファイル⇒スケッチ例⇒01.Basics⇒Blink」を選択して、サンプルプログラムを呼び出します。簡単にスケッチ例が見れるのが素晴らしいですね。これを、自分用に名前を付けて保存して、編集していきます。
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
このままでも、もちろん動きますが、標準で書いてある「LED_BUILTIN」はボード上のLEDを指定しています。なので、このまま動かすと、ボード上のLEDがLチカします。
Arduino Uno ではLED_BUILTINは13番ピンのことを示しているようです。ボードが変わってもそのままのプログラムでLチカ出来るような配慮でしょうか。「LED_BUILTIN」を「13」に書き換えても同様に動くはずなので、試してみましょう。(3箇所あります)
外付けLEDのLチカ
本題の外付けLEDをLチカさせるプログラムに変更してみましょう。といっても、このLED_BUILTINのピン番号をLEDを接続したピン番号に変更するだけです。(ここでは、12)
変更してみたら、実際に動作させてみましょう。
void setup() {
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(12, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(12, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
ちゃんと一秒間隔でLチカすることが確認できました!
この時のLED両端の電圧波形をオシロスコープで見てみました。一秒間隔で、波形が動いていることが確認できます。この時のONになっている部分の電圧が、LEDのVFになります。予め測定したとおり、ちゃんと2.9ボルトあたりですね。
点滅間隔の変更・パルス駆動について
プログラム中のdelay(1000)は、1000ms(1秒)ウェイトを掛けるという意味です。
ここを(100)など、好きな数字に変えるとLチカの周期を変えられるので試してみましょう。
LEDのパルス駆動について:LEDのデータシートをみると、せん頭順電流(Pulse Forward Current)という項目で、通常より大きな電流値を流しても良いように書いてあります。
※パルス幅10ms、Duty比1/10などの注記があると思います。10ms周期に対してのON時間が1msという意味なのか、ON時間が10ms(100ms周期)なのかは正確な解釈がわかりませんが・・・
また、絶対最大定格(Absolute Maximum Rating)はこれを超えて使ったらいつ壊れても知らねーぞ、という値なので注意しましょう。
これを守れば、通常よりも大きめに電流を流しても壊れないってこと?そして省エネで明るく見える?ということで、試してみました。
結果は、ON時間が10ms(100ms周期)では点滅が明らかに目で分かります。ON時間を1ms(10ms周期)にすると、流石に連続して点灯しているように見えます。抵抗を220Ωから100Ωに変えて約20mAに変えてみましたが、10mA連続点灯よりは少しだけ暗いかな?って感じです。
その時のプログラムを下記に載せておきます。
void setup() {
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(12, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1); // wait for a second
digitalWrite(12, LOW); // turn the LED off by making the voltage LOW
delay(9); // wait for a second
}
20mAのDuty比1/10なので、平均2mAで10mAとほぼ同等の明るさということになります。省エネですね。
まとめ
初歩の単純なLチカですが、Arduinoだとサンプルスケッチの助けもあり、かなり簡単にLチカさせることが出来ました。引き続き難しいLチカに挑戦していきましょう。