NRS+

New Reeves&Sinensis plus

サイト内検索

  HOME | サーバ紹介 | ライブカメラ | カメを飼おう | 特集・小ネタ | 鉄道図鑑 | 雑記 | リンク

  HOME > 特集・小ネタトップページ > Arduinoで電子工作3 -LEDを光らせる-


Arduinoで電子工作3 -LEDを光らせる- 作成:2014年6月8日
更新:-




1.LEDを繋いで光らせる

 前回の「サンプルスケッチで動作確認(Lチカ)」ではArduino本体のオンボードLEDを点滅させました。今回は用意したLEDをArduinoに繋いでみます。



部品表
品名 型番など 数量
LED 5mm砲弾型赤色 他の色や同等品でも可
同等品は定格が3V20mA程度のもの
1〜
ブレッドボード 部品をArduino本体に直挿しの場合は不要 1
ジャンプワイヤ 部品をArduino本体に直挿しの場合は不要
フレキシブルタイプで長さ10cm程度が扱いやすい
2〜
抵抗 100Ω(茶黒茶金)・330Ω(橙橙茶金)・1kΩ(茶黒赤金)
( )内の色は抵抗のカラーコード
100Ωから1kΩ程度で最低1種類あれば可
LEDの個数分



1.1 Arduino本体に直差しする

 まずはLEDをArduino本体の端子に直接挿し込んでみましょう。写真のようにLEDをArduinoの13番ピンとGNDピンに挿しますま。このとき長い方の足をArduinoの13番ピンに、短い方の足をGNDピンに挿します。逆向きに挿すと光らないので注意しましょう。LEDを接続したらArduinoにサンプルスケッチの「Blink」を書き込みます。書き込み方法は前回の1.サンプルスケッチで動作確認(Lチカ)と全く同じです。スケッチを書き込んだらArduinoのオンボードLEDと13番ピンとGNDピンに挿したLEDが同時に点滅するはずです。オンボードLEDが光っていて挿したLEDが光らない場合はLEDの挿す場所や向きを間違えていないか確認してください。




ArduinoにLEDを挿して光らせている様子 

LEDの向きに注意



 LEDはLight Emitting Diodeの略で日本語名は発光ダイオードです。ダイオードは電流を一定方向にしか流さない電子部品です。LEDは発光するダイオードということで電流を流すと光る・電流を一定方向にしか流さないという二つの特徴を持った部品です。つまり逆向きに接続すると電流が流れず光らないということです。LEDの足の長い方はアノード(+側)、短い方はカソード(-側)です。前回のオルゴールに使った圧電ブザーやスピーカーは接続する向き(極性)がありませんでしたがLEDにはあります。向きを間違えたとしてもこの程度の工作ならLEDが光らないだけで済みます(運が悪くてもLEDが壊れる程度で発火等の事故に繋がる可能性は極めて低いです)。LEDの極性は足の長さ以外に本体の切り欠きや内部の電極の形からも確認することができます。

*足の長さ・切り欠き・電極の形とアノード・カソードの関係はほぼ統一されていますが海外製などで稀に逆になっていることがあります。





LEDの極性の見分け方1 本体の切り欠き

切り欠きのある方がカソード(-)




LEDの極性の見分け方2 内部の電極

電極の大きい方がカソード(-)
マウスオーバーで電極部に印が入ります



1.2 ブレッドボードとジャンプワイヤで回路を作る

 Arduinoで工作をするとき部品を直挿しだと複雑な回路が組めないのでブレッドボード上に回路を組んでそれをArduinoに接続することが多くなります。ブレッドボードの使い方はこちら(「ブレッドボードの使い方」 / サンハヤト株式会社 pdf)が詳しいです。ブレッドボードの構造を理解して部品を挿す位置を考えて配線することがポイントです。部品の足を切る理由は部品が傾いて足が他の部品の足と接触してショートするのを防ぐためなので部品数が少なかったり配線に余裕がある場合は不要です。
 前節ではLEDをArduinoに直挿ししましたが、ここではブレッドボードを使うのでLEDに電流制限用の抵抗を接続します。抵抗がなくてもちゃんと動作したから余計なものはいらないと思われるかもしれませんが本来は必要なものです(*1)。Arduinoの出力にLEDを繋ぐ場合の電流制限抵抗の抵抗値は100Ωから1kΩ程度が目安です。以下の式で求められますがそこまでこだわらなくてもいいでしょう。

LED電流制限抵抗[Ω]=(電源電圧[V]-LED順電圧[V]) / LED順電流[A]

定格が3V 20mAのLEDをArduino(出力電圧5V)で使う場合は

(5V-3V) / 20×10-3A=100Ω       *1mA=1×10-3A=0.001A

となります。小型のLEDの定格電圧は2Vから3.6V程度、定格電流は20mAです。定格電圧は赤色が低めで青色や白色が高めです。(照明などに用いられるハイパワーLEDは大電流を要求しますがここでは扱いません)

(*1)ArduinoにLEDを電流制限抵抗なしで繋いで壊れないのはArduinoの出力電流が最大100mAに制限されているからです。乾電池など電流の制限がない電源にLEDを直結すると過電流で発光部が焼けて壊れるので注意してください。




LEDと抵抗の配線図

Arduinioの13番ピンとLEDのアノード(+側)の間に抵抗を入れます

スケッチは1.1同様サンプルスケッチ「Blink」



2.LEDを光らすプログラム

2.1 サンプルスケッチで基本事項をチェック

 サンプルスケッチ「Blink」は13番ピンのLEDを1秒間隔で点滅させるプログラムでした。スケッチの一部を書き換えれば点滅の間隔やLEDを接続するピンを変えることができます。


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

This example code is in the public domain.
*/


// Pin 13 has an LED connected on most Arduino boards.
// give it a name:

int led = 13;

// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}

 上に記しているのはサンプルスケッチ「Blink」の全文です。スケッチの灰字の箇所はコメント文(メモ書き)で動作には影響しません。必要な部分だけ残すと以下のようになります。

int led = 13;

void setup() {
pinMode(led, OUTPUT);
}

void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}


int led = 13;

 ledはint型(整数)の13である と定義(宣言)しています。C言語では数値や文字列を宣言するときにintやdoubleなどといった型を指定します。int型は整数の-32768から+32767までの数値を扱えます。



void setup() {
pinMode(led, OUTPUT);
}


 void setup() { 〜 }は初期設定の内容です。このスケッチでは「pinMode(led, OUTPUT); 」が設定です。
pinMode(ピン番号, モード(入力or出力)); は指定したピンを出力(入力)とするという意味です。ここでledは上で13と定義されておりモードがOUTPUTとなっているので、13番ピンを出力とするとなります。pinMode(13, OUTPUT); と書いても同じ意味になります。void setup() { 〜 }の〜は初期設定だと説明しましたが、実行させたいプログラムも書くことができます。ただし、ここに書いたプログラムは電源を入れた(リセットボタンを押した)後1回しか実行されません。自動で繰り返し実行したい内容は次のvoid loop() { 〜 }に書きます。



void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}


 void loop() { 〜 }はプログラムの繰り返し部分です。上から順番に実行されて一番下まで実行されると一番上に戻って繰り返します。digitalWrite(led, HIGH); はled(=13)の出力をHIGHにするという命令です。HIGH出力をオンにする、すなわちLEDを点灯させるという意味です。delay(1000); は1000ミリ秒(=1秒)待つ、digitalWrite(led, LOW); はled(=13)の出力をLOW(オフ)にするということです。これを繰り返すと LEDを点灯する→1秒待機する→LEDを消灯する→1秒待機する→LEDを点灯する ...となりLEDが点滅し続けます。


LEDを繋ぐピンを変更するときはint led = 13;の13を違う数字にします。数字は0〜13まで指定することができます。Arduino Unoのデジタル出力ピンが0番から13番までだからです。スケッチの動作部分を入力する時は必ず半角文字で入力します。全角で入力するとエラーが出るので注意しましょう。
LEDの点灯/消灯時間はdelay(1000); の値を変えます。例えば

digitalWrite(led, HIGH);
delay(5000);
digitalWrite(led, LOW);
delay(2500);

とすると5秒点灯2.5秒消灯の点滅になります。




2.2 2個以上のLEDを光らせる

 サンプルスケッチ「Blink」では1つのLEDを点滅させました。ここでは2つ以上のLEDを制御するスケッチを書いていきます。

まずはLEDの変数(ピン番号)を定義します。

int led1 = 13;
int led2 = 12;

このように書くとled1が13番ピン、led2が12番ピンとなります。ピン番号の定義の仕方ですが以下のように書くこともできます。

#define LED1 13
#define LED2 12

#define A B はABに置き換えるという意味です。#define LED1 13 はLED1を13に置き換える、この場合はint LED1 = 13;と同じです。 #define A Bを使うとBにA0〜A5(アナログ入出力)ピンを指定することもできます。LEDが大文字になっているのは入出力部品の変数名であることを強調して他の変数と区別しやすくするためなので小文字でledでも構いません。

 int led1 = 13; や delay(1000);  などの命令文は末尾に;(セミコロン)がつきますが、#define には末尾のセミコロンは不要です。

変数を定義したら次は初期設定です。LEDが2つなのでpinMode(ピン番号,モード); も2つになります。

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

LEDを点滅させる命令はどのようなパターンで点滅させるかで書き方が変わります。以下が一例です。


例1:LED1とLED2を1秒ごとに同時に点滅

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


例2:LED1とLED2を1秒ごとに交互に点滅

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


例3:LED1とLED2を1秒ごとに[○○]→[●○]→[●●]→[○●]の順に点滅
○:消灯  ●:点灯

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

 LEDを3個以上使う場合も同様の手順でスケッチを書けば対応できます。21個以上またはそれ以下でも他の部品を併用する場合はArduinoのピン数が足りないのでシフトレジスタなどを用いたやや高度な回路とプログラムが必要となります。(少ないピン数で多くのLEDを制御する設計)



2.3 LEDの明るさを変える

 LEDの明るさを変える方法はLEDの電流制限抵抗の値を変える方法(ハードウェア)とスケッチで実現する方法(ソフトウェア)の2通りがあります。電流制限抵抗の値を減らすと明るくなり増やすと暗くなります。スケッチで明るさを変えるのにはアナログ出力関数「analogWrite(ピン番号,数値);」を使います。数値は0から255までの範囲で1ずつ変えられます。0のとき明るさ0%(出力0V)、255のとき明るさ100%(出力5V)となります。電流制限抵抗の値やLEDのスペックによっては255未満の値でも限界の明るさで光ることがあります。analogWriteが使えるピンはA0番からA5番と3・5・6・9・10・11番ピンのみです。ピン番号がAで始まる(AREFは除く)か本体に印字されているピン番号の左に〜がついているピンが該当します。

以下はA0番ピンに接続したLEDが徐々に明るくなって明るさ100%になったら消灯してまた徐々に明るくなるスケッチです。

#define LED1 A0
void setup() {}
void loop() {
for(int i=0; i<256; i++){
analogWrite(LED1, i);
delay(10);
}

for(int i=0; i<256; i++){ 〜 }は、for(初期処理; 条件; 変更処理){ 処理内容 }です。
・初期処理 int i=0; は最初にiは整数で0だと宣言しています。
・条件 i<256; はiの値が256より小さい場合繰り返し実行するという意味です。
・変更処理 i++ は{ 処理内容 }の実行が済んだらiの値に1を足すという意味です。i=i+1とも書けます。

 analogWriteはアナログ出力の関数だと書きましたが実際はPWM制御を行っています。PWMはPulse Width Modulationの略で日本語に訳すとパルス幅変調です。毎秒数百回ほどの速さでスイッチをオンオフしてパルスのデューティー比(出力がオンになっている時間とオフになっている時間の割合)を変えることより擬似的にアナログ出力を再現しています。







HOME





20140721MO