コントローラ基盤 Vol.32014年11月09日

Arduinoで7セグLEDコントローラを作成

7segduinoなるページを見つけました。これなら部品があるじゃないですか。というわけで早速作成しました。クリスタルは使用せずに8MHz内蔵CR発信で部品数を減らしています。実はこの7segduinoクローンの作成がここのところいろいろやっている光りものコントローラシリーズを始めるきっかけになりました。

外部との接続インターフェースはシリアル(左側)とI2C(右側)を引き出してあります。ファームウエアにはHT16K33に似たプロトコルを採用しました。16バイトまでのデータを受け取り、表示コマンドで表示します。4バイト以上の場合は右からスクロールします。

7segduinoのデモスケッチにI2C スレーブ機能を追加しました。I2Cマスターからの書き込み要求(R/W=0)を受け取り、7セグ表示データ(数値や文字ではありません。)をバッファーに格納します。Loop関数内ではバッファーを7セグLEDに表示させています。改良の余地だらけないい加減なプログラムです。特にスクロール表示中にデータが書き換わってもそのまま表示しています。

7segduino I2C Slave Firmware
// ---------------------------
// 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の置換え機能で半角に変換してからコンパルしてください。

コメント

トラックバック

このエントリのトラックバックURL: http://azss.asablo.jp/blog/2014/11/08/7486008/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。