SSブログ

Raspberry Piで(もうひとつの)フルカラーLED - その2 [Raspberry Pi]

こないだの続き。実際に光らせた。ぱっとみなんか動いてそうだけど、ちょっと変なところに気がついた....

こないだのブレッドボードに乗せたやつは、こんなの
1223testcircuit.png

うーん、わざわざ絵にするほどのことはなかった。ようするにデバグのためで、何を確認したかったかというと、
  • ちゃんと後ろのLEDまでデータが行くか
  • 2系統の数珠つなぎが独立にドライブできているか
  • 2本の長さ(LEDの数)の違うことが吸収できているか
というような感じである。
1225movie.jpg
クリックするとYouTubeのムービにジャンプします
ムービーの中央上でサチってるのはカメラに向けて光らせてる別のLED。LEDの色や輝度が変わるとiPodのカメラの露出がふれて何の絵だかわからなくなったので。iPodのカメラは平均測光から変えられない。

前モデルと異なる挙動

ところがおかしいところがある。例えば一番最初、数珠つなぎの0番目から光強度を上げていってるのに、Raspberry Piに一番近い側ではなく、遠い側から灯っている。色の変化も遠い側から0番目になっている。

前のモデルでは逆だった。それはなぜかというと、前のモデルでは送られてきたデータをまず自分用に使って、それ以上(3バイト24ビット以上)来たら、それ以降を数珠つなぎの後ろに出力する、という仕様だった。なので、データはデータの送り手(今回の場合Raspberry Pi)に近い方から順にデータが使われることになる。

遠い方からということは最初のデータは数珠つなぎの全部を通過しないといけない。そしてLED単独では数珠つなぎの長さも、データがいつ終わるかもわからないわけだから、受け取ったデータは全部流さないといけなくなるんじゃないか?なんだか無駄なような気がしたので、これを会社に持って行ってオシロでデータを眺めることにした。

まず、そもそも波形は仕様通りに出てるか、を確認した。これはLEDへの入力信号。
1225inputsignal.png

横軸が入ってないけど5$\mu$秒/divで、設定は保持時間を3$\mu$秒(1ビットあたり6$\mu$秒)にしたのでもっともらしい。今回のブレッドボードでは1、2$\mu$秒ではエラーが起きてLEDがちかちかした。信号エッジの立ち上がり立ち下がりはあばれてるけどまあこんなもんだろ。

ちなみにこの出力はちゃんとしたオシロのではなく、USB接続の簡単なやつを専用に買った。僕にとっては100MHzが測れる必要はなくて、こんなもんで十分で、すごく安いしコンパクト。WIndowsでしか動かないのはしょうがない(macOS版もあったけど使い物にならなかった。実によくあること)。

そしてこれがひとつのLEDのDIN(青線)とDOUT(赤線)の信号。
1225inout.png

ビット数が多すぎてわかりにくくなってしまったけど、入出力が同時に始まって同時に終わっている。よくみると赤線の出力を24ビット分前に進めると、青線の入力と一致していることがわかる。

ちなみに、前のモデルの入出力信号は
1225oldone.png

同じようにINが青線でDOUTが赤線。細いので先頭だけ拡大したけど、こっちは24ビット受け取るまで出力には何も出ていない。

どういうことか。内部の回路を考えてみる。実際にどうなっているかはわからないけど、おそらくこうだろうという僕の推測。まず、LEDの入力DINにデータが入力される。
1225data.png

前のモデルでは
1225oldmodel.png

のように最初の24ビット分はシフトレジスタに取り込んで、自分用のデータにする(このあとそのままパラに読み込んでRGBそのぞれのPWMのカウンタと比較することになるんだろう)。その間DOUTには何も出さない。シフトレジスタがいっぱいになったら、DOUTに入力をそのまま書き出す。そうすると次のLEDには25ビット目からのデータが渡されることになる。

一方今度のモデルでは
1225newmodel.png

のようにシフトレジスタを素通りする。ただしシフトレジスタの長さが24ビット分あって、DOUTには24ビット遅れたデータがところてん式に出力される。そしてそのまま最後まで受け取ると、シフトレジスタには最後の24ビットが残る。これを自分用のデータにする。次のLEDには24ビット遅れて渡されることになって、自分に渡されたデータが終わった時点で同時に出力をやめる。

次の転送が始まった時には、前の値がシフトレジスタに残ったままになってるけど、そのゴミを含めて次のLEDに押し出す。データの先頭にゴミがどんどん堆積していくことになるけど、データとLEDの数が一致してればゴミは最終的にはすべて捨てられることになる。もしデータの方が長いと先頭から捨てられて、短いと数珠つなぎの後ろの方は前が使ったゴミがデータとして使われることになる。

もし、数珠つなぎの内部でその長さより短い周期パターンが前後するだけの場合(例えば色の変化が場所に対して正弦波的で、その波全体が移動するような場合)には、LEDの全部のデータを用意する必要はない、ということになる。長い数珠つなぎでないと意味はないだろうけど。

なんでこんな仕様変更をしたのか?回路としては前のモデルで必要だったシフトレジスタがいっぱいになったかどうかの判断と、DOUTに出す出さないを決めるゲートが不要になるので、新しい方が少し回路は簡単になる。たいしたことはないとはいえ、全体の回路規模もそれほど大きくはないだろうから、これでもしチップの上での収まりが違って、ウェハの上での数が違ってくるのなら、メリットかもしれない。それともやはりモデルの違いだけではなくてメーカが実質的に違っていて、マスクの流用ができないとか、そもそも特許で作れない、とかかもしれない。

さらに

このLEDは数珠つなぎのためにLED間に電源グランドデータの3本が必要になる。これは前のモデルも同じだった。ところがこのデータシートの最後のページにLED間を2本でつなぐやり方が描いてある。DINとDOUTを繋ぐのは同じだけど電源とグランドを直列つなぎにして、最後のLEDのグランドを戻してくるというようになってる。直列なので5V$\times$LEDの個数のぶんの電源電圧が必要になる。もしLEDを輪っかにするなら、こっちのほうだと配線作業が2/3ですむ、ということになる。

しかしこの場合問題がふたつ発生する。ひとつはLEDを光らしても消しても同じだけの電流が流れないといけない。途中のLEDを消したとき電流が減ったりするとそこに電圧降下が集中してしまう。それを避けるためには内部でLEDと抵抗に電流を割り振って、LEDが消えてるときは電流を抵抗で熱として捨てる、ということをするしかない(実際にそうなってるかどうかはまだ確かめてない。たぶん死ぬまで確かめないだろうけど)。

データシートには電灯線をそのまま整流して電源として使うような回路が描いてある。数珠つなぎの長さが電源電圧で決まってしまうけど、電流はたいしたことない(Typical15mA)ので平滑回路もそれほど大袈裟でなくてもいい、ということだろう。なかなか大胆かつええかげんな発想である。

また、直列にするとデータのグランドがそれぞれのLEDで違ってしまう。3値にした理由がここにあったのかもしれない。中間電位からの立ち上がり立ち下がりだけで1と0を判断できるのでグランドはどこでもかまわないということだろう。内部の耐圧の問題とかいろいろありそうだけど、あまりめんどくさいことは考えない、という思想に基づいていると思われる。

日本の電気会社じゃ絶対アウト、製品企画は即決ボツやで、こんなもん。いや、さすが、たいしたもんだ。

この次は何を考えてくるか、今から楽しみになった。
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。