2011年5月19日木曜日

Arduino に LED をたくさんつけたい


前回のスイッチの応用で、LED も18個までなら簡単に繋げる事が出来ます。
しかし、LED はスイッチに比べて電流を喰います。
Arduino のドライブ能力はどの程度でしょうか?

ATMega シリーズの仕様書によると、

29. Electrical Characteristics
29.1 Absolute Maximum Ratings
DC Current per I/O Pin ................................................ 40.0mA
DC Current VCC and GND Pins................................. 200.0mA

となっています。つまり、I/O ピンあたり40 mA、全体で200 mA が限界。
LED 1つに10mA 使うとすると、18本同時点灯などは危険です。

今回は LED I/O 直結 18個 ではなく、8x8 の LED Matrix を使ってみます。LED 数は64個。
マトリックスLED は縦(ROW)、横(COLumn)を組にして、高速に切り替えながら点灯(ダイナミック点灯)します。

LED は秋月で購入した BU5004-R (スタンレー電気) を使用しました。
(廃盤なのか、Web 通販には載ってないようです。赤・緑タイプ BU5004-RG の赤のみ版)

COL (Anode) 8本、ROW (Cathode) 8本のピンが出ているのですが、順番はばらばらです、、、


プログラムは、Arduino IDE 付属のサンプルを使います。
FIle > Examples > 7.Display > RowColumnScanning

解説はこちら(→arduino.cc)。
このサンプルでは、Lumex LDM-24488NI というMatrix LED を使用しています。

本来はプログラムの修正が必要なのですが、、、よく見るとROW (Anode) とCOL (Cathode) を逆に接続すれば良いようです。

プログラム中で
// 2-dimensional array of row pin numbers:
const int row[8] = {
2,7,19,5,13,18,12,16 };

// 2-dimensional array of column pin numbers:
const int col[8] = {
6,11,10,3,17,4,8,9 };

となっていますが、row の 2,7,19,5,13,18,12,16 ピンを BU5004 のCOL 1...8 へ、col の6,11,10,3,17,4,8,9 ピンをBU5004 のROW 1...8 へ、それぞれ接続します。
(BU5004 のCOL 1...8, ROW 1...8 はピン番号ではないので注意)

サンプルではLED とI/O を直結しています。ダイナミック点灯なので、それほど電流が流れないためでしょう。
私は心配性なので、1列ごとに抵抗(120Ω) をつけました。

このサンプルは、a0, a1 にボリュームを接続し、X, Y の値として使用します。
ボリュームを動かすと、点灯箇所を移動させる事ができます。
(手直なボリュームがなかったので固定抵抗で代用)





ついでに、少し書き換えて任意のパターンを表示できるようにしてみました。
(冒頭の写真はテトラポッドのつもり、、、)
LCD カスタムキャラの時と同じような感じでビットマップデータを作成します。


const byte dots[8] ={
B00011000,
B00100100,
B00100100,
B00100100,
B01011010,
B10001001,
B10011001,
B01100110
};

void setPatterns(){
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
pixels[x][y] = !bitRead(dots[7-x],7-y);
}
}
}

loop() の中で、readSensors(); のかわりに、setPatterns(); を呼び出します。X, Y がねじれているので無理矢理な式になっていますが、本格的に使う場合は、配線なども考えて整理した方が良いでしょう。パターンを複数用意して順番に表示すれば、アニメーションも可能です。


ところでこのサンプルコード、LED のON/OFF 状態(1bit) 64個 を16bit の int 64個 で保持しているのが、いかにも Arduino 的ですね、、、

0 件のコメント:

コメントを投稿