ロボボボいじりにうってつけのwiki - PL9823の制御

概要

PL9823はマイコン内蔵のフルカラーLEDである。
秋月電子で取り扱っている(2015年3月現在)。
1本の信号線で何個でも制御可能というかなり便利な代物であるが、素子のデータシートと内蔵マイコンのデータシートで内容が異なるなど、いくつか困った点がある。
Arduino用のライブラリがあるらしいが、今回ARMマイコンで使用したので記憶が新しいうちにまとめておく。

詳細

回路構成

VDD,GND,DIN,DOの4ピンで構成されている。
電源電圧は4.5〜6V。
複数連結する場合、DOと次のLEDのDINを接続する。
データシートでは5V周りやDOに抵抗やコンデンサをつけてほしそうな図が載っているが、その図がデータシートによって異なる。

プロトコル

1つのLEDあたりRGBを各8bit、合わせて24bitの信号を送る。
信号線にパルスを送り、そのDuty比によって1が0かが決まる。
各LEDはDINから入力された信号の内最初の24bitのみ受け取り、後のデータは無視してDOから流す。
このことにより、最初の24bitは1つ目のLED、2つ目の24bitは2つ目のLED、3つ目の24bitは3つ目のLEDに、というようになり、複数のLEDを制御することができる。
50us以上Lowを続けると「RESET」となり、次に送ったデータはまた1つ目のLEDに入る。
Duty比に関する記述がデータシートによって異なる。

制御方法

回路

  • 回路図
  • 基板

回路図はあまり考えずに内蔵マイコンのデータシートに従ってしまったが、抵抗を省略することを考えるとLEDのデータシートに従っておけばよかったと思う。
8個で制御した場合は抵抗を省略しても動いた。コンデンサもおそらく省略可能で、少なくともLEDに1つずつにつける必要があるのか疑問である。長く連結させた場合に効いてくるのかもしれない。
基板は並べてはんだ付けすることで連結できるようにした。
LEDの電源は5V。マイコンの動作電圧は3.3Vだがプルアップしてオープンドレインで使用すればよい。

プログラム

使用した周辺回路
マイコンはSTM32F405。
タイマによるPWM出力で制御した。
更新イベント割り込み関数内で次に送るデータが0か1かRESETかを判断し、それに応じてDuty比を更新する。
それらの処理をしている間にもタイマのカウントは進んでいるため、プリロード・レジスタを使う必要がある
制御周期がかなり速く割り込みの頻度の高さが気になったので、データを送っていないときは割り込みをEnableにした。
数値
制御周波数やDutyに関する記述もデータシートによって異なる。
今回は
0duty20%
1duty80%
制御周波数400kHz
としたら動いた。
制御周波数は600kHz、800kHzでも動いたがやや不安定だった。Duty比を調節すれば問題ないかもしれない。
制御周期をかなり速くできるが、かなり速いがためにいろいろシビアである。
例えばマイコンのクロックが8MHz程度の場合、400kHzで制御しようと思うとDuty比の分解能が20しかないことになる。

動画

8個のLEDの色をそれぞれ違う速さで変化させている。