.. 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 リングはインジケーターライト、ロボティクス、装飾演出、インタラクティブなビジュアルプロジェクトに最適です。