フォト
2017年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でTB62706を使ってみました | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(6) »

arduino」カテゴリの記事

AVR」カテゴリの記事

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

コメント

コメントを書く

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

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/60368697

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

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