はじめてマイコン・ボードArduinoを使ってみる(5)
■動作確認をするためにLEDの点滅を行う
今回は、Arduinoのディジタル出力ポートにLEDを接続し、Arduinoのプログラムで点滅の間隔を自由に変更できることを確認します。
●LEDのリードの長さ
今、電子工作でよく利用されているLEDは、次に示すような2本のリードを持っています。このリードに直流の電圧を加え発光させます。
リードの長いほうにプラスの電源、短いリードにはマイナスの電源を接続します。電源の接続を反対にすると電流は流れず発光しません。
リード線は「足」ともいいます。
ブレッドボードに差し込むには足が長すぎるので、次のように足を短くします。しかし足を短くしてもプラス、マイナスの区別がつくように長さに差をつけておきます。抵抗の足も切り、ブレッドボードに差し込みやすいように曲げておきます。
ブレッドボードにLEDと、LEDのプラス側に抵抗を接続しセットします。
抵抗のLEDと接続されていないほうのリードとディジタル・ポート11をジャンパ線で接続し、LEDのマイナス側のリードとArduinoUnoのGNDとをもう1本のジャンパ線で接続します。
LED、抵抗、ジャンパ線の具体的な接続を次に示します。
LEDの短いほうのマイナス側のリードと茶色いジャンパ線を接続します。抵抗はLEDのプラス側に接続されていますので抵抗に接続されている黄色のジャンパ線がプラスの電圧になるとLEDに電流が流れ、LEDが点灯します。
●ArduinoUno側のジャンパ線の接続
黄色のジャンパ線はArduinoUnoのディジタル・ポート11に接続されています。茶色のジャンパ線はGNDのピン・ソケットに接続されています。
●LEDに直列に接続されている抵抗
LEDに直列に接続されている抵抗は「電流制限抵抗」と呼ばれるもので、LEDに流れる電流が過大にならないようにする役割をもっています。LED(発光ダイオード)はダイオードと同じように電流が流れる方向が決まっていて、一方向へしか電流は流れません。電源を逆に接続すると電流が流れない極性を持っています。ただし、逆方向の電圧に対する耐性が低くダイオードのような整流用途には向きません。
◆ある電圧を超えると急激に電流が増大する
電流が流れる方向であっても低い電圧ではほとんど電流は流れず、LEDの種類によって異なりますが、
- 赤色のLEDで1.7V前後から
- 白色のLEDでは3V前後から
急激に電流が増大します。そのため、LEDの点灯のために加える電流をLEDに加える電圧だけで制御するのは困難です。
LEDに加える電圧を、抵抗を介して電流に変換して、電流を制御する方法でLEDの点灯を制御します。
◆電流制限抵抗で安定した電流の供給
電流制限抵抗の抵抗値をR、抵抗に流れる電流をIとすると抵抗の電圧降下はオームの法則によりR×Iとなります。電流制限抵抗に流れる電流とLEDに流れる電流は同じになります。このiの電流が流れるときのLEDに加わる両端の電圧をVfとして、回路に加わる電源電圧をVccとすると、次に示すようにVccは抵抗の電圧降下とVfの和になります。
Vcc = R × I + Vf |
回路に流れる電流が少なくなると抵抗の電圧降下が少なくなり、LEDに加わる電圧が増加し、流れる電流が増加します。回路に流れる電流が増加すると抵抗の電圧降下が増加し、LEDに加わる電圧Vfが小さくなり流れる電流も減少します。このように、電流制限抵抗により自動的にLEDに流れる電流が一定の値になるように制御されます。
●LEDの点滅プログラムのサンプル・プログラムBlink.ins
ArduinoIDEに多くのサンプル・プログラム(スケッチ)が用意されています。サンプル・プログラムは、次に示すように、メニュー・バーの
ファイル>スケッチの例
でサンプルのリストが表示されます。このリストから01.Basicsを選択し、次に表示されるリストからBlinkを選択します。
次に示すようにプログラム(スケッチ)Blinkが読み込まれます。
●プログラムBlinkの中身
Blinkのプログラムには次のようことが記述されています。最初の
/* から */ の間に記述されていることはコメントとなり、Arduinoのプログラムの説明が書かれています。
/* Most Arduinos have an on-board LED you can control. On the Uno and This example code is in the public domain. modified 8 May 2014 |
ここまでは/* ~ */ のコメントです。次の//で始まる1行もコメントです。// があると、行末までこの文字の右側の記述はコメントとなります。命令の後に // 以降の命令の説明を追加できます。
// the setup function runs once when you press reset or power the board
このvoid setup()関数は必須の関数でプログラムの開始時に一度だけ実行されます。処理の内容は{ }中に記述します。
void setup() { |
このsetup()関数の中では、 pinMode(13, OUTPUT); でディジタル・ポート13を出力ポートOUTPUTに設定しています。各命令の終わりには ; が必須です。
次に示すvoid loop()関数がメインのプログラムで、この内容が繰り返し実行されます。
// the loop function runs over and over again forever |
このdigitalWrite(13, HIGH); で13で示したディジタル出力ポートの出力をHIGHの電源電圧に近い高い電圧の出力にします。ArduinoUnoの場合、出力をHIGHにした場合、20mAくらいまでの電流を外部へ供給できます。
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) |
次のdeley(1000)は、かっこの中にms単位の待ち時間を設定して、指定した時間何もせずに待ちます。この場合は、LEDがこの待ち時間分点灯します。
delay(1000); // wait for a second |
次のdigitalWrite(13, LOW); では出力をLOWにして、LEDへの電力の供給を停止し消灯します。
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW |
また、delay(1000)で1000ms(1秒)間消灯状態を続けます
delay(1000); // wait for a second |
この後、loop()関数内の最初の命令に戻り、プログラムの実行を繰り返します。
} |
●Arduinoのプログラム言語
Arduinoのプログラム言語はメニュー・バーの
ヘルプ>リファレンス
を選択するとプログラムで利用できる命令、データなどを一覧できるウインドウが表示されます。知りたい項目をクリックすると命令の使用方法やデータの詳しい説明のページとなります。
Arduinoのヘルプからは英文のページしか表示されませんが、Arduinoのドキュメントを翻訳したサイトがあります。Arduino 日本語で検索すると見つかります。
次回、このプログラムをどのように実行するのか、実行した結果どうなるか、LEDを接続したのはディジタル・ポート11に接続したが、このプログラムではディジタル・ポートが13になっているのはなぜなのかのお話をします。
(2016/1/2 V1.0)
<神崎康宏>
バックグラウンド
切る;電子工作で一番利用する機会が多い工具がニッパです。100円ショップでも手に入りますが、刃先がずれていたり、多くは、太い線を切る目的の大型の製品が多いようです。
料理人の方が自分専用の包丁を持つように、ぜひ、自分にとって使いやすくて切れの良いニッパを入手してください。高くても千円台です。GND;グラウンドと読みます。groundの省略形ですから、大地という意味ですが、電子回路の多くは基準になる電位という意味で使います。例外もありますが、電子工作で出てくる回路では電源のマイナス側に相当します。
ディジタル・ポート11;Arduinoでは、マイコンのI/Oポートの役割を決めています。次の写真のように、Arduinoでは、11番はディジタルI/Oに決まっています。
マイコンにかぎらず、コンピュータはいろいろな用途に使えるように、機能が満載されています。搭載された機能のわりには、物理的なパッケージには大きさと端子の数に限りがあります。なので、一つの端子には複数の機能が割り当てられていて、利用者が、その中から、何に使いたいかをプログラムの中で指定します。
けれど、そのためには、マイコンの機能を説明したデータシートを読まなければなりません。数百ページに及ぶ英文のデータシートを読むのは避けたいですね。たぶん、英語圏の人たちもそう思っています。順序が逆になりますが、11番は素のマイコンではどういう機能が使えるのでしょうか。ArduinoUnoの回路図を見ます。
ATMEGA8の17番ピンにつながっています。ArduinoUNOでは8ビット・マイコンのATmega328Pが使われているので、データシートを見ると、17ピンはPB3という名称がついています。そして、三つの機能が割り当てられています。
- MOSI (SPI Bus Master Output/Slave Input)
- OC2A (Timer/Counter2 Output Compare Match A Output)
- PCINT3 (Pin Change Interrupt 3)
PB3はPortBの3番目という名称なので、ディジタル入力もしくはディジタル出力の機能ももっています。合計五つの機能が一つの端子に割り当てられていることがわかります。
Arduinoでは、ディジタル・ポート11はその中からディジタル入力もしくはディジタル出力が使えるように限定しています。限定することで、プログラムでは、
- 入力
- 出力
のどちらに使うかを記述するだけでよいので、データシートを読まなくてもプログラムを書き始められます。
ただし、回路図ではMOSIがかっこの中に書かれています。センサなどSPIインターフェースを使ってつなげるときには、このピンが使われるのでLED点滅には使えません。今回はLEDを点滅することにしか利用しないので、支障ありません。
ATmega328Pのデータシートはこちらにあります。
日本語の解説本
LED;Light Emitting Diode。発光ダイオードです。エル・イー・ディーと読み、レッドという発音は聞いたことがありません。実験では赤色を使っています。ここでは何色を使ってもかまいません。5mmφの砲弾型、3mmφ砲弾型や角形など、形状にもいろいろありますが、どんなものでもかまいません。
ただし、ここでは自己点滅型とかの内部にマイコンなどが入ったのは使わないでください。
また、通常、LEDといったときは、信号確認用です。電流は数mAから20mA流して使います。数百mA以上の電流を流して使う照明用は発熱するので放熱が必要ですし、マイコンの端子に別途ドライブ回路をつないで駆動します。赤色のLEDで1.7V前後;LEDは発光する色によって使われる材料などが異なり、順方向降下電圧Vfも異なります。LEDのデータシートには、大きめの電流、たとえば20mAを流した時のVfが掲載されているため、赤色LEDでは1.8から2Vと表現している文献がたくさんあります。ArduinoUNOは出力端子から20mAを流すことができますが、多くのマイコンでは7mAや5mAが一般的です。したがって、少なめの5mAを流したときのVfは低めになり1.7V付近になります。
ms;millisecond。国際単位系 (SI) の表記。日本語ではミリ秒と表記されることが増えています。1msは0.001秒です。
Blink;ArduinoIDEに収録されているサンプルは、時代とともに変化しています。Blinkも、1.0以前とは異なっています。1.0以前では、setup()関数の前に、int ledPin = 13; が書かれていました。