Raspberry Piで簡単にRGB テープLEDを使ってみよう

創立記念日ですのでLチカ(サンプルは点滅していませんが)してみましょう。
2021.07.07

こんにちはCX事業本部のさかじです。
今日は弊社クラスメソッド株式会社の創立記念日です。クラスメソッドといえばブログですのでアウトプットしていきたいと思います。
LEDの色を気軽に制御したい場合、今回使用する制御用のマイコンが入ったLEDも使いやすくおすすめです。通常のRGB LEDよりも高価ですが、制御用の回路が単純ですのですぐに扱うことができます。

環境

組み立て

今回はGPIO21(PCM_DOUT)を使用します。使用するライブラリで決められたポートで使用可能です。
Raspberry Pi向けWS2815のライブラリのREADME.mdを確認すると以下のポートが使用可能です。OSの設定が不要なGPIO21(40ピン)を使用しました。

PWM :

        PWM0, which can be set to use GPIOs 12, 18, 40, and 52.
        Only 12 (pin 32) and 18 (pin 12) are available on the B+/2B/3B

        PWM1 which can be set to use GPIOs 13, 19, 41, 45 and 53.
        Only 13 is available on the B+/2B/PiZero/3B, on pin 33

PCM :

        PCM_DOUT, which can be set to use GPIOs 21 and 31.
        Only 21 is available on the B+/2B/PiZero/3B, on pin 40.

SPI :

        SPI0-MOSI is available on GPIOs 10 and 38.
        Only GPIO 10 is available on all models.
        See also note for RPi 3 below.

Raspberry Pi側

  • 白 : 信号線
  • 黒 : GND

テープLED側

  • 黒 : GND (二本ありますが同じ箇所に接続されています)
  • 赤 : 電源 (二本ありますが同じ箇所に接続されています)
  • 緑/黄 : 信号線 (両方とも同じ信号を送信するためショートしています)

手順

Raspberry Piのセットアップ等は事前に済ませておいてください。

ライブラリインストール

$ sudo pip3 install rpi_ws281x

コード

Pythonで各場合にはこちらのリポジトリを参照してください。本家のリポジトリではきちんと動作せず、こちらを参照する様に記載がありました。

Raspberry Pi向けWS2815のライブラリ(Python)

from rpi_ws281x import Color, PixelStrip

LED_COUNT = 18  # Number of LED pixels.
LED_PIN = 21  # GPIO pin connected to the pixels (must support PWM!).
LED_FREQ_HZ = 800000  # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10  # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 255  # Set to 0 for darkest and 255 for brightest
LED_INVERT = False  # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0
LED_STATE_OFF = Color(0, 0, 0)  # OFF


class Ws281x:
    def __init__(self):
        self.__strip = PixelStrip(
            LED_COUNT,
            LED_PIN,
            LED_FREQ_HZ,
            LED_DMA,
            LED_INVERT,
            LED_BRIGHTNESS,
            LED_CHANNEL,
        )
        self.__strip.begin()

    def on(self, red: int, green: int, blue: int) -> None:
        color = Color(red, green, blue)
        for i in range(self.__strip.numPixels()):
            self.__strip.setPixelColor(i, color)
            self.__strip.show()

    def off(self) -> None:
        for i in range(self.__strip.numPixels()):
            self.__strip.setPixelColor(i, LED_STATE_OFF)
            self.__strip.show

led = Ws281x()
led.on(127, 0, 0)

本コードはgistにおきました。

実行

$ sudo python3 led_ws2815.py

参考サイト

最後に

創立記念日と言うことで豪華なイルミネーションを付けたいと思ったのですが、その辺のセンスはないので赤の点灯のみとなってしまいました。1m, 5mとあり、連結も可能ですのでいろいろなイルミネーションが楽しめそうですね。防水ではないため、屋外で使用する場合には防水加工が必要になります。