前回のスイッチの応用で、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 がねじれているので無理矢理な式になっていますが、本格的に使う場合は、配線なども考えて整理した方が良いでしょう。パターンを複数用意して順番に表示すれば、アニメーションも可能です。
(Download→myRowColumnScanning.txt)
ところでこのサンプルコード、LED のON/OFF 状態(1bit) 64個 を16bit の int 64個 で保持しているのが、いかにも Arduino 的ですね、、、
0 件のコメント:
コメントを投稿