フォト
2017年11月
      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    
無料ブログはココログ

« Arduino IDE 1.0.5がマイナーバージョンアップされていた | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(4) »

2014年9月 2日 (火)

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

前回の続きです。

ブレッドボードにてプロトタイプを制作しました。配線が多いです。

Dscn3025

Dscn3024

回路は前回とほぼ同じでこんな感じです(若干修正しています)。

01

写真の奥の大きいICがTLC5940です。
このICで行単位でフォントパターンを表示しています。
プログラムでダイナミック点灯方式でパターンを表示しています。
手前のボードが74HC595とTD62783のICで表示する行のON/OFFを制御しています。

今回はTLC5940を使ったのですが、ちょっと使いにくです。
使いにくというか通信データが無駄に多いです。
1点につき12ビット(輝度)のデータ送信が必要で16点だと12x16=192ビットのデータを
送る必要があります。

これなら、シフトレジスタ74HC945 2つ + 抵抗16本 に置き換えた方が良いかも。
プログラムも今一タイミング的に不明な所があり、試行錯誤的にdelayを入れて
やっと正常に表示ができました。

プログラムはこんな感じです。ダイナミック点灯部の制御はloop内で強引に
回しているので、このままだと他の処理が何もできません。
今後はタイマー割り込み等を使ってバックグランドで処理する等の改良が必要です。

#include <arduino.h>
#include "Tlc5940.h"

#define DATAPIN (8) // 74HC595のDSへ #define LATCHPIN (7) // 74HC595のST_CPへ #define CLOCKPIN (6) // 74HC595のSH_CPへ #define  LED_BRIGHTNESS  4095  // 最大の明るさ uint16_t fnt[16]= {   0x0200,   0x0200,   0x3ff8,   0x0400,   0x0440,   0x07f0,   0x1c5c,   0x3444,   0x2446,   0x6482,   0x4482,   0x4506,   0x4604,   0x381c,   0x0070,   0x0000 }; void MyShiftOut( int dataPin, int clockPin,uint16_t val ){      for( int i = 0; i < 16; i++ ) { digitalWrite(dataPin, !!(val & ((uint16_t)1 << i))); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW);     } } void clearRow() {    digitalWrite(LATCHPIN, LOW);    MyShiftOut(DATAPIN, CLOCKPIN, 0);    digitalWrite(LATCHPIN, HIGH); } void selectRow(byte row) {    digitalWrite(LATCHPIN, LOW);    MyShiftOut(DATAPIN, CLOCKPIN, 0x8000>>row);    digitalWrite(LATCHPIN, HIGH); } void setdata(uint16_t d) {   Tlc.clear();   uint16_t msk = 0x8000;   for (byte i = 0; i <16;i++) {     Tlc.set(i, msk & d ? LED_BRIGHTNESS : 0);     msk>>=1;   //Tlc.update();   }   //delay(50);   //Tlc.update(); } void setup() {   pinMode(DATAPIN, OUTPUT);   pinMode(LATCHPIN, OUTPUT);   pinMode(CLOCKPIN, OUTPUT);   Tlc.init(0);   clearRow();  } void loop() {   // データ設定テスト    for (int i=0; i < 16;i++) {         setdata(fnt[i]);         clearRow();         Tlc.update();         //delay(1);         delayMicroseconds(750);         selectRow(i);    }    //delay(1); }

プログラムの作成にあたり、TLC5940の使い方は武蔵野電波さんの記事
「第15回 TLC5940で16個のLEDを遊ぶ」を大いに参考にさせて頂きました。
 http://pc.watch.impress.co.jp/docs/column/musashino_proto/20090924_316652.html

TLC5940の使い方については、同じく武蔵野電波さんの「Arduino 日本語リファレンス」
TLC5940 (16ch/12bit PWMコントローラ) を参考にさせて頂きました。
http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=2329

また、シフトレジスタ74HC595の使い方については、hiramine.comさんの記事
「少ない出力ピンで、大量のLEDを制御する(シフトレジスタ使用)」を参考にさせて頂きました。
 http://www.hiramine.com/physicalcomputing/arduino/shiftregister.html

「あ」のフォントデータは、下記のHPにて公開されているフォントを利用させて頂きました。
 「JISX0213(所謂第3,4水準漢字)用bdfフォントのページ」
  http://www12.ocn.ne.jp/~imamura/jisx0213.html
  jiskan16-2004-1.bdf.gz(303,930バイト)を利用しています。
 
  ちなみに、「あ」のJISコードは 0x2422(= 10進数 9250)なので、
  bdfファイル(テキストファイル)をエディタで開いて"ENCODING 9250"で検索すれば、
  フォントデータが得られます。
 iskan16-2004-1.bdf(テキストファイル)の「あ」フォントのデータ 
    STARTCHAR 01-04-02
    ENCODING 9250
    SWIDTH 1024 0
    DWIDTH 16 0
    BBX 16 16 0 -2
    BITMAP
    0200
    0200
    3ff8
    0400
    0440
    07f0
    1c5c
    3444
    2446
    6482
    4482
    4506
    4604
    381c
    0070
    0000
    ENDCHAR

   0200〜0000の16個がフォントデータです。

« Arduino IDE 1.0.5がマイナーバージョンアップされていた | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(4) »

arduino」カテゴリの記事

AVR」カテゴリの記事

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

コメント

コメントを書く

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

トラックバック

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

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

« Arduino IDE 1.0.5がマイナーバージョンアップされていた | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(4) »