Arduino ドットマトリクス動作確認
皆の者!関東は雪じゃ!雪じゃ!(ガクブル
これで何処住みか大体どこだか特定されましたね。
さて、今回はLED編です!(え
LEDと言ってもLEDを多数使用したディスプレイみたいなもの。
それが、ドットマトリクスLED。
制御装置が組み込まれたものは表示器とも言われます。(駅で見かけるアレ
今日用意したのは、単純なLEDを並べたような構成ですが動きを学ぶにはこれでいいですね。
用意するもの
- Arduino nano
5個入りArduinoお得だよ!
- Kuman 40 in 1 Arduino用キット
このキットに入ってるドットマトリクスLEDを使用しています。
様々なセンサー、モジュール、ブレッドボード入りで始めたばかりには便利な商品です! - 抵抗器200Ω程度
(上記キットに入ってます。
あとは当然ジャンパーなどで接続します。
ドットマトリクスについて
今までハードウェア上のLEDを使うことはありましたが、今回は外部に用意するので一応基本情報を載せておきますね。
- まずLEDについて
1色のLEDは2極で構成されています。
プラス側(アノード)からマイナス側(カソード)へ電流が流れると点灯します。ただ、LEDは流れる電流に最大定格という限度があります。
例えば最大30mAなら30mA以下に抑える必要があります。
まあ、マイコン側が30mA以下の出力ならなくても一応・・・
Arduinoは電流出力が最大40mAなので壊れますが。
ですので、抵抗を入れてあげます。今回は220Ωとします。
これだと5Vの時、5mA程度でしょうか。
計算の注意点としてLEDには順電圧VfといってLEDにかかる電圧(例えば1.2V)が存在しますので計算式は
I = (V-Vf) / R
となるでしょう。
実際、Vfなどの値は環境によって変動するので、それに合わせてあげるとベストかも知れません。
が、今回のような実験では考えすぎなくてもいいかも??
- ドットマトリクスについて
これは1つのCOMに複数LEDが付いていて、それが数列並んでいるイメージです。
この場合、よく7セグメントLEDだとアノードにコモンがあるのでアノードコモンなんて言われたりします。
また、その逆もあるのでデータシートを見て確認してください。
今回使うのはこんな感じです。
LED8個×8列で8×8LEDドットマトリクス
割と単純ですがピン数が多くてちょっと面倒です。
それにピン配置も順番には並んでいないので配線時には注意が必要です。
回路構成を考える
回路を考えます。Arduino nanoを使いますが、ほぼピンを制圧されます(;´・ω・)
プログラミングをする
こんな感じです。
使用するROWをHIGHにしたら順にCOLをLOWにしていきます。
正直LEDの逆電圧がいくつまで耐えられるのか分かりませんが・・・信じてますから!!
/* Arduino nano */ byte ROW[8] = {2,3,4,5,6,7,0,1}; byte COL[8] = {0,1,2,3,4,5,3,4}; int ROW_cnt = 0; int COL_cnt = 0; void setup() { Serial.begin(115200); /* ROW */ pinMode(2, OUTPUT); //PORTD 2 pinMode(3, OUTPUT); //PORTD 3 pinMode(4, OUTPUT); //PORTD 4 pinMode(5, OUTPUT); //PORTD 5 pinMode(6, OUTPUT); //PORTD 6 pinMode(7, OUTPUT); //PORTD 7 pinMode(8, OUTPUT); //PORTB 0 pinMode(9, OUTPUT); //PORTB 1 PORTD &= ~0xFC; //all off PORTB &= ~0x03; //all off /* COL */ pinMode(A0, OUTPUT); //PORTC 0 pinMode(A1, OUTPUT); //PORTC 1 pinMode(A2, OUTPUT); //PORTC 2 pinMode(A3, OUTPUT); //PORTC 3 pinMode(A4, OUTPUT); //PORTC 4 pinMode(A5, OUTPUT); //PORTC 5 pinMode(12, OUTPUT); //PORTB 3 pinMode(11, OUTPUT); //PORTB 4 PORTC |= 0x3F; //all on PORTB |= 0x18; //all on } void loop() { /* dot led demo */ for(COL_cnt=0;COL_cnt<=8;COL_cnt++){ for(ROW_cnt=0;ROW_cnt<=8;ROW_cnt++){ /*** LED ON ***/ //ROW HIGH if(ROW_cnt >= 6){ PORTB |= _BV(ROW[ROW_cnt]); }else{ PORTD |= _BV(ROW[ROW_cnt]); } //COL LOW if(COL_cnt < 6){ PORTC &= ~_BV(COL[COL_cnt]); }else{ PORTB &= ~_BV(COL[COL_cnt]); } delay(50); /*** LED OFF ***/ //ROW LOW if(ROW_cnt >= 6){ PORTB &= ~_BV(ROW[ROW_cnt]); }else{ PORTD &= ~_BV(ROW[ROW_cnt]); } //COL HIGH if(COL_cnt < 6){ PORTC |= _BV(COL[COL_cnt]); }else{ PORTB |= _BV(COL[COL_cnt]); } } } }
動作結果
動作結果は、動画に載せておきます。
1ドット順に点灯していきます。