Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

The MagPi マガジン115号にあったLEDテープを音声認識で動作させるプロジェクトを試してみました。これは2年ほど前の88号で取り上げられたもので、115号では更に音声認識でオンオフする仕組みと、Raspberry Pi 4で紹介されています。

たまたま手持ちのLEDテープがあり、その他必要なブレッドボードやワイヤー類もありました。

ただ、音声認識が上手く行きませんでした。

仕方ないので、Pythonコードを修正して、タクトスイッチでオンオフすることにしました。ただのスイッチになってしまった。

LEDテープ以外にも細かなパーツは必要ですが、比較的に簡単な部類の電子工作です。Pythonのプログラムもそこまで難しくありませんでした。

The MagPi マガジン115号71ページに「Christmas lights」とあり、詳細はリンク先となっています。

Make your own smart Christmas tree lights — Raspberry Pi Official Magazine

必要な物

今回は紹介しているマガジン115号の通り、Raspberry Pi 4で試しました。他のモデルでも良いと思います。

サーキット(回路)を作る関係で、ブレッドボードを始め、電子工作できる部材がないと厳しいです。

特に5Vの電圧でLEDへ単独で送る外部電源が必要となっています。単三電池4本のケースにプラスマイナスのコードが出ているユニットが手元にありました。

電池ボックスの電源

Raspberry Pi のGPIO端子にある5Vを使うより安定するということだと思います。

LEDテープもws281xに対応したneopixelが必要です。手持ちに1m144個の物しかありませんでした。144では多すぎると書いてありました。

一応チラつくけど144個も点灯できましたよ。プログラム内で30個しか光らせないこともできるので、別に30個の製品ではなくても5V対応ならOKです。ただ、LEDテープの長さは1mの物が良いでしょう。5V電圧で光る物が必要です。

細かい点では、ジャンパーワイヤーが数本必要なのと、抵抗(220Ω)が1つ要ります。

ジャンパワイヤー

私は電子工作用がまとめて入っているツールから使いました。(OSOYOO Raspberry Pi 学ぶ電子工作キット)

まとめるとこうなります。

  • Raspberry Pi 4B(他のモデルでも可)
  • LEDテープ(NeoPixel/WS2812/SK6812 互換)1m30/60/144LED等
  • ブレッドボード
  • ジャンパーワイヤー(オス-メス3本、オス-オス2本)
  • タクトスイッチ×1
  • 220Ω抵抗×1
  • 5V電源(使ったのは単三電池4本ケース)
  • USBマイク(音声認識するなら)

音声認識しないなら、マイクも要りませんし、スイッチを使わないならタクトスイッチも抵抗も要りません。電気系は詳しくありませんから明確にはお伝えできませんが、ブレッドボートに外部電源を用いたので確かに安定しています。

LEDテープはWS2812、144連、5Vのラインナップは豊富に選べます。

回路図

タクトスイッチ含め、ブレッドボードへ配線した図です。

実際はこんな感じ。

smartlights.pyの変更

参考までに修正したPythonコードを晒しておきます。元々あった音声認識に関する記述を削除して、スイッチのオンオフでLEDがオンオフするように修正しただけです。

LEDカウントは60個にしてあります。144個のテープでも60個だけ光ります。

音声認識しないsmartlights.pyのコード

import time

from gpiozero import Button

import board
import neopixel

button = Button(21)

# LED strip configuration:
LED_COUNT   = 60      # Number of LED pixels.
LED_PIN     = board.D18      # GPIO pin
LED_BRIGHTNESS = 0.2  # LED brightness
LED_ORDER = neopixel.GRB # order of LED colours. May also be GRB, GRBW, or RGBW

# Create NeoPixel object with appropriate configuration.
strip = neopixel.NeoPixel(LED_PIN, LED_COUNT, brightness = LED_BRIGHTNESS, aut>

# Setting variables for a specific sequence
red = (255,0,0)
green = (0,255,0)
flip = 0

#flag追加
flag = 0

# Function to make an alternating series of lights
def merrychristmas():
    global flip
    for i in range(90):
        if flip == 0:
            strip[i] = red
            flip = 1
        else:
            strip[i] = green
            flip = 0
    strip.show()

merrychristmas()

while True:
    button.wait_for_press()
    button.wait_for_release()

# ここから変更(音声認識なし)
value = flag

    if value == 0:
        strip.fill((0,0,0))
        strip.show()
        print("消しました")
        flag = 1

    if value == 1:
        merrychristmas()
        print("点けました")
        flag = 0

具体的に言うと、valueに入れていたGoogle Speech Recognitionをやめて、単にFlag判定でオンオフするように変更しました。

オフならLEDを消して、flagはオンに変更するシンプルな物です。

オフにするのは元からある記述の通りで、flag判定を反対にします。(0→1) オンにするのも元の記述通り、merrychristmas()を実行した後、やはりflag判定を逆にします。

def merrychristmas()で定義されているLEDの光り方を、好みに記述を変えて楽しめます。 もしくは、同じようにdefで定義してあげて、複数の光り方を指定しても良いでしょう。

プログラム自体はキーボードの割り込み(Ctrl + C)で終了します。それまでずっとスイッチの入力を待つだけです。

本来は、スイッチを押して喋ると(「lights on」)認識してオンオフができるというものでした。どうも音声認識が機能しない。USBマイクでテストのコードではOKなんですけどね。

——もしかしてGPIOのピンを変えたらいいのか? 今回は音声認識を断念・・・。

rpi-led-strip-title

■Pi 5は8GBモデルがオススメ

必要なソフトウェアやライブラリのインストール

音声認識は以下のライブラリやpyaudioなどを順番にインストールします。

sudo apt update
sudo pip3 install SpeechRecognition

sudo pip3 install pyaudio && sudo apt install flac

sudo apt-get install portaudio19-dev python-all-dev python3-all-dev && sudo pip3 install pyaudio

python3 -m speech_recognition

最後の箇所でUSBマイクを繋いであれば、録音のテストができます。入力の音量が30くらいか無かったので、なかなか取得されませんでした。これを80などに上げるのに、alsamixerを使うと簡単です。(コマンドでalsamixer

その後、以下のLEDであるneopixelを制御するツールをインストールして終わりです。音声認識を使わないなら、以下だけでOKです。

sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel

サンプルプログラムはgitでクローンして、中にあるneopixel_rpi_simpletest.pyでLEDの点灯テストができます。

git clone https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel

元になったプログラムは、MagPiマガジンにあったsmartlights.pyを使います。このファイルを修正しました。

git clone https://github.com/themagpimag/magpi-issue88

Pythonプログラムの自動実行

再起動後に、Pythonを実行させて、常に待機するよう/etc/profileに登録します。これでRaspberry Piの電源を入れるだけでボタン操作待ちとなります。(最初は点灯)

sudo nano /etc/profile
sudo python3 /home/pi/smartlights.py &&

自動実行は5種類くらい方法があります。ケースバイケースなのですが、今回は自前のプログラムである.pyを起動するだけなので、これでOKです。

音声認識の部分

プログラムコードの変更は動作確認しただけです。間違っていたらスミマセン。

どうも音声認識はマイクではなく、alsaのエラーもあって上手く出来ませんでした。マイク入力に関してはちょっと調べ方が足りないかも知れません。

MagPiマガジンと同じようにできると思います。(出来たらまた追記しておきます)

比較的に安価な部品で出来る割に、1mもあればクリスマスツリーだけでなく、アイディアによってはそれなりに映える気がします。

直接繋ぐ場合

Raspberry PiのGPIOと直接繋ぐのに分かりやすい動画がありました。

DC5Vで別電源も繋げれば長いLEDテープも制御可能です。

先ずは30個程度から試してみるのが費用も掛からず良いでしょう。

WS2812B系ならドライバも対応していてRaspberry Pi をコントローラーにできますね。お試しあれー。

今回使ったLEDテープはこちら

Pi 5で使うライブラリ

Raspberry Pi 5のSPIインターフェイスに接続したNeoPixel LEDストリップにコマンドを送信できるPythonライブラリを見つけました。

WS281x系に対応しているので、Pi 5でこれまでのライブラリが動作しない場合に試してみたいですね。

Raspberry Pi 5 の SPI インターフェースを介して NeoPixel LED ストリップを制御する Python ライブラリ Pi5Neo をリリースしました。わずか数行のコードで、レインボー サイクル、ローディング バーなどの素晴らしい照明効果を作成できます…

PyPI

Pi5Neo A NeoPixel LED control library for Raspberry Pi 5 using SPI