.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_ws2812:
1.9 NeoPixel LEDストリップ
==============================
**はじめに**
このプロジェクトでは、Raspberry Pi の SPI 通信を使用して、アドレサブル RGB LED ストリップ(NeoPixel)を制御する方法を学びます。NeoPixel は各 LED にドライバを内蔵した高機能な RGB LED で、チェーン接続された各 LED を個別に制御できます。このプロジェクトでは、基本的な色制御と、LED ストリップ全体をさまざまな色で点灯させる方法を紹介します。
----------------------------------------------
**必要なもの**
このプロジェクトを完了するには、以下のコンポーネントが必要です。
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT
- PURCHASE LINK
* - :ref:`cpn_circular_ws2812_module`
- \-
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**配線図**
.. image:: img/fzz/1.9_ws2812_bb.png
:width: 70%
:align: center
----------------------------------------------
**セットアップ手順**
#. コードを実行する前に、必要なライブラリをインストールする必要があります。
このライブラリは、SPI 通信を使用して NeoPixel LED を制御するために必要な機能を提供します。
.. raw:: html
.. code-block:: shell
sudo pip3 install adafruit-circuitpython-neopixel-spi --break
#. このチュートリアルで使用するすべてのサンプルコードは、 ``ai-lab-kit`` ディレクトリに含まれています。以下の手順に従ってサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 1.9_NeoPixel.py
#. このスクリプトを実行すると、WS2812 LED モジュールは 3 色の単色表示を順番に繰り返します。
* すべての LED が **赤** で 1 秒間点灯します
* すべての LED が **緑** で 1 秒間点灯します
* すべての LED が **青** で 1 秒間点灯します
各色を表示した後、LED は短時間 **消灯** してから、再び同じサイクルを繰り返します。
動作中は、現在の色名がターミナルに表示されます。
----------------------------------------------
**コード**
以下の Python コードは、NeoPixel LED ストリップを制御し、さまざまな色を順番に表示します。
.. raw:: html
.. code-block:: python
import time # Used for delays
import board # Provides board-specific pin definitions
import neopixel_spi as neopixel # NeoPixel SPI driver
# Create an SPI object using the default SPI bus of the board
spi = board.SPI()
LED_COUNT = 12 # Number of LED pixels in the strip
PIXEL_ORDER = neopixel.GRB # Color order used by the LEDs (Green, Red, Blue)
# Create a NeoPixel strip object over SPI
# auto_write=False means we must call strip.show() to update the LEDs
strip = neopixel.NeoPixel_SPI(spi, LED_COUNT, pixel_order=PIXEL_ORDER, auto_write=False)
time.sleep(0.01) # Short delay to ensure the strip is ready
strip.fill(0) # Turn all pixels off (color value 0 = off)
strip.show() # Send the data to the LED strip
try:
while True:
print("RGB test")
# Display red on all LEDs
print("Red")
strip.fill((255, 0, 0)) # Full red, no green, no blue
strip.show()
time.sleep(1)
# Display green on all LEDs
print("Green")
strip.fill((0, 255, 0)) # Full green
strip.show()
time.sleep(1)
# Display blue on all LEDs
print("Blue")
strip.fill((0, 0, 255)) # Full blue
strip.show()
time.sleep(1)
# Turn all LEDs off
# print("Off for 10 seconds")
strip.fill((0, 0, 0)) # All channels 0 = off
strip.show()
time.sleep(1)
# Gracefully handle script termination (e.g., via KeyboardInterrupt)
except KeyboardInterrupt:
pass
この Python スクリプトは、NeoPixel SPI ドライバを使用して、12 個の LED を備えた WS2812 リングの基本制御を行う例です。実行すると、次のように動作します。
1. スクリプトは SPI インターフェースを初期化し、WS2812 LED リングを使用できる状態にします。
2. すべての LED は、1 秒間隔で赤、緑、青の順に点灯します。
3. 色が切り替わるたびに、その色名がデバッグ用としてコンソールに表示されます。
4. 各サイクルの間に、LED は短時間消灯します。
5. プログラムは ``Ctrl+C`` で中断されるまで継続して実行されます。
----------------------------------------------
**コードの解説**
1. **ライブラリのインポート**
このスクリプトでは、 ``neopixel_spi`` ライブラリを使用して、Raspberry Pi の SPI インターフェース経由で WS2812 LED を制御します。
.. code-block:: python
import time
import board
import neopixel_spi as neopixel
2. **SPI と NeoPixel の設定**
SPI バスを初期化し、12 個の LED と必要な色順序(GRB)で NeoPixel リングを設定します。
.. code-block:: python
spi = board.SPI()
LED_COUNT = 12
PIXEL_ORDER = neopixel.GRB
strip = neopixel.NeoPixel_SPI(
spi,
LED_COUNT,
pixel_order=PIXEL_ORDER,
auto_write=False
)
3. **LED の初期化**
短い待機時間を入れて LED の準備が整ったことを確認したあと、すべてのピクセルを消灯します。
.. code-block:: python
time.sleep(0.01)
strip.fill(0)
strip.show()
4. **メインの色切り替えループ**
無限ループの中で、LED リング全体を赤、緑、青の単色で順番に点灯させます。各色は 1 秒間表示されます。
.. code-block:: python
while True:
strip.fill((255, 0, 0)) # Red
strip.show()
time.sleep(1)
# Similar code for green and blue...
**5. 色の形式**
色は ``(red, green, blue)`` の RGB タプルで定義し、各値は 0〜255 の範囲で指定します。
.. code-block:: python
strip.fill((0, 255, 0)) # Example: green
トラブルシューティング
-------------------------
* **LED リングが正しく点灯しない**
- **原因:** 配線ミス、または電源不足
- **解決方法:** VCC が 5V であること、GND が共通であること、そしてデータ線が DIN(場合によっては RGB と表記)に接続されていることを確認してください。
* **色が正しく表示されない**
- **原因:** LED の色順序が一致していない
- **解決方法:** ``neopixel.RGB`` や ``neopixel.GRBW`` など、別の pixel order を試してください。
* **SPI が動作しない**
- **原因:** SPI が無効になっている、またはハードウェア競合が発生している
- **解決方法:** ``sudo raspi-config`` を使用して SPI を有効にしてください。
* **ライブラリのインポートに失敗する**
- **原因:** 依存ライブラリが不足している
- **解決方法:**
.. raw:: html
.. code-block:: shell
sudo pip3 install adafruit-circuitpython-neopixel-spi --break
発展アイデア
------------------
* 特定の LED を異なる色で点灯させることで、簡単なパターンを作成したり、リング上の特定の位置を強調したりできます。
.. code-block:: python
strip[0] = (255, 0, 0)
strip.show()
* 計算された RGB 値を順番に変化させることで、すべての LED に滑らかなレインボー遷移を作り出せます。
.. code-block:: python
strip.fill(wheel(50))
strip.show()
* 1 つずつ LED を点灯させ、ほかを消灯したままにすることで、追いかけるようなアニメーション効果を作ることができます。
.. code-block:: python
strip[i] = (0, 255, 0)
strip.show()
* ``brightness`` 属性を調整することで、LED リング全体の明るさを下げたり上げたりできます。
.. code-block:: python
strip.brightness = 0.3
まとめ
----------
このサンプルでは、Raspberry Pi の SPI を使用して WS2812 の 12-LED リングを制御する方法を紹介しました。わずかなコードで色の切り替え、アニメーションの作成、各 LED の個別制御を実現できます。そのため、WS2812 リングはインジケーターライト、ロボティクス、装飾演出、インタラクティブなビジュアルプロジェクトに最適です。