注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。

参加する理由

  • 専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。

  • 学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。

  • 特別割引: 最新製品を特別割引でお楽しみいただけます。

  • 季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。

👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!

1.9 NeoPixel LEDストリップ

はじめに

このプロジェクトでは、Raspberry Pi の SPI 通信を使用して、アドレサブル RGB LED ストリップ(NeoPixel)を制御する方法を学びます。NeoPixel は各 LED にドライバを内蔵した高機能な RGB LED で、チェーン接続された各 LED を個別に制御できます。このプロジェクトでは、基本的な色制御と、LED ストリップ全体をさまざまな色で点灯させる方法を紹介します。


必要なもの

このプロジェクトを完了するには、以下のコンポーネントが必要です。

COMPONENT

PURCHASE LINK

Circular WS2812 LED Module

-

ジャンパーワイヤー

購入

Fusion HAT+

-

Raspberry Pi

-


配線図

../_images/1.9_ws2812_bb.png

セットアップ手順

  1. コードを実行する前に、必要なライブラリをインストールする必要があります。

    このライブラリは、SPI 通信を使用して NeoPixel LED を制御するために必要な機能を提供します。

    sudo pip3 install adafruit-circuitpython-neopixel-spi --break
    
  2. このチュートリアルで使用するすべてのサンプルコードは、 ai-lab-kit ディレクトリに含まれています。以下の手順に従ってサンプルを実行してください。

    cd ~/ai-lab-kit/python/
    sudo python3 1.9_NeoPixel.py
    
  3. このスクリプトを実行すると、WS2812 LED モジュールは 3 色の単色表示を順番に繰り返します。

    • すべての LED が で 1 秒間点灯します

    • すべての LED が で 1 秒間点灯します

    • すべての LED が で 1 秒間点灯します

    各色を表示した後、LED は短時間 消灯 してから、再び同じサイクルを繰り返します。 動作中は、現在の色名がターミナルに表示されます。


コード

以下の Python コードは、NeoPixel LED ストリップを制御し、さまざまな色を順番に表示します。

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 を制御します。

    import time
    import board
    import neopixel_spi as neopixel
    
  2. SPI と NeoPixel の設定

    SPI バスを初期化し、12 個の LED と必要な色順序(GRB)で NeoPixel リングを設定します。

    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 の準備が整ったことを確認したあと、すべてのピクセルを消灯します。

    time.sleep(0.01)
    strip.fill(0)
    strip.show()
    
  4. メインの色切り替えループ

    無限ループの中で、LED リング全体を赤、緑、青の単色で順番に点灯させます。各色は 1 秒間表示されます。

    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 の範囲で指定します。

strip.fill((0, 255, 0))  # Example: green

トラブルシューティング

  • LED リングが正しく点灯しない

    • 原因: 配線ミス、または電源不足

    • 解決方法: VCC が 5V であること、GND が共通であること、そしてデータ線が DIN(場合によっては RGB と表記)に接続されていることを確認してください。

  • 色が正しく表示されない

    • 原因: LED の色順序が一致していない

    • 解決方法: neopixel.RGBneopixel.GRBW など、別の pixel order を試してください。

  • SPI が動作しない

    • 原因: SPI が無効になっている、またはハードウェア競合が発生している

    • 解決方法: sudo raspi-config を使用して SPI を有効にしてください。

  • ライブラリのインポートに失敗する

    • 原因: 依存ライブラリが不足している

    • 解決方法:

    sudo pip3 install adafruit-circuitpython-neopixel-spi --break
    

発展アイデア

  • 特定の LED を異なる色で点灯させることで、簡単なパターンを作成したり、リング上の特定の位置を強調したりできます。

    strip[0] = (255, 0, 0)
    strip.show()
    
  • 計算された RGB 値を順番に変化させることで、すべての LED に滑らかなレインボー遷移を作り出せます。

    strip.fill(wheel(50))
    strip.show()
    
  • 1 つずつ LED を点灯させ、ほかを消灯したままにすることで、追いかけるようなアニメーション効果を作ることができます。

    strip[i] = (0, 255, 0)
    strip.show()
    
  • brightness 属性を調整することで、LED リング全体の明るさを下げたり上げたりできます。

    strip.brightness = 0.3
    

まとめ

このサンプルでは、Raspberry Pi の SPI を使用して WS2812 の 12-LED リングを制御する方法を紹介しました。わずかなコードで色の切り替え、アニメーションの作成、各 LED の個別制御を実現できます。そのため、WS2812 リングはインジケーターライト、ロボティクス、装飾演出、インタラクティブなビジュアルプロジェクトに最適です。