記事

はじめてマイコン・ボードArduinoを使ってみる(5)

次へ

動作確認をするためにLEDの点滅を行う
 今回は、Arduinoのディジタル出力ポートにLEDを接続し、Arduinoのプログラムで点滅の間隔を自由に変更できることを確認します。

LEDのリードの長さ
 今、電子工作でよく利用されているLEDは、次に示すような2本のリードを持っています。このリードに直流の電圧を加え発光させます。

 リードの長いほうにプラスの電源、短いリードにはマイナスの電源を接続します。電源の接続を反対にすると電流は流れず発光しません。
 リード線は「足」ともいいます。

ar5-01.png


 ブレッドボードに差し込むには足が長すぎるので、次のように足を短くします。しかし足を短くしてもプラス、マイナスの区別がつくように長さに差をつけておきます。抵抗の足も切り、ブレッドボードに差し込みやすいように曲げておきます。

ar5-02.png

 ブレッドボードにLEDと、LEDのプラス側に抵抗を接続しセットします。

 抵抗のLEDと接続されていないほうのリードとディジタル・ポート11をジャンパ線で接続し、LEDのマイナス側のリードとArduinoUnoのGNDとをもう1本のジャンパ線で接続します。

ar5-03.png


 LED、抵抗、ジャンパ線の具体的な接続を次に示します。

 LEDの短いほうのマイナス側のリードと茶色いジャンパ線を接続します。抵抗はLEDのプラス側に接続されていますので抵抗に接続されている黄色のジャンパ線がプラスの電圧になるとLEDに電流が流れ、LEDが点灯します。

ArduinoUno側のジャンパ線の接続
 黄色のジャンパ線はArduinoUnoのディジタル・ポート11に接続されています。茶色のジャンパ線はGNDのピン・ソケットに接続されています。

ar5-04.png

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に流れる電流が一定の値になるように制御されます。

ar5-05.png
 以上でハードウェアの準備は完了します。

LEDの点滅プログラムのサンプル・プログラムBlink.ins
 ArduinoIDEに多くのサンプル・プログラム(スケッチ)が用意されています。サンプル・プログラムは、次に示すように、メニュー・バーの
    ファイル>スケッチの例
でサンプルのリストが表示されます。このリストから01.Basicsを選択し、次に表示されるリストからBlinkを選択します。

ar5-06.png


 次に示すようにプログラム(スケッチ)Blinkが読み込まれます。

プログラムBlinkの中身

image015-f2a1ad49.jpg


 Blinkのプログラムには次のようことが記述されています。最初の
/* から */ の間に記述されていることはコメントとなり、Arduinoのプログラムの説明が書かれています。

/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.

Most Arduinos have an on-board LED you can control. On the Uno and
Leonardo, it is attached to digital pin 13. If you're unsure what
pin the on-board LED is connected to on your Arduino model, check
the documentation at http://www.arduino.cc

This example code is in the public domain.

modified 8 May 2014
by Scott Fitzgerald
*/

 ここまでは/* ~ */ のコメントです。次の//で始まる1行もコメントです。// があると、行末までこの文字の右側の記述はコメントとなります。命令の後に // 以降の命令の説明を追加できます。

// the setup function runs once when you press reset or power the board

 このvoid setup()関数は必須の関数でプログラムの開始時に一度だけ実行されます。処理の内容は{  }中に記述します。

void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}

 このsetup()関数の中では、 pinMode(13, OUTPUT); でディジタル・ポート13を出力ポートOUTPUTに設定しています。各命令の終わりには ; が必須です。
 次に示すvoid loop()関数がメインのプログラムで、この内容が繰り返し実行されます。

// the loop function runs over and over again forever
void loop() {

 この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に決まっています。

Arduin-upper.png


 マイコンにかぎらず、コンピュータはいろいろな用途に使えるように、機能が満載されています。搭載された機能のわりには、物理的なパッケージには大きさと端子の数に限りがあります。なので、一つの端子には複数の機能が割り当てられていて、利用者が、その中から、何に使いたいかをプログラムの中で指定します。
 けれど、そのためには、マイコンの機能を説明したデータシートを読まなければなりません。数百ページに及ぶ英文のデータシートを読むのは避けたいですね。たぶん、英語圏の人たちもそう思っています。

 順序が逆になりますが、11番は素のマイコンではどういう機能が使えるのでしょうか。ArduinoUnoの回路図を見ます。

arduino-11pin.png

 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)

arduino-11pinAVR.png

 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; が書かれていました。
 

次へ

連載メニュー はじめてマイコン・ボードArduinoを使ってみる

(1)  マイコン・ボードArduinoの開発は無償ツールで行える

(2) 開発環境のArduinoIDEをインストール その1

(3) 開発環境のArduinoIDEをインストール その2

(4) 開発環境ArduinoIDEをマスタする

(5) 動作確認をするためにLEDの点滅を行う

(6) サンプル・プログラムBlinkの実行準備

(7) スイッチが押されたときにLEDが点灯するプログラムを作る

(8) 入出力命令とif文を使ったプログラム

(9) シリアル・モニタを使うとプログラムの動きがよくわかる