メインコンテンツに移動

テープLED

知らなかったのですけれども、テープLEDは何種類かあるようです。そういうものがあるということは知っていたが、あまり興味もなかったのでよく調べないで「ありますよ」みたいな話を周囲にしていた、Arduinoでできてるんだったらmbedなら特に問題ないでしょう的な感触で考えていましたが、ちょっと、私の手に負えない感じでした。

秋月で販売されているこちらのテープを購入してみました。SK6812使用マイコン内蔵フルカラーテープLED 1m 30LED

SK6812がマイコンでWS2812Bというのが、LED込みの部品ということなのだろうか、、どちらも似たことが書いてある。して、その仕様だがなんでこのように特殊なのだろうか、、1wireで信号を送るために「うまくやってる」ということかしれないがもう少しロジックを考えてほしい(と感じた、すいません。自身の力がないのを人のせいにしております)。

送信仕様は、0と1をパルス幅で表現しておりかつその周期が固定である。(TL+TH=1250μsつまり、800KHz)

で、その時間ですが、SK6812とWS2812Bとで記載が違っております(秋月の部品説明には両方のデータシートがリンクされております)

name Description SK6812 WS2812B tolerance
T0H

0 code, high level time

300ns 400ns ±150ns
T0L 0 code, Low level time 900ns 800ns ±150ns
T1H 1 code, high level time 600ns 850ns ±150ns
T1L 1 code, Low level time 600ns 450ns ±150ns
Trst Reset code 80μs >50μs  

で、送信される仕様ですが、また特殊です(最初、シフトレジスタと同じだと勘違いしていましたが、ロジカルに詳しい人に指摘されて気づきました)

Cascade接続 Data Transmission method

送信方法を見てわかるように、シフトレジスタにしてはなんか変ですよね。D3(三つ目のLED)には3番目の24bitだけが送信されている。つまり最初の24bitは1つ目のLEDに送信され、2つ目の24bitはLED1が送信しなおしている、受信が終わったLEDはそれ以上の受信をしない。シフトされるがデータはラッチされている。

で、これをどうやって送るのか。私の頭ではSPI通信でbit数増やせばPWMができるなと考えた。SPIで送るデータを連続する1の数で表現する。しかし、通常のmbedのSPIではデータ送信ごとに2μs程度の空き時間が入るため、Low時間が長くかかりすぎてタイミングが合わない。私の場合、ここで詰まってしまった。

ググると、次のページがヒットする。

https://os.mbed.com/users/okini3939/notebook/led_strip/

ここに書いてあるのは純正のmbedとLPC系のものみたいでKinetisとかでは動かないと書いてるコメントもある。SPIのレジスタを直接操作して送信割り込み(たぶん送信終了割り込み)をトリガにして次の送信をする仕組みなんだと思う。Kinetisのとき、ここをどうやって書けばいいかわからない。

Arduinoのライブラリが多数あるのでそれを参考してみようとおもったら、同じようなことをしているっぽくてよくわからないです。あまり低レベルの込み入ったソフトって理解が低くてわからないです。そう思って、先のページのコメント欄を見ていると、FRDM-KL25でつくったよみたいな書き込みがあった。そのコメントそのまま引用する。

I have written a multiple-strip library for the FRDM-KL25Z driving the WS2812/WS2811 

http://mbed.org/users/bikeNomad/code/Multi_WS2811/

By changing the timings from 800kHz to 400kHz and changing BGR to RGB order, you could drive the UCS1903 with it as well.

Also, the 74HCT series is fine for level translation, having TTL input thresholds and able to be run from 5V. My code doesn't want to have any inversion; I'm using a CD4504B to do translation because I had a few lying around.

グーグル先生によると

WS2812 / WS2811を駆動するFRDM-KL25Z用のマルチストリップライブラリを作成しました
http://mbed.org/users/bikeNomad/code/Multi_WS2811/

タイミングを800kHzから400kHzに変更し、BGRをRGBオーダーに変更することで、UCS1903をそれで駆動することもできます。また、74HCTシリーズはレベル変換に適しています。TTL入力スレッショルドがあり、5Vから実行できます。私のコードは反転を望んでいません。何人か横になっていたので、CD4504Bを使用して翻訳を行っています。

と、いうことで、この人のライブラリを利用させてもらうとうまく動かせたので、いったん終了。

しかし理解はできていないです。

  • パルスを作るのにタイマーを使っている
  • DMAを使ってタイマーの値をセットする
  • タイマーの終了割り込み(たぶん)で次のDMAを開始している(たぶん)

mbedでレアな部分を書けるように勉強したほうがいいのか、MCUXpressoで一から勉強しなおしたほうがいいのか、悩む。知った人に言わせたらどっちでも同じ、と言われるかも。

 

 

 

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
  • 行と段落は自動的に折り返されます。