コントローラ基盤 Vol.3 ― 2014年11月09日
Arduinoで7セグLEDコントローラを作成
7segduinoなるページを見つけました。これなら部品があるじゃないですか。というわけで早速作成しました。クリスタルは使用せずに8MHz内蔵CR発信で部品数を減らしています。実はこの7segduinoクローンの作成がここのところいろいろやっている光りものコントローラシリーズを始めるきっかけになりました。
外部との接続インターフェースはシリアル(左側)とI2C(右側)を引き出してあります。ファームウエアにはHT16K33に似たプロトコルを採用しました。16バイトまでのデータを受け取り、表示コマンドで表示します。4バイト以上の場合は右からスクロールします。
- コントローラ
ATmega328P Arduino クローン
ATmegaBOOT_168_atmega328_pro_8MHz.hex - 7セグメント 4桁LED
秋月電子のダイナミック接続4桁高輝度白色7セグメントLED表示器
7segduinoのデモスケッチにI2C スレーブ機能を追加しました。I2Cマスターからの書き込み要求(R/W=0)を受け取り、7セグ表示データ(数値や文字ではありません。)をバッファーに格納します。Loop関数内ではバッファーを7セグLEDに表示させています。改良の余地だらけないい加減なプログラムです。特にスクロール表示中にデータが書き換わってもそのまま表示しています。
7segduino I2C Slave Firmware
使用したArduino IDEのバージョンは1.0.6です。
ソースプログラム中のカギ括弧にご注意ください。HTMLのタグとの区別ため一部に全角文字を使用しています。Arduino IDEの置換え機能で半角に変換してからコンパルしてください。
// --------------------------- // 7segduino I2C Slave Firmware // --------------------------- #include <Sseg.h> #include <Wire.h> Sseg mySseg = Sseg(4, 8, 11, 13, 14, 2, 10, 12, 3, 6, 7, 9); // Initial data uint8_t strbuf[] = { 0b00000000, 0b00000000, 0b00000000, 0b00000000, // Buffer MAX 16 character 0b01101110, // H 0b10011110, // E 0b00011100, // L 0b00011100, // L 0b00111010, // o 0b00000000, // NUM_PAT_7, // 7 0b10110110, // S NUM_PAT_E, // E 0b11110110, // G 0b00000001, // . 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111 }; int buflen = 15; // Initial buffer length. int cntstr = 4; // Initial buffer position. int p = 0; // Display position. // I2C data Protocol // 1 2 3 4 5 6 7 8 9 10 11 12 13 // "H" "e" "l" "l" "o" "W" "o" "r" "l" "d" "!" "!" 0xFF // MAX 16 characters void hreceive(int numBytes) { for(int i = 0; i < numBytes; i++){ strbuf[cntstr] = Wire.read(); if(cntstr == 4) buflen = 4; if(strbuf[cntstr] != 0xFF) ++buflen; if(cntstr > 18 || strbuf[cntstr] == 0xFF) { cntstr = 4; // Return to home position. } else { ++cntstr; } } } void setup() { mySseg.begin(); mySseg.setBrightness(20); Wire.begin(8); Wire.onReceive(hreceive); } #define OVERWRAP(a, x) (((x) < buflen) ? (a[(x)]) : a[((x) - buflen)]) void loop() { if ((++p) > buflen) { if(buflen > 8) { p = 0; // scroll } } if(buflen > 8) { mySseg.writeRawData( OVERWRAP(strbuf, p), OVERWRAP(strbuf, p+1), OVERWRAP(strbuf, p+2), OVERWRAP(strbuf, p+3)); mySseg.updateWithDelay(300); } else { p = 4 - (8 - buflen); // Not scroll mySseg.writeRawData( strbuf[ p], strbuf[p+1], strbuf[p+2], strbuf[p+3]); mySseg.updateWithDelay(50); } }
使用したArduino IDEのバージョンは1.0.6です。
ソースプログラム中のカギ括弧にご注意ください。HTMLのタグとの区別ため一部に全角文字を使用しています。Arduino IDEの置換え機能で半角に変換してからコンパルしてください。
最近のコメント