このリポジトリは、D-Robotics RDK X5 上で WS2812B (NeoPixel) を SPI 経由で制御するためのサンプルです。
D-Robotics RDK X5 では rpi_ws281x が未対応ですが、adafruit-circuitpython-neopixel-spi と spidev を用いて安定動作します。
- LED点灯スクリプト: flash_WS2812B.py
- GPIO割り込みサンプル: GPIO_Input_interrupt.py
- LED点灯スクリプト(GPIO割り込みによる点灯パターン変更込み): flash_WS2812B_input.py
- 設定: config.toml
- 依存: requirements.txt
SPIベースでWS2812Bを駆動 (RDK X5 対応)- 外部設定ファイル
config.tomlにより LED 本数・明るさ・SPI バス/デバイス・エフェクトを切り替え - デモモード/単一エフェクトモードの両対応
- 割り込み対応ピン(BOARD 16ピン)を���用して、LEDの点灯パターンを変更
仮想環境を有効化し、依存をインストールします。
python -m venv .venv --system-site-packages # 仮想環境でHobot.GPIOを使用するため、system site-packages込みで仮想環境を構築する
source .venv/bin/activate
pip install -r requirements.txt| Connected | Value | BOARD | BOARD | Value | Connected |
|---|---|---|---|---|---|
10kΩ IN |
3V3 | 1 | 2 | 5V | - |
| - | GPIO2 | 3 | 4 | 5V | WS2812B VCC(25%以下の出力を推奨) |
| - | GPIO3 | 5 | 6 | GND | - |
| - | GPIO4 | 7 | 8 | GPIO14 | - |
| - | GND | 9 | 10 | GPIO15 | - |
| - | GPIO17 | 11 | 12 | GPIO18 | - |
| - | GPIO27 | 13 | 14 | GND | SW OUT |
| - | GPIO22 | 15 | 16 | GPIO23 | SW IN10kΩ IN |
| - | 3V3 | 17 | 18 | GPIO24 | - |
WS2812B DIN |
GPIO10 | 19 | 20 | GND | WS2812B GND |
| - | GPIO9 | 21 | 22 | GPIO25 | - |
| - | GPIO11 | 23 | 24 | GPIO8 | - |
| - | GND | 25 | 26 | GPIO7 | - |
| - | GPIO0 | 27 | 28 | GPIO1 | - |
| - | GPIO5 | 29 | 30 | GND | - |
| - | GPIO6 | 31 | 32 | GPIO12 | - |
| - | GPIO13 | 33 | 34 | GND | - |
| - | GPIO19 | 35 | 36 | GPIO16 | - |
| - | GPIO26 | 37 | 38 | GPIO20 | - |
| - | GND | 39 | 40 | GPIO21 | - |
BOARD 16 (物理ピン) ----+---- タクトスイッチ ---- GND
|
VCC (3.3V) ---- (外部プルアップ 10kΩ)
VCC (5.0V) ---- WS2812B RED
BOARD 19 (SPI1.0 MOSI) ---- WS2812B DIN(GREEN)
GND ---- WS2812B GND(WHITE)
WS2812B DINはレベルシフト推奨: 3.3V から 5V へ論理レベル変換 (長距離・高輝度時は特に有効)
RDK X5 のデバイスノード例: /dev/spidev1.0
存在デバイスは以下で確認できる
ls /dev/spidev*基本の起動 (デフォルトでSPI1.0 を利用する):
python flash_WS2812B.pySPIを指定し、LED 本数を変更する場合:
python flash_WS2812B.py --driver spi --spi-bus 1 --spi-dev 0 --count 60--config オプションにより、外部の設定ファイルを読み込んでパラメータを上書きできる
python flash_WS2812B_input.py --config config.toml[led]
count = 60
brightness = 0.10
[spi]
bus = 1
device = 0
baudrate = 3000000
[effect]
# mode: "demo" で既定のシーケンスをループ実行
# 他に "color_wipe", "theater_chase", "heartbeat", "rainbow", "rainbow_cycle", "theater_chase_rainbow" が選択可能。
mode = "heartbeat"
color = [0, 255, 0]
wait_ms = 50
iterations = 10
loop = true
[gpio]
# GPIO上書き監視の設定。BOARD 16とGNDショートで赤のtheater_chaseを継続
enabled = true # trueで有効化(Hobot.GPIOが見つからない場合は自動的に無効)
pin = 16 # BOARD番号。割り込み対応ピン(例: 13/16/18/22/27/28/32/33/37)を推奨
active_low = false # false で HIGH をアクティブとして扱う(プルアップによりLOW/HIGH を反転した制御)
poll_ms = 100 # 割り込み非対応時のポーリング周期(ms)
pull = "up" # 入力プル設定: "up" | "down" | "none"led.count: LED の本数led.brightness: 明るさ (0.0〜1.0)spi.bus/spi.device: 使用する SPI バス/デバイス番号spi.baudrate: SPI 速度 (WS2812B 用エンコードに安全な範囲で)effect.mode: 実行するエフェクトモード (上記のいずれか)effect.color:color_wipe/theater_chaseなどで用いる RGB 値effect.wait_ms: ステップ間の待ち時間 (ミリ秒)effect.iterations: 反復回数 (一部エフェクトで使用)effect.loop: true なら継続ループ、false なら一度だけ実行
[gpio].enabled: 上書き機能の有効/無効[gpio].pin: BOARD番号で指定
RDK-X5の割り込み対応ピンとしてSPIで使用していない16を推奨[gpio].active_low: Lowが有効(GNDショート)として扱う[gpio].poll_ms: 割り込みに対応していないピン・環境でのポーリング周期
割り込み対応ピンではGPIO.add_event_detectで即時反応します[gpio].pull: 可能なら内部プルを設定
ノイズで誤検出する場合は"up"(既定)を使い、必要に応じて"down"や"none"も選択可能
上書き有効時の動作:
- ショート検出中は赤の
theater_chaseを継続する(解除で自動復帰) - 割り込み対応ピン(例: BOARD 16)ではイベントで即時検出、非対応ピンではポーリングする
注意:
- RDK-X5のGPIOアクセスは
Hobot.GPIOライブラリを使用する(ボードにプリインストール)
権限によってはsudoが必要
例:sudo -E "$(which python3)" flash_WS2812B.py --driver spi --spi-bus 1 --spi-dev 0 --count 60 - 手を近づけるだけで反応するなど感度が高い場合、物理的に10kΩ程度で3.3Vへプルアップ(active_low=true時)することを強く推奨する
- 目的: 誤検出(手を近づけるだけでLOW判定になる等)を防ぎ、入力を安定化させる
- 配線例(active_low=trueの場合):
- BOARD 16(GPIO入力)→ 抵抗(10kΩ)→ 3.3V ピン(BOARD 1など)
- BOARD 16 → スイッチ/短絡先 → GND ピン(BOARD 6/9/14/20/25/30/34/39 など)
- これにより通常時は明確にHIGH、ショート時は明確にLOWになる
- 注意事項:
- 抵抗値は10kΩ前後を推奨(5k〜20kの範囲で調整可能)
- ケーブルが長い/周辺ノイズが多い場合はシールドやレイアウトの見直しも有効
- 内部プル(
pull = "up")は環境により十分でない場合があり、外部プルアップが最も確実
- 割り込み対応ピンの最適化: BOARD 16 を既定とし、
GPIO.add_event_detectで即時反応する
(非対応ピンはポーリング) - 中断・上書きの挙動: 入力が有効(LOW)になると赤の
theater_chaseへ継続的に切り替え、解除で通常エフェクトへ復帰する - 中断の即時性: すべてのアニメーションにプリエンプト用
should_abortを導入し、入力変化やCtrl-Cで即座に中断可能 - 終了処理: Ctrl-Cで安全にGPIO監視停止→LED消灯→終了
以下のスクリプトでBOARD 16の入力状態を確認できる
ショート時にLOW、通常時にHIGHが安定して出ることを確認すること
sudo -E python3 - <<'PY'
import Hobot.GPIO as GPIO, time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16, GPIO.IN, pull_up_down=getattr(GPIO, 'PUD_UP', None))
for _ in range(30):
v = GPIO.input(16)
print('BOARD 16 =', 'LOW' if v == GPIO.LOW else 'HIGH')
time.sleep(0.2)
GPIO.cleanup(16)
PYRDK-X5ではhb_gpioinfoでSoCのピン状態/番号を確認できる
割り込み対応ピンの一例: 13、16、18、22、27、28、32、33、37
参考: https://developer.d-robotics.cc/rdk_doc/Basic_Application/01_40pin_user_sample/gpio
sudo hb_gpioinfo- 事象: 入力が未接続状態で
HIGHにならず、手を近づけるだけでLOWへ誤判定する等 - 原因候補:
- RDK-X5の該当PADが内部プルアップ非対応、またはピンコントローラで未設定
- ユーザー空間ライブラリ(Hobot.GPIO)の
PUD_UPがSoCのPADバイアスを変更できない構成 - 配線長/環境ノイズが大きく、弱いプルで電位が不安定
- 推奨対処:
- 外部プルアップを追加(10kΩ程度で3.3Vへ)
最も確実 - OS側でPADバイアスを設定(Device Tree/overlayで
bias-pull-upを指定)
詳細はD-Roboticsのpinctrlドキュメント参照
https://developer.d-robotics.cc/rdk_doc/Advanced_development/linux_development/driver_development_x5/driver_pinctrl_dev
- 外部プルアップを追加(10kΩ程度で3.3Vへ)
RDK-X5でgpiodetect/gpioinfoが利用可能なら、GPIOラインのバイアス(pull-up/down/none)を確認できる
gpiodetect
gpioinfo # 各ラインの方向/バイアス/消費者名を表示
# 例: 特定ラインの読み取り(gpiochipXのラインY)
gpioget gpiochip0 23gpioinfoの出力にbias pull-upが表示されない場合、内部プルが未設定の可能性がある。
FileNotFoundError: /dev/spidevX.Y: 該当デバイスが存在するかls /dev/spidev*で確認し、--spi-bus/--spi-devを調整する- 点灯が不安定: 電源容量不足、配線長、レベル変換の有無を確認
brightnessを下げると改善することがあるcount = 60,brightness = 0.25,baudrate = 3000000では5V x 0.22A = 1.1Wが最大電力
- 色ずれ・チラつき: SPI 速度 (
baudrate) を既定の 3MHz 近辺に調整し、ケーブル品質を確認する
- Adafruit CircuitPython NeoPixel SPI: https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel_SPI
- D-Robotics RDK Suite 3.1.1 Pin Configuration and Definition: https://developer.d-robotics.cc/rdk_doc/Basic_Application/01_40pin_user_sample/40pin_define
- D-Robotics RDK Suite 3.1.2 GPIO応用: https://developer.d-robotics.cc/rdk_doc/Basic_Application/01_40pin_user_sample/gpio
- D-Robotics RDK Suite 3.1.6 Using SPI: https://developer.d-robotics.cc/rdk_doc/Basic_Application/01_40pin_user_sample/spi
- D-Robotics RDK Suite 3.1.2 Using GPIO: https://developer.d-robotics.cc/rdk_doc/Basic_Application/01_40pin_user_sample/gpio
本プロジェクトは MIT ライセンスです。
詳細は LICENSE を参照してください。
