ArduinoとAlexaで制御するアニメーション対応スマートLEDストリップの作り方
必要なパーツと材料
| パーツ | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | Arduino Nanoでも代用可能。より多くのLEDピクセルを駆動する場合はArduino Megaが適しています。 |
| Raspberry Pi 3 Model B | 1 | |
| NeoPixelストリップ (WS2812) | 1 | WS2812ベースのアドレサブルLEDストリップであれば何でも使用可能。 |
使用するアプリとオンラインサービス
- Arduino IDE
- Amazon Web Services (AWS) Lambda
- Amazon Alexa Skills Kit
- Amazon Web Services (AWS) IoT
プロジェクトの概要
アドレサブルRGB LEDストリップの無限の色表現とアニメーション機能に魅了され、筆者は数年前にArduino用ライブラリ「ALA (Arduino Light Animations)」を開発しました。今回はAmazon Alexaを使って、音声で照明とエフェクトを制御できるようにします。
システム構成
本プロジェクトは以下のコンポーネントで構成されます。
- Amazon Alexa: カスタムスキル「Light Strip」が音声対話モデルを定義し、コマンド (インテント) をLambda関数に送信。
- AWS Lambda: Alexaからのメッセージを受け取り、IoTサービスに更新を送信するPythonスクリプト。
- AWS IoT: 「モノのシャドウ」としてRGBストリップの状態を管理。シャドウが更新されるたびに、購読しているMQTTクライアント (Raspberry Pi) に通知。
- Raspberry Pi: MQTTクライアントを実行し、AWS IoTからのメッセージを受信。USB経由でArduinoにコマンドを送信。
- Arduino: ALAライブラリを実行し、Raspberry Piからシリアルポート経由で受信したコマンドに基づきLEDストリップを駆動。Uno、Nano、Megaのいずれも使用可能。
- WS2812 RGB LEDストリップ: 個別に制御可能なアドレサブルLEDで、美しいカラーアニメーションを実現。

各パーツ自体は難しくありませんが、相互接続が多いため、ステップバイステップで着実に構築することをお勧めします。プロジェクトは2つのフェーズに分けて説明します。
第1フェーズ: ハードウェアとWeb制御の構築
筆者のHackster.ioプロジェクト「Web-Controlled LED Animations with Raspberry Pi and Arduino」を参照し、Raspberry Pi、Arduino、WS2812 LEDストリップの接続から、スマートフォンやPCのブラウザからアニメーションを制御できるところまでを完了させます。

第2フェーズ: Alexaによる音声制御の追加
ここからは音声制御を実現するためのクラウド側の設定を行います。手順が多いため、焦らず丁寧に進めてください。
AWS IoTの設定
IoTモノの作成
- AWSコンソールにログイン (アカウントがない場合は無料枠で作成)。
- リージョンを「米国東部 (バージニア北部)」または「EU (アイルランド)」に設定。
- 「IoT」で検索し、「AWS IoT」サービスを開く。「Get Started」があればクリックしてチュートリアルを閉じる。
- セキュリティポリシーの作成: 「Secure」→「Policies」→「Create a Policy」
- Name:
LightStripPolicy - Action:
* - Resource:
* - Effect: Allow にチェック
- 「Create」をクリック
- Name:
- IoTモノの作成: 「Manage」→「Things」→「Register a Thing」→「Create a single thing」
- Name:
LS01(他はデフォルト) - 「Next」→「Create certificate」 (ワンクリック証明書作成)
- デバイス用の3つの証明書とルートCAをダウンロード (ルートCAは右クリックで保存)
- 「Activate」→「Attach a Policy」で先ほどの
LightStripPolicyを選択 →「Register Thing」
- Name:
- エンドポイントの確認: 左下の「Settings」メニューを開き、エンドポイントをメモしておく。

Raspberry Piでモノのシャドウを購読する設定
- AWS IoT Device SDK for Pythonをインストール:
sudo pip3 install AWSIoTPythonSDK - GitHubからLightStripリポジトリを取得:
mkdir -p /home/pi/LightStrip cd /home/pi/LightStrip wget https://github.com/bportaluri/LightStrip/archive/master.zip unzip master.zip - 手順4でダウンロードした4つの証明書を
/home/pi/LightStrip/LightStrip-master/piにコピー。 lightstripcfg.pyを編集 (nanoエディタの場合):
以下の項目を環境に合わせて設定:cd /home/pi/LightStrip/LightStrip-master/pi nano lightstripcfg.pyAWSIOT: 先ほどメモしたエンドポイントROOT_CA: ルートCA証明書のファイル名CERTIFICATE: 証明書のファイル名PRIVATE_KEY: 秘密鍵のファイル名DEVICE_NAME:LS01のまま
- スクリプトを実行:
接続されているUSBポートが表示されるので、Arduinoがsudo python3 lightstrip.py/dev/ttyACM0にある場合:sudo python3 lightstrip.py /dev/ttyACM0
正常に接続されると、クライアントスクリプトがLS01デバイスシャドウにステータスを更新し、ACKメッセージを受信します。

動作確認
AWS IoTコンソールで「Manage」→「Things」→「LS01」→「Shadow」を開き、「Edit」をクリック。以下のJSONを「Shadow state」に貼り付けて「Save」:
{ "desired": { "animation": "101" } }
LEDストリップが点灯すれば成功です。色を青に変えるには:
{ "desired": { "color": "0066CC" } }

AWS Lambda関数の作成
AWS Lambdaはサーバーレスでコードを実行できるサービスで、Alexa Skills KitとIoTの間を橋渡しします。
- AWSコンソールで「Lambda」を選択 (同じリージョンを使用)。
- 「Create Function」→「Author from scratch」
- Name:
LightStrip - Runtime:
Python 3.6 - Role: 「Create a custom role」→新しいタブで「Allow」をクリックし、
lambda_basic_executionロールを作成 - Existing role:
lambda_basic_executionを選択 - 「Create Function」
- Name:
- 右上の Lambda ARN ID をメモ。
- 「LightStrip」ボックスをクリックし、コードエントリタイプを「Edit code inline」に。Runtime: Python 3.6、Handler:
lambda_function.lambda_handler。 - GitHubリポジトリの
LightStrip/lambda/lambda_function.pyとala_controller.pyの内容をそれぞれ貼り付け、「Save」。


Alexaスキルの作成
- Amazon Developer Console にサインイン。「Alexa」→「Alexa Skills Kit (Get Started)」。
- 「Add a New Skill」→「Skill Information」タブ:
- Skill Type: Custom Interaction Model
- Language: English (U.S.)
- Name:
LightStrip - Invocation Name:
light strip - 「Save」→ Skill IDをメモ
- 「Interaction Model」→「Launch Skill Builder」→「Code Editor」に
LightStrip/alexaskill/lightstrip_skill.jsonの内容を貼り付け。「Save Model」→「Build Model」 (数分かかります)。 - 「Configuration」メニューで、Service Endpoint Type を「AWS Lambda ARN」にし、先ほどのLambda ARNを貼り付け。「Save」。



AlexaスキルとLambda関数の連携
- Lambda関数の画面に戻り、右側のトリガー一覧から「Alexa Skills Kit」を選択して追加。
- Application Id にスキルIDを入力、「Add」→「Save」。

完成! 音声コマンドで試そう
以下のコマンドで動作を確認できます:
- 「Open Light Strip」
- 「Turn on」 / 「Turn off」
- 「Set brightness to 20 percent」 / 「Set brightness to 50 percent」
- 「Set color to red」 / 「Set color to turquoise」
- 「Run an exciting animation」 / 「Run a relaxing animation」
より高度な対話も可能です:
ユーザー: Alexa, open Light Strip
Alexa: Welcome to LightStrip - LEDストリップが青く光ります
ユーザー: Launch an animation
Alexa: Do you want a relaxing or exciting animation?
ユーザー: Relaxing
Alexa: OK - ランダムなリラックス系アニメーションを表示
ユーザー: Next animation
Alexa: OK - 別のランダムアニメーションを表示

機能拡張と改良のヒント
起動時に自動でスクリプトを実行
Raspberry Pi起動時に lightstrip.py が自動実行されるよう設定しておくと、手動起動の手間が省けます。systemdサービスや /etc/rc.local への登録などで対応可能です。
アニメーションの追加と調整
Light Stripスキルには20種類のアニメーションバリエーションが定義されていますが、ALAライブラリを使えばプリセット、カラーパレット、速度を組み合わせて独自のアニメーションを簡単に作れます。ala_controller.py の80行目付近にあるアニメーション設定リストを編集・追加してください。
コードとリソース
全コードはGitHubで公開されています: https://github.com/bportaluri/LightStrip
回路図

製造プロセス
- Arduino Nano 33 IoT製 フライトシミュレーター2020用コックピットパネル - LCD&CDI表示
- Microsoft Flight Simulator 2020用Arduinoスイッチ&LEDパネル
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- スマート自動靴紐シューズ:発電機能内蔵で実用性抜群
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- Arduino & MPU6050:SG90 & MG996Rサーボの精密制御
- Bolt IoTとArduino UNOでLED輝度をシームレス制御
- u-blox LEA-6H 02 GPSモジュール: Arduino & Python 統合ガイド
- スマートなArduino制御ロボットアームの製作:簡単DIYチュートリアル
- Arduino Dueでマスターする音声認識と音声合成
- Arduino Unoで8×8 LEDマトリックスを制御:ステップバイステップガイド