0
1

More than 1 year has passed since last update.

Raspberry Pi 4Bでneopixel(WS2812B)をSPIで制御してみた

Last updated at Posted at 2023-07-30

結論

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テープ

はまったこと

  • exampleを起動した直後は正しく制御できますが、数秒経つと制御していたLEDが、明るさMAXで白色点灯します。
  • この状態になると、一度スクリプトを停止して、再度実行しなければLEDの色を変更できません。

調べたこと

  • 最初にSPI通信とはなんぞやについて調べました。
    • 以下のサイトが分かりやすかったです。
      • AnalogDialog SPIの基本を学ぶ
        • ただし、今回はきちんとしたSPI通信はしていない(MOSIピンしか使用していない)ので、この事象に対しての直接的な解決策にはなりませんでした。
  • そもそもどうやってLEDを制御しているのか?
    • こちらの公式サイトで勉強しました。
      • NeoPixels on Raspberry Pi Over view
        • PWMを用いてLEDの輝度、色などを制御しています。
        • LEDテープに使用されているマイコンによって、ON/OFFの周期が違います。
          • ↑最終的にこれは事象とは関係ありませんでした。
    • 連結通信についてはこちらがわかりやすかったです。
    • SPIを使用してLEDを制御する場合のテクニックも公式サイトに掲載されていました。
    • 上記から、当該現象は、送信しているデータがずれていることが原因のような気がしてきました。

解決策

  • ついに同じ事象が発生している人を発見しました。
    • github #25 Neopixel with SPI on Raspberry Pi OS (5.4.79)
      • bit0を指定し直せば治りました。
        • bit0はNeoPixel dataをSPI dataに変換するための値です。
          • ここの変換がうまくいっていなかったので、間違ったデータを送ってしまい、制御不能になったと思われます。
          • 環境によっては、bit1も指定する必要があるかもしれません。

まとめ

  • Raspberry Pi 4Bを利用して、neopixel(WS2812B)をSPIピンで制御できました。
  • 正直、SPIでやる人はあまりいないと思いますが、お役に立てれば幸いです。

参考

大変感謝しております。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1