結論
-
adafruit-circuitpython-neopixel-spiを使用する
- 本家のadafruit-circuitpython-neopixelはSPIに正式対応していない。
- NeoPixel_SPIのインスタンス化の際に、引数に"bit0=0b10000000"を入れる。
- bit0はNeoPixel dataをSPI dataに変換するための値
import board
import neopixel_spi
pixels = neopixel_spi.NeoPixel_SPI(
board.SPI(),
n = 10, # LEDテープの連結数を指定。今回は10個
brightness=0.01,# 明るさの指定
auto_write = True,# Trueにすることで、pixelsのlistを書き換えたら自動でLEDに伝達される。
pixel_order=neopixel_spi.GRB,# RGBモード
bit0=0b10000000 # デフォルト値は、0b11000000
)
pixels.fill((255, 0, 0))# LEDが真っ赤に光る。
目的と状況
- NeoPixel RGB TAPE LEDをRaspberry Piを使用して制御したい。
- GPIOの配線の都合上、SPI(GPIO 10 (SPI0 MOSI))を利用したい。
- 初めてラズパイでテープLEDを使用するので、ちんぷんかんぷんです🤷♂️
- 勉強したことも含めて、記事を書いていきます。
実行環境
- 使用ラズパイ
- Raspberry Pi 4 Model B
- OS
- Raspberry Pi OS
- LEDテープ
-
NeoPixel RGB TAPE LED
- LEDのマイコンには、WS2812Bが使用されています。
-
NeoPixel RGB TAPE LED
はまったこと
- exampleを起動した直後は正しく制御できますが、数秒経つと制御していたLEDが、明るさMAXで白色点灯します。
- この状態になると、一度スクリプトを停止して、再度実行しなければLEDの色を変更できません。
調べたこと
- 最初にSPI通信とはなんぞやについて調べました。
- 以下のサイトが分かりやすかったです。
-
AnalogDialog SPIの基本を学ぶ
- ただし、今回はきちんとしたSPI通信はしていない(MOSIピンしか使用していない)ので、この事象に対しての直接的な解決策にはなりませんでした。
-
AnalogDialog SPIの基本を学ぶ
- 以下のサイトが分かりやすかったです。
- そもそもどうやってLEDを制御しているのか?
- こちらの公式サイトで勉強しました。
-
NeoPixels on Raspberry Pi Over view
- PWMを用いてLEDの輝度、色などを制御しています。
- LEDテープに使用されているマイコンによって、ON/OFFの周期が違います。
- ↑最終的にこれは事象とは関係ありませんでした。
-
NeoPixels on Raspberry Pi Over view
- 連結通信についてはこちらがわかりやすかったです。
- SPIを使用してLEDを制御する場合のテクニックも公式サイトに掲載されていました。
-
CircuitPython NeoPixel Library Using SPI
- NeoPixel dataをSPI dataに変換する際に、byte変換しています。
-
CircuitPython NeoPixel Library Using SPI
- 上記から、当該現象は、送信しているデータがずれていることが原因のような気がしてきました。
- こちらの公式サイトで勉強しました。
解決策
- ついに同じ事象が発生している人を発見しました。
まとめ
- Raspberry Pi 4Bを利用して、neopixel(WS2812B)をSPIピンで制御できました。
- 正直、SPIでやる人はあまりいないと思いますが、お役に立てれば幸いです。
参考
大変感謝しております。