はじめに
今年もあと僅かですね、みなさんはいかがお過ごしでしょうか?
今回紹介したいのは7セグメントLED制御用ドライバ【TM1630】です。
よくある論理回路タイプのデコーダとは違ってデータとクロック、チップセレクタで制御する通信タイプのドライバです。
難点がこのICの製造元がタイタンマイクロエレクトロニクス社という中国メーカなところですね。もちろんデータシートも中国語です。
雑ではありますが、データシートを翻訳した記事載せときますね。
(注)個人利用で翻訳したものなので翻訳ミス、動作等の保証は致しませんのであしからず。
回路図
今回はArduinoでの制御を想定します。制御ピンは以下に示す通り3PINだけ!
- DIO(D9):データ入出力
- CLK(D10):クロック入力
- STB(D11):データの送受信の定義
*今回はK2は使用しません。
コード
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
const uint8_t MODE= 0b00000001;//5桁7セグメント const uint8_t DSET1= 0b01000100;//固定アドレス const uint8_t DSET2= 0b01000000;//移動アドレス const uint8_t ADRS= 0b11000000 | 0 ;//アドレス00H const uint8_t DISP= 0b10001001;//表示設定:2/16 uint8_t DIO=9; uint8_t CLK=10; uint8_t STB=11; uint16_t num; uint8_t d[10]={0b01111110,0b00001100,0b10110110,0b10011110,0b11001100,0b11011011,0b11111010,0b01001110,0b11111110,0b11011110}; void setup() { pinMode(DIO,OUTPUT); pinMode(CLK,OUTPUT); pinMode(STB,OUTPUT); digitalWrite(STB,HIGH); digitalWrite(DIO,LOW); digitalWrite(CLK,LOW); } void TM1630(uint8_t i,uint8_t j,uint8_t k,uint8_t l){ digitalWrite(STB, LOW); shiftOut(DIO,CLK,LSBFIRST,MODE); digitalWrite(STB, HIGH); digitalWrite(STB, LOW); shiftOut(DIO,CLK,LSBFIRST,DSET1); digitalWrite(STB, HIGH); //一桁目 digitalWrite(STB, LOW); shiftOut(DIO,CLK,LSBFIRST,ADRS); shiftOut(DIO,CLK,LSBFIRST,d[i]); digitalWrite(STB, HIGH); //二桁目 digitalWrite(STB, LOW); shiftOut(DIO,CLK,LSBFIRST,ADRS|2); shiftOut(DIO,CLK,LSBFIRST,d[j]); digitalWrite(STB, HIGH); //三桁目 digitalWrite(STB, LOW); shiftOut(DIO,CLK,LSBFIRST,ADRS|4); shiftOut(DIO,CLK,LSBFIRST,d[k]); digitalWrite(STB, HIGH); //三桁目 digitalWrite(STB, LOW); shiftOut(DIO,CLK,LSBFIRST,ADRS|6); shiftOut(DIO,CLK,LSBFIRST,d[l]); digitalWrite(STB, HIGH); digitalWrite(STB, LOW); shiftOut(DIO,CLK,LSBFIRST,DISP); digitalWrite(STB, HIGH); } void loop() { uint8_t a,b,c,d; for(num=0;num<10000;num++){ a=num/1000;//4桁目 b=(num%1000)/100;//3桁目 c=((num%1000)%100/10);//2桁目 d=((num%1000)%100%10);//1桁目 delay(100); TM1630(a,b,c,d); } } |
今回使用している表示モードは【固定アドレスモード】です。表示アドレス毎にデータを送信して次のアドレスに移ってデータを送信しての繰り返しです。一方の【動的アドレスモード】はデータを送信するたびにアドレスがインクリメントされます。データのクリアなど連続してデータを送る場合はそちらの方がいいかもしれませんね。
そして、通信の方式はデータシートに記載されている以下のフローに沿って行っています。
- Command 1. 表示モードの設定(5桁7セグメント設定:0b00000001)
- Command 2. データ送信の設定(固定アドレス:0b0b01000100)
- Command 3. 表示アドレス設定(一桁目:0b11000000)
- Command 4. LED表示データ設定(SEG2~8の出力定義。例えば0なら0b01111110)
- あと3回Command 3と4を繰り返す。
- Command 5. 表示出力(PWM)設定(パルス幅2/16設定:0b10000001)
そしてデータの送り方は【shiftOut】関数を使用しています。この関数は1byteのデータを1bitずつ指定の変数に出力します。そして出力ごとにクロックを出力します。また、出力の方向は下位ビットから出力するので【LSBFIRST】で設定してください。
うまく書き込むことが出来たら100sec毎にカウントアップする表示機ができるかと思います。
自作ライブラリ紹介
最後に、このLEDドライバ用の自作ライブラリをGithub公開しているのでその宣伝になります。
*new-fileのブランチの選択をお願いします。
内容はDisp(uint16_t)の引数に表示したい数字を入れると7セグ表示機に出力されるシンプルなライブラリになります。気を付けて頂きたいのが5桁を入力してしまうと3桁しか表示されません。引数にuint16_tを設定していますが、実質0-9999までが対応範囲です。
<ライブラリ関数::TM1630LED led(DIOPin, CLKPin, STBPin)>
- led.Begin() ループ開始前に一度だけ実行してください。各ピンの初期出力の設定。
- led.Clear() 表示機のバッファクリアです。内部的にはディスプレイONになっています。
- led.Disp(uint16_t) 引数に0-9999を入れてください。
注1)Arduino関数を使用しているので結構容量がでかいです。普通に使用すると余裕に1000byte超えます。余裕があったら容量削減のバージョンアップを行う予定です。
おわりに
今回はLEDドライバ【TM1630】を紹介しました。
私自身も通信タイプのLEDドライバを使用しましたが思った以上に便利でしたね。何より3線だけで最大7セグメントLEDを5個操作できるのは魅力的です。
あと便利だなー、と思ったのが調光機能です。普通LEDを使用するときは電流制限抵抗を使用すると思いますが、おそらくこれは内部トランジスタとPWM制御で調光しているのでLED直挿しでいけるのがいいですね(個人的な意見です)。
でも中国語のデータシートってのが厄介でしたね。私の知識不足ですが、日本メーカーでこれみたいなLEDドライバ出ていないんですかねー
では、今回はこんなところで!
ではでは~
コメント