2013年7月17日水曜日

フルカラーLEDドライバICp9813について

先日デジットで入手したフルカラーLEDモジュールの制御に成功したのでそのメモを。


まず、入手した部品の紹介から。
今回はこの部品。

この中にフルカラーLEDとドライバICのP9813が樹脂封入されてる。
制御自体はクロック(CI)とデータ(DI)の2線にクロックの立ち上がりで逐一ビットデータを送信するだけ。

このLEDドライバのすごいところはLEDモジュールをデイジーチェーンで配線できるところ。
つまり、LEDモジュールを数珠つなぎに伸ばして、しかもそれをたったの2線で制御できる。

「フルカラーLEDをたくさん光らせたいけど手持ちのマイコンのピン数たりねー」とかおもっていたので、衝動買いしてしまった。


さて、このドライバICの制御を解説をしていくとしましょう。

まず、このドライバICのシリアル通信の仕様について
このICはCIピンの立ち上がりエッジでDIピンの値を読み取る。

立ち上がりエッジってのは電気信号がLからHに変わる時の事。図にするとこんな感じ
つまり、マイコンでCIピンを一度Lowレベルに落としてから、
ビットのデータをDIピンにセットして、再度CIピンをHighにするとドライバICがビットのデータを読み取るわけだ。

次にデータの送信手順について、
このICではデータのスタートフレームをLの32bitと定義している。
つまり、Lowの信号を32回送ればいい。
次に、1番目のLED(直接マイコンに繋がれてるLED)についてデータ
その次に2番目のLEDのデータ、3番目のLEDのデータ・・・n番目のLED・・・とデータを送信していく。
最後にデータの送信が終了したらストップフレームを送信する。
このストップフレームはスタートフレームと同じ信号Lの32bitを送信する。

で、肝心のLEDの制御データの中身はと言うとこんな感じ。


写真はデジットで貰った取説を携帯のカメラで撮ったものです。
(デジットさん勝手に使ってごめんなさい。m(_ _)m)

データフレームの長さは32bitで
中身はこんな感じ。

  • フラグビット(H_H) 2bit
  • 青色用チェック(B7,B6のぞれぞれ反転) 2bit
  • 緑色用チェック(G7,G6のぞれぞれ反転) 2bit
  • 赤色用チェック(R7,R6のぞれぞれ反転) 2bit
  • 青色データ(B7~B0) 8bit
  • 緑色データ(G7~G0) 8bit
  • 赤色データ(R7~R0) 8bit


後は、これに合わせてRGBそれぞれのデータを8bitで送信してあげれば上手くいくと思ってた。

が、落とし穴が一個。
取説には制御データのコードは「グレイコード」と書いてある。
正直、「グレースケール」のタイポだと思ってたら違った。

Wikipedia:グレイコード 

調べて驚いたのが、アブソリュートエンコーダの信号なんかがこれで構成されているらしい事。
詳しい話はWikipediaの「利点」のところを参照して欲しい。

符号化の仕方は簡単。
「変換したい2進数」
「変換したい2進数を1ビット右にシフトし、先頭に0をつけたもの」
のXORをとるだけ。

これらをmbedで実装してみた。

mbedのサイトで公開したので興味ある方は参照して。
http://mbed.org/users/MrBearing/code/FullColorLEDControl/

(回路図作ってアップしたいけど作るのめんどくさい。。。。)
モジュールのDIをp10、CIをp11に繋げば動きます。

動作動画





取説だと12Vいることになってますが、5Vの電源でもとりあえず駆動するのでmbedのVoutとGNDをそれぞれ対応する線につないで電源入れれば駆動します。

今後の課題としては

  • LEDを一つしか点灯させていないので複数制御を達成する
  • Colorクラスの実装(特にHSVtoRGBみたいなのとかの実装)
  • ドライバコントローラーのクラス化・スレッド動作化
  • 送信クラスのstream化
  • 表示までの遅延時間の計測
ってとこですかね。

0 件のコメント:

コメントを投稿