フォト
2019年8月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
無料ブログはココログ

« ArduinoでTB62706を使ってみました | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(6) »

2014年9月24日 (水)

Arduinoで16x16 LEDドットマトリックスを利用する(5)

前回からの続きです。LEDの制御をTLC5940からTB62706に変更しました。
やっと、思った通りの制御ができました。TB62706は機能が単純で使いやすいです。

Dscn3077

動作はこんな感じです。


ダイナミック点灯方式なので、カメラで撮るとチラつきありますが、
肉眼では気になりません。

回路はこんな感じに変更しました(電源回りは省略しています)。

01

ダイナミック駆動にて、16x16のパターンを表示しています。
Arduinoとのデータのやり取りはD6〜D9の4線で行っています。
D6(ENABLE)が表示/非表示の制御、
D7〜D9がシリアルデータを送り込んでいます。
TB62706→74HC595→74HC595 と接続して32ビットデータを流し込んでます。

TB62706にはCOL(1行毎のデータ)を保持します。
2つのシフトレジスタ74HC595はアクティブにする行(ROW)を保持します。

プログラムこんな感じです。

//
// TB62706を使ったLEDの点灯サンプル
//

#include <arduino.h> #include <MsTimer2.h> #include <string.h> #define DATAPIN (7) // TB62706のSERIAL-INへ #define LATCHPIN (9) // TB62706のLATCHへ #define CLOCKPIN (8) // TB62706のCLOCKへ #define ENABLEPIN (6)     // TB62706のENABLEへ uint16_t fbuf[16];    // 表示パターンバッファデータ // 文字データ "こんにちは埼玉県" uint16_t fnt[11][16]= { {// ""   0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,   0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff },   {// こ   0x0000,0x0000,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,   0x0000,0x0000,0x2000,0x3000,0x1c00,0x07fc,0x0000,0x0000 }, {// ん   0x0200,0x0200,0x0600,0x0400,0x0c00,0x0800,0x0800,0x1b80,   0x1440,0x1840,0x3040,0x2042,0x2046,0x604c,0x4038,0x0000 }, {// に   0x0000,0x1000,0x1000,0x31fc,0x2000,0x2000,0x2000,0x2000,   0x2000,0x2000,0x2200,0x2200,0x2b00,0x31fe,0x1000,0x0000 }, {// ち   0x0100,0x0100,0x0100,0x7ffc,0x0200,0x0600,0x0400,0x0ff0,   0x1808,0x3004,0x0004,0x0004,0x000c,0x0038,0x07e0,0x0000 }, {// は   0x0000,0x2020,0x2020,0x6020,0x47fe,0x4020,0x4020,0x4020,   0x4020,0x4020,0x43e0,0x4438,0x542c,0x6466,0x23c0,0x0000 }, {// 埼   0x2020,0x2020,0x23fe,0x2050,0xf8d8,0x218c,0x2000,0x27ff,   0x2004,0x21e4,0x3924,0x6124,0xc124,0x01e4,0x0004,0x001c}, {// 玉   0x0000,0x7ffe,0x0100,0x0100,0x0100,0x0100,0x0100,0x3ffc,   0x0100,0x0100,0x0118,0x010c,0x0104,0x0100,0xffff,0x0000 }, {// 県   0x07f8,0x2408,0x2408,0x27f8,0x2408,0x2408,0x27f8,0x2408,   0x2408,0x27f8,0x2000,0x3fff,0x0888,0x188c,0x7087,0x0080 }, {// ""   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 }, {// ""   0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555,   0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555 } }; // // 行の指定 // void selectRow(byte no) {         uint16_t val = _BV(15-no);         // ビット列データの出力 for( byte i = 0; i < 16; i++ ){ digitalWrite(DATAPIN, val & _BV(i) ? 1:0); digitalWrite(CLOCKPIN, HIGH); digitalWrite(CLOCKPIN, LOW); } } // // 行フォントパターンの送信 // void dataOut(uint16_t val ) { for( byte i = 0; i < 16; i++ ){ digitalWrite(DATAPIN, val & _BV(i) ? 1:0); digitalWrite(CLOCKPIN, HIGH); digitalWrite(CLOCKPIN, LOW); } } void setup() {         pinMode(ENABLEPIN,OUTPUT); pinMode(DATAPIN, OUTPUT); pinMode(LATCHPIN, OUTPUT); pinMode(CLOCKPIN, OUTPUT);         digitalWrite(ENABLEPIN,HIGH); digitalWrite(CLOCKPIN, LOW);         digitalWrite(LATCHPIN, HIGH);        digitalWrite(ENABLEPIN,LOW);            // OUTを有効にする        setfont(fnt[9]); // フォントバッファに初期パターン設定               // 割り込み開始        MsTimer2::set(15, fontout); // 1/60秒程度で1文字を表示        MsTimer2::start(); } // // バッファ内データを表示する // void fontout() {     // 点灯LEDが移動するパターン     digitalWrite(ENABLEPIN,LOW);            // OUTを有効にする     for( byte i = 0; i < 16; i++ ) {        digitalWrite(LATCHPIN, LOW); //送信開始               selectRow(i);                    dataOut(fbuf[i]);        digitalWrite(LATCHPIN, HIGH); //送信開始             }     digitalWrite(ENABLEPIN,HIGH);            // OUTを有効にする } // // バッファにフォントパターンをセット // void setfont(uint16_t* fptr) {   memcpy(fbuf, fptr, 32);  } // // ドット表示チェック(デバッグ用) // void dottest() {   for (byte y=10; y < 11;y++)     for (byte x=0;x <16;x++) {       fbuf[y]= 0x8000>>x;      delay(50);       fbuf[y]= 0;     }        } void loop(){   // 文字を順番に表示する   for (byte i =0; i < 11; i++) {     setfont(fnt[i]);      delay(500); } }

プログラムではMsTimer2ライブラリを使っています。
割り込み処理で15msec間隔でバッファ内のフォントデータをLEDに表示しています。
表側では、バッファに表示したいデータを書き込んでいます。
これで、任意のパターンを任意のタイミングで表示できます。

さて次の目標ですが、任意のメッセージをスクロール表示したいですね。
漢字フォントは、以前試した「日本語フォントROM GT20L16J1Y」を使おうと思います。
「Arduinoで16x16 LEDドットマトリックスを利用する(6)」に続きます。

関連記事
Arduinoで16x16 LEDドットマトリックスを利用する(1)
Arduinoで16x16 LEDドットマトリックスを利用する(2)
Arduinoで16x16 LEDドットマトリックスを利用する(3)
Arduinoで16x16 LEDドットマトリックスを利用する(4)
Arduinoで16x16 LEDドットマトリックスを利用する(5) (この記事です)
Arduinoで16x16 LEDドットマトリックスを利用する(6)
Arduinoで16x16 LEDドットマトリックスを利用する(7)
Arduinoで16x16 LEDドットマトリックスを利用する(8)

再チャレンジ版
aitendo 16x16LEDマトリックスの制御 (1)
aitendo 16x16LEDマトリックスの制御 (2)
aitendo 16x16LEDマトリックスの制御 (3)
aitendo 16x16LEDマトリックスの制御 (4)
aitendo 16x16LEDマトリックスの制御 (5)
ESP-WROOM-02を始めました(2)

« ArduinoでTB62706を使ってみました | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(6) »

arduino」カテゴリの記事

AVR」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Arduinoで16x16 LEDドットマトリックスを利用する(5):

« ArduinoでTB62706を使ってみました | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(6) »