どうもkonaniiです。
ハロウィンですね。
前に大型8×8 LEDドットマトリックスを作ったんですけど、
LEDの電流制限用に付けた抵抗が100Ωで、
拡散と区切りのアレを被せると昼間では少し暗いです。
さらに電流を流せば良いんですが、
このマイコン(ATmega328P)のI/Oは40mAまでしか電流を流してはいけません。
データシート(258ページ)に書いてあります。
トランジスタアレイ
なのでトランジスタアレイを増設します。
今回はTBD62783APGです。
なんか前と似ていますが、電源ピンが2つあるのでマイコン側のピンヘッダが1ピン増えました。
電源
トランジスタアレイを追加しただけでは、ほとんど明るさは変わりません。
なのでLED用電源の電圧を上げます。
そこで昇圧DC/DCコンバーターです
これでArduino Nanoの5Vから電圧を上げます。
青い多回転半固定ボリュームを回すと、数十Vまで電圧を変えられます。
早速LED基盤と繋ぎます。
やっちまった
ボリュームをどっちに回すと電圧が上がるのか忘れて最大電圧を流しちまいました。
無負荷状態で最大電圧を調べたら、44.4Vまで出るようです。そりゃ死にますね。
元々が電流が流せない5Vなので、LEDを繋いだ状態だと電圧は12ボルトくらいまでしか上がらないのですが、
長い間電源を入れてたので、右端の縦の列が全滅しました。
まあ全部のLEDがやられたわけではないので、とりあえずLEDを取り替えます。
で、右のLEDは新品に変えたのですが、全然明るくありません。
壊れた列の抵抗の抵抗値を調べてみると、10KΩから2MΩ以上になっていました。
抵抗も壊れるんですね。
壊れた抵抗を取り外して、新しい100Ωの抵抗に取り替えました。すると、
直りました。抵抗もついでにやられてたみたいです。
そんなわけで、全部壊れたのを取り替えて、直りました。やったね!!
皆さんも電流の流しすぎには気をつけましょう!!!
そしてちゃんとテスターで電圧を見ながら調整して、電圧を6.5Vくらいに設定しました。
明るい!!
前よりかなり明るくなりました。写真が撮りやすいです。
動画です。音は出ないです。
電球色にしといてよかったです。
プログラムです。
int speed = 5; #define SPACE 10 #define GRAPHIC_LENGTH 32 uint8_t graphic_data[8 * GRAPHIC_LENGTH] = { /* 0b00000000, // ' ' 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, */ 0b11000011, // 'H' 0b11000011, 0b11000011, 0b11111111, 0b11000011, 0b11000011, 0b11000011, 0b11000011, 0b00000000, // 'a' 0b00000000, 0b00111100, 0b00000110, 0b00111110, 0b01100110, 0b01100110, 0b00111011, 0b00000000, // 'p' 0b01101110, 0b01111011, 0b01110011, 0b01110011, 0b01101110, 0b01100000, 0b01100000, 0b00000000, // 'p' 0b01101110, 0b01111011, 0b01110011, 0b01110011, 0b01101110, 0b01100000, 0b01100000, 0b00000000, // ' ' 0b00000000, 0b01100011, 0b01100011, 0b00110110, 0b00011100, 0b00111000, 0b01110000, 0b00000000, // ' ' 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11000011, // 'H' 0b11000011, 0b11000011, 0b11111111, 0b11000011, 0b11000011, 0b11000011, 0b11000011, 0b00000000, // 'a' 0b00000000, 0b00111100, 0b00000110, 0b00111110, 0b01100110, 0b01100110, 0b00111011, 0b00000000, // 'l' 0b00000000, 0b00111000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011100, 0b00000000, // 'l' 0b00000000, 0b00111000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011100, 0b00000000, // 'o' 0b00000000, 0b00011100, 0b00110110, 0b01100011, 0b01100011, 0b00110110, 0b00011100, 0b00000000, // 'w' 0b00000000, 0b01100010, 0b01100010, 0b01101010, 0b01101010, 0b01111110, 0b00110100, 0b00000000, // 'e' 0b00000000, 0b00111100, 0b01100110, 0b01111100, 0b01100000, 0b01100000, 0b00111100, 0b00000000, // 'e' 0b00000000, 0b00111100, 0b01100110, 0b01111100, 0b01100000, 0b01100000, 0b00111100, 0b00000000, // 'n' 0b00000000, 0b01101100, 0b01110110, 0b01110110, 0b01100110, 0b01100110, 0b01100110, 0b00000000, // '!' 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00000000, 0b00011000, 0b00011000, 0b00000000, // '!' 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00000000, 0b00011000, 0b00011000, 0b00000000, // ' ' 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11000011, // 'K' 0b11000110, 0b11001100, 0b11111000, 0b11111000, 0b11001100, 0b11000110, 0b11000111, 0b00111100, // 'O' 0b01100110, 0b11000011, 0b11000011, 0b11000011, 0b11000011, 0b01100110, 0b00111100, 0b11000011, // 'H' 0b11000011, 0b11000011, 0b11111111, 0b11000011, 0b11000011, 0b11000011, 0b11000011, 0b00011000, // 'A' 0b01111110, 0b11100111, 0b11000011, 0b11111111, 0b11000011, 0b11000011, 0b11000011, 0b00111100, // 'C' 0b01100110, 0b11000011, 0b11000000, 0b11000000, 0b11000011, 0b01100110, 0b00111100, 0b11111100, // 'R' 0b11000110, 0b11000110, 0b11111100, 0b11000110, 0b11000011, 0b11000011, 0b11000011, 0b00011000, // 'A' 0b01111110, 0b11100111, 0b11000011, 0b11111111, 0b11000011, 0b11000011, 0b11000011, 0b11111111, // 'F' 0b11000000, 0b11000000, 0b11111110, 0b11000000, 0b11000000, 0b11000000, 0b11000000, 0b11111111, // 'T' 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00000000, // '.' 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00011000, 0b00011000, 0b00111100, // 'C' 0b01100110, 0b11000011, 0b11000000, 0b11000000, 0b11000011, 0b01100110, 0b00111100, 0b00111100, // 'O' 0b01100110, 0b11000011, 0b11000011, 0b11000011, 0b11000011, 0b01100110, 0b00111100, 0b11000011, // 'M' 0b11100111, 0b11111111, 0b11011011, 0b11000011, 0b11000011, 0b11000011, 0b11000011, 0b00000000, // ' ' 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, }; int x_pins[8] = { 5, 6, 7, 8, 9, 10, 11, 12 }; int y_pins[8] = { A0, A1, A2, A3, A4, A5, 4, 3 }; void setup() { for (int i = 0; i < 8; i++) { pinMode(x_pins[i], OUTPUT); } for (int i = 0; i < 8; i++) { pinMode(y_pins[i], OUTPUT); } } uint16_t data[8] = { //16bit幅 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, }; int count = 0; void loop() { if ((count % SPACE) == (SPACE - 1)) { //SPACE回、シフトし終わったら for (int y = 0; y < 8; y++) { data[y] &= 0xff00;//これからORするところをマスクしておく data[y] |= graphic_data[y + ((count / SPACE) * 8)];//新しいグラフィックをORする } } count++; if (count >= GRAPHIC_LENGTH * SPACE) { //全グラフィックが表示し終わったら最初に戻る count = 0; } for (int wait = 0; wait < speed; wait++) { for (int y = 0; y < 8; y++) { for (int i = 0; i < 8; i++) { digitalWrite(y_pins[i], LOW); //表示する前に行を全てクリアしておく } for (int x = 0; x < 8; x++) { digitalWrite(x_pins[x], (data[y] >> (15 - x)) & 1); //列のデータを表示する } digitalWrite(y_pins[y], HIGH); //表示したい行をオンにする delayMicroseconds(1000);//表示するために少し待つ for (int i = 0; i < 8; i++) { digitalWrite(y_pins[i], LOW); //行を全てクリアする } } } for (int y = 0; y < 8; y++) { data[y] <<= 1; //右スクロールする } }
これでかなり電光掲示板としても使いやすくなりました。
それでは皆さん、ハッピーハロウィン!!
おわり
コメント