コントローラ基盤 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の置換え機能で半角に変換してからコンパルしてください。

最近のコメント