asumism

あすみん(@an_asumin)のブログやで

TLC5940をArduino以外でも使いたいヒトへのメモ

近況

  • はんだごて,どちゃくそ融けた

f:id:an_asumin:20130927013411j:plain

  • はんだ,無くなった

f:id:an_asumin:20130927013451j:plain

作業できないので何かいっぱい書こう.

本題

フィジカルコンピューティングってArduinoから入門するヒトが多いと思う.そして,LEDをたくさん光らせたいって思って,LEDドライバの存在を知ったりして,LEDと一緒にドライバICのTLC5940を入手するヒトもたくさんいると思う.ArduinoはTLC5940のライブラリを提供してくれてるヒトがいるから,すぐLEDの制御ができる.でも,いざArduino以外のボードでもLEDを制御したいぞってなったときに,実際にTLC5940が何をしてるのかわからなくて,取っ付きにくいと感じてしまうヒトもいるんじゃないかな.*1
Arduinoはシールドやライブラリによってラピッドに創作が出来るのが魅力だから,Arduinoで出来る事であればArduinoでやればいいと思う.でも,せっかくのフィジカルコンピューティングなのだから,もっと低レイヤも見てみる面白みにも触れられたらいいよね.ってことで,このメモがドライバを書くための参考になったり,データシートを見るとっかかりになったりすればいいと思う.

TLC5940の概要

実際のところは,データシートが全てなので,DLしてなんとなく見てみるのがいいと思う.
http://www.tij.co.jp/jp/lit/ds/symlink/tlc5940.pdf


ArduinoとTLC5940で遊んだことがある人なら,おおまかな配線イメージ*2に加えて,以下の特徴は知ってると思う.

  • 16chのLEDの明るさの制御ができる
  • デイジーチェーン*3ができる


そこで,その他の特徴を簡単にまとめる.

  • Vcc(電源)は3Vから5.5Vまでオッケー*4
    • この電圧がロジック(制御に使う他のピン)のHIGHの基準になるので*5,制御するICのロジックのHIGHが少なくとも3V以上でないと面倒なことになる
  • LEDのシンク電流は60mAから120mA
    • Vccが3.6V未満なら60mA,それ以上であれば120mAまで各LEDに電流を流せる
  • LEDに与える電圧は17Vまでオッケー
    • よくあるLEDは定格が約3V/20mAとかなので,いろんなLEDが使える*6
  • データ転送レートは30MHzまでオッケー
    • PICならそこまで速度は出ないけど,制御ICのPWM*7やSPI*8の機能がどれくらいの速度で信号を出力できるかは確認した方がいい
  • ドットコレクション機能がある
    • LEDに合わせて明るさのレンジ自体を変える機能のことで,初期化の際に最低限制御する必要がある
  • 温度によるエラーやLEDの故障*9を検知できる機能がある
    • より高度な制御のために:-)

LED選び

以下のふたつを守っていれば,どんなLEDでもいい.

  • 流す電流は120mAまで*10
  • 与える電圧は17Vまで

ただし,フルカラーのLEDを制御したいよってヒトは,アノードコモン*11のLEDを選ぶとよい.
また,LEDを健康に使いたかったら,与える電圧とLEDの定格から抵抗値を計算*12して,抵抗を挟んだほうがいい.特にフルカラーのLEDの場合は各色によって特性が違うので,各チャンネルごとに抵抗を挟んだほうがいい.

TLC5940の各ピンの役割

それぞれのピンの役割をまとめる.
ピンの配置はデータシート6ページを参照.

ベーシックなピン
  • OUT0〜15: LEDの制御に使うピン
  • VCC: 電源ピン(+)
  • GND: 接地ピン(-)
動作の設定に関わるピン
  • IREF: 各チャンネルに最大何mAの電流を流すかを設定するピン
    • このピンとGNDの間に挟む抵抗の値によってLEDに流れる電流量が変化する
    • データシート14ページの式(6)を参照
  • DCPRG: ドットコレクションの値をTLC5940のEEPROMに保存する(LOW)か,レジスタに保存する(HIGH)かを決めるピン
    • EEPROMに保存すれば電源投入時に毎回ドットコレクションの値を与えなくて済むのだけれど,結構使いにくいので,よっぽどでなければ常にHIGH(VCCと同じ電圧を常に与えるのでGPIO*13でなくていい)でよいと思う
  • VPRG: ドットコレクションモード(HIGH)とグレイスケールモード(LOW)を切り替えるピン
    • グレイスケールモードはLEDの明るさデータを送る通常のモードのこと
    • ドットコレクションの値をEEPROMに保存するにはこのピンに22Vもの電圧を与える必要があるので使いにくい
    • GPIOピンでの接続がよい
LEDの点灯に関わるピン
  • BLANK: HIGHでLEDが強制的にOFF,LOWで元に戻る.
    • LEDを常時点灯させるためにも使うので重要
    • PWMが使えるピンでの接続がよい
  • GSCLK: LEDの明るさを変化させるためにクロック*14を入力するピン
    • PWMが使えるピンでの接続がよい
グレイスケールデータやドットコレクションデータの通信に関わるピン
  • SIN: データを入力するピン
  • SOUT: シフトレジスタからはみ出たデータが出てくるピン
    • シフトレジスタは,TLC5940内部のデータの入れ物
    • デイジーチェーンする際には,SOUTを次のTLC5940のSINにつなぐ
    • SOUTからの信号を受け取ればエラー情報などを受け取ることが出来る
  • SCLK: データを送り出すときのクロックを入力する
    • 制御にSPI通信が使えるのであれば,SIN,SOUT,SCLKのピンをセットで使うといい
  • XLAT: レジスタの内容を確定させる(ラッチする)ピン
    • 通常はLOWで,シフトレジスタへの入力が完了したらHIGHにした後,LOWにする
    • GPIOピンでの接続がよい
その他のピン
  • XERR: エラーを検知するピン
    • 必須ではない
    • エラー検知でLOWになる
    • オープンドレイン*15で繋げる必要がある

で,どう制御するの

結局のところ,それぞれの制御ICによるし,私はIOIO-OTGでTLC5940を使いたくてドライバを書いた.
でも,全体として言えることがいくつかあるのでまとめておこうと思う.
データシート12ページの図11をみるとかなりのことがわかると思う.

点灯について

明るさの制御は,GSCLKに対して一定のクロックを入力することで達成される.
明るさは12bitの4096段階であり,実際にTLC5940が4096個のクロックパルスをカウントしていくことで各チャンネルのPWM制御が実現される.
クロックパルスは4096個までしかカウントされないので,一瞬だけBLANKをHIGHにすることで,そのカウンタをリセットする必要がる.
よって,GSCLKとBLANKは共にPWMで制御し,その周波数の比を4096:1*16にすることで常時点灯が実現できる.
Arduinoのライブラリもこんな感じで制御してる*17

データの送信について

SPI通信機能が使えるならSPI通信を使って,ラッチはGPIOを使えばいいと思う.
全てGPIOでもなんとかなるけど,速度には期待できない.
データは,最も遠くのチャンネルの最も大きいビットから順に詰めて送信する.
グレイスケールデータならTLC5940が1個あたり12bit*16ch=192bit.
ドットコレクションデータなら同じく6bit*16ch=96bit.
グレイスケールデータモードに入ってから2回目以降にグレイスケールデータを送信する場合には,始めに193bit目のSCLKが必要だけど,SPI通信機能を使ってるならそこも面倒を見てくれると思う.

初期化について

ドットコレクションの値は,EEPROMに保存してない限り電源投入時には不定のようなので,電源投入時にドットコレクションの値を初期化するのが好ましい.
VPRGをHIGHにしてドットコレクションデータを送ってる最中はBLANKもHIGHにしておくといいかもしれない.
また,電源投入時にLEDに電流が流れて一瞬だけ点灯してしまうのを防ぎたければ,BLANKをオープンドレインにするとよい.

ステータスインフォメーションデータについて

XERRで温度によるエラーとLEDの故障は検知できるけど,SOUTからの信号を受け取れば同等の情報を得ることが出来る.
グレイスケールデータがラッチされると,シフトレジスタの内容がステータスインフォメーションに置換されるので,次のデータの送信に合わせてSOUTを読み出せばいい.
内容は,LEDの故障フラグ,温度エラーフラグ,各チャンネルのドットコレクションの値だ.
データの並びはデータシート18ページの図19を見るといい.



これくらいの情報があれば,それなりに動くドライバを書けるかもしれない.
ちゃんちゃかちゃん!! )^o^(

*1:自分がそうだった

*2:http://tlc5940arduino.googlecode.com/svn/wiki/images/breadboard-arduino-tlc5940.png とか

*3:TLC5940同士を連結することで,たくさんのLEDを制御できる

*4:Arduinoは5V

*5:Arduinoはロジックも5V

*6:PWM制御的なモノであればLEDじゃなくてもいい

*7:PalseWidthModulation: HIGHとLOWを高速に入れ替えて中間的な電圧を作り出したり,クロックパルスの代わりになったりする

*8:ベーシックなシリアル通信方式

*9:正確にはLEDのオープンなので,ちゃんと電流が流れているか否かをチェックする

*10:Vccに与える電圧に注意

*11:電流の入り口が共通なもので,各色の出口(カソード)の方でTLC5940に制御してもらう

*12: (与える電圧-LED定格電圧)/LED定格電流 でよいと思う

*13:普通のI/Oピンのこと

*14:HIGHとLOWを交互に入れ替える信号

*15:プルアップ抵抗をつける回路のこと.ロジックの電圧を変えたり通常のGPIOピンよりも多い電流量を扱えるようにしたり出来る.

*16:4097:1の方が正確なのかもしれないけど,解像度に相談する必要がある

*17:データ送信の割り込み処理とかがいい感じなのでライブラリをチラッと見るのもいいと思う