micro:Maqueen 発話でラジコン! ー Alexa + Node-RED + micro:bit ー
ものすごく便利なNode-REDモジュールを見つけてしまいました。
Node-RED Alexa Home Skill Bridge というもので、仮想のAlexaデバイスを作成して発話応答をNode-REDへ返してくれます。まさにブリッジとなってAmazon Echoへの発話とNode-REDの各種パレットをつないでくれます。
これなんでもできるようになるんじゃ。。。可能性ひろがるぅ 😳
ここではAmazon Echoでコントロールするラジコンカーを作ってみました。
目次
構成
Amazon Echoへの発話応答をNode-RED Alexa Home Skill Bridgeを介して ラズパイZero W上のNode-REDに返して、BLEでmicro:bitに信号を送ります。micro:bitは拡張ミニロボットカーMaqueenに載せて信号を受けて動かします。
部品
- Amazon Echo Dot
- Raspberry Pi Zero W
- micro:bit
- micro: Maqueen
Maqueen詳細については以下参照ください。
Node-RED Alexa Home Skill Bridgeの設定
Node-RED Alexa Home Skill Bridge用のアカウントを作成してロボットカーを制御するための仮想のAlexaデバイスを作成します。
アカウント登録
以下にアクセスして、Resisterをクリックします。
https://alexa-node-red.bm.hardill.me.uk/
ユーザ名とメアド、パスワードを登録します。
デバイス登録
登録後、Devicesタグを選択してAdd Deviceをクリックします。
ロボットカーのモータを回して前進、後進させるためのAlexa用デバイス”回転”を作成しました。
Name: デバイス名 ” 回転” 入力
Description: デバイスの簡単な説明記載
Actions: デバイスの動作種類を選択。ここではOnとOffを選択。
Onで前進、 Offで後進させます。
同様にロボットカーを左右に向かせる”ターン”と、停止させる”ストップ”という2つのデバイスを追加で作成しました。
Alexaスキル Node-RED有効化
スマホのAlexaアプリでNode-REDスキルを有効にしてAlexaサービスとNode-RED Alexa Home Skill Bridgeを紐づけます。
スキルを有効にするとNode-RED Alexa Home Skill Bridgeのアカウント入力画面に切り替わるので、登録したユーザ名とパスワードを入力します。
問題なければデバイス検出画面に移行します。
端末の検出をクリックで作成したデバイスが見つかります。
定型アクションを編集
作成したデバイスの起動するための発話をカスタマイズするために、 Alexaスマホアプリで定型アクションを編集します。
以下のように設定しました。
「アレクサ、前に進め」:デバイス “回転” On
「アレクサ、バックして」:デバイス “回転” Off
「アレクサ、右向け右」:デバイス “ターン” On
「アレクサ、左向け左」:デバイス “ターン” Off
「アレクサ、止まれ」:デバイス “ストップ” On
参考
Node-RED設定
Node-REDにAlexa Home Skill Bridge用のノードをインストールして、発話を受けてBLEでmicro:bitに文字列を送信できるようにします。ここではRaspberry Pi Zero WのNode-REDを使用しました。
我が家ではRaspberry Pi Zero Wを自宅内サーバとして使っていて、コンシェルジュのティラノくんが宿題やったか?とか朝だよーとか言ってくれるのです。
ノードのインストール
node-red-contrib-alexa-home-skillをインストールします。
設定でパレットのインストールでnode-red-contrib-alexa-home-skillを検索して”install”クリックでノードが追加されます。
更にBLEを使用するために以下も同様にインストールします。
node-red-contrib-generic-ble
Node-REDフロー
Alexa-homeノード
作成した仮想Alexaデバイス”回転”、”ターン”、”ストップ”の3つを配置します。
ノードを配置してまずはNode-RED Alexa Home Skill Bridgeで登録したユーザ名とパスワードを入力します。
デバイスを選択します。ここでは”回転”を選択。
同様に”ターン”とストップ”用のノードも配置します。
true/false分岐 ファンクションノード
“回転”と”ターン”デバイスは発話によってtrueとfalseを返すので、ファンクションノードで分岐させます。
BLE送信用文字列 ファンクションノード
“回転”と”ターン”のOn/Offと”ストップ”のOnの発話応用に対応するBLE送信用の文字列を生成するファンクションノードを配置します。
前進(”回転”デバイス On)では文字列 “1:”を送信しています。
micro:bit BLEの書き込み用UUIDと16進数文字列を指定します。
それぞれ以下の文字列を送信します。
前進(”回転”デバイス On): “1:”
後進(”回転”デバイス Off): “2:”
右向(”ターン”デバイス On): “3:”
左向(”ターン”デバイス Off): “4:”
ストップ(”ストップ”デバイス On): “5:”
Generic BLE 出力ノード
Generic BLE outノードを配置して、鉛筆マークをクリックします。
Select from scan resultにチェックを入れ、BBC micro:bit を選択します。
MakeCode
Node-REDからの文字列をBLE介してmicro:bitで受けて、ミニロボットカーを制御します。
ここではMakeCodeでブロックコーディングしてmicro:bitに書き込みます。
https://makecode.microbit.org/
機能拡張
設定アイコン -> 拡張機能をクリックでMaqueen用とbluetooth用のブロックを追加します。
Maqueenブロック追加
以下のライブラリリンクを入力して検索をクリック
1 |
https://github.com/jhlucky/maqueen |
maqueenをクリックでMaqueenのブロックが追加されます。
bluetoothブロック追加
拡張機能でbluetoothを選択。無線ブロックと共存ができないので、無線ブロック削除メッセージが出ます。削除しちゃってください。
bluetooth用ブロックが追加されます。
micro:bitのBLEペアリング設定を変更します。設定アイコン -> プロジェクトの設定をクリックで一番上の”No Paring Required”を選択します。これでペアリング無しで通信が可能となります。
参考
MakeCode ブロック
以下がMaqueen制御用のMakeCodeブロックです。
① 初期設定
変数stateを初期化して、BluetoothがNode-RED(Raspberry Pi Zero W)と接続されるとニコニコマークをmicro:bitのLEDマトリクスに表示します。
② 文字列受信
Node-REDからの文字列を受信してコロン”:”前の文字を変数stateに代入します。
③ 前後進制御
文字列”1:”受信で前進、”2:”受信で後進させます。LEDマトリクス表示もそれぞれ変えます。
④ 右向き制御
文字列”3:”受信で右に90°ターンします。LEDマトリクスにはターン方向の矢印を表示させて Maqueen前方についている赤LEDインジケータ右側をウィンカーのように点滅させてます。ターン後、全て停止します。
⑤ 左向き制御
文字列”4:”受信で左に90°ターンします。LEDマトリクスにはターン方向の矢印を表示させて Maqueen前方についている赤LEDインジケータ左側をウィンカーのように点滅させてます。ターン後、全て停止します。
⑥ モータ停止
文字列”5:”受信でモータ停止し、LEDマトリクスの表示を消します。
MakeCode JavaScript
全体のJavaScriptコードを以下に記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
let state = "" bluetooth.onBluetoothConnected(function () { basic.showIcon(IconNames.Happy) }) bluetooth.onBluetoothDisconnected(function () { basic.showIcon(IconNames.Sad) }) bluetooth.onUartDataReceived(serial.delimiters(Delimiters.Colon), function () { state = bluetooth.uartReadUntil(serial.delimiters(Delimiters.Colon)) }) state = "0" bluetooth.startUartService() basic.showIcon(IconNames.Sad) basic.forever(function () { if (state == "4") { basic.showArrow(ArrowNames.East) maqueen.MotorRun(maqueen.aMotors.M1, maqueen.Dir.CCW, 20) maqueen.MotorRun(maqueen.aMotors.M2, maqueen.Dir.CW, 20) for (let i = 0; i < 3; i++) { maqueen.writeLED(maqueen.LED.LEDLeft, maqueen.LEDswitch.turnOn) basic.pause(200) maqueen.writeLED(maqueen.LED.LEDLeft, maqueen.LEDswitch.turnOff) basic.pause(200) } maqueen.motorStop(maqueen.aMotors.M1) maqueen.motorStop(maqueen.aMotors.M2) basic.clearScreen() state = "0" } }) basic.forever(function () { if (state == "1") { basic.showIcon(IconNames.SmallDiamond) maqueen.MotorRun(maqueen.aMotors.M1, maqueen.Dir.CW, 20) maqueen.MotorRun(maqueen.aMotors.M2, maqueen.Dir.CW, 20) } if (state == "2") { basic.showIcon(IconNames.No) maqueen.MotorRun(maqueen.aMotors.M1, maqueen.Dir.CCW, 20) maqueen.MotorRun(maqueen.aMotors.M2, maqueen.Dir.CCW, 20) } }) basic.forever(function () { if (state == "3") { basic.showArrow(ArrowNames.West) maqueen.MotorRun(maqueen.aMotors.M1, maqueen.Dir.CW, 20) maqueen.MotorRun(maqueen.aMotors.M2, maqueen.Dir.CCW, 20) for (let i = 0; i < 3; i++) { maqueen.writeLED(maqueen.LED.LEDRight, maqueen.LEDswitch.turnOn) basic.pause(200) maqueen.writeLED(maqueen.LED.LEDRight, maqueen.LEDswitch.turnOff) basic.pause(200) } maqueen.motorStop(maqueen.aMotors.M1) maqueen.motorStop(maqueen.aMotors.M2) basic.clearScreen() state = "0" } }) basic.forever(function () { if (state == "5") { maqueen.motorStop(maqueen.aMotors.M1) maqueen.motorStop(maqueen.aMotors.M2) basic.clearScreen() } }) |
動作まとめ
ゴチャついてきたので、動作を一覧にまとめます。
動作
音声でロボットカーを制御できております!
#AmazonEcho でラジコン!ブーン#NodeRED #Alexa #microbit #BLE #MakeCode #DFRobot pic.twitter.com/7vwNAolrhY
— HomeMadeGarbage (@H0meMadeGarbage) 2018年12月19日
ちょっと初期設定が大変かもだけど、ブロック組み合わせるだけで実にフィジカルなVUIアプリを作成できました!
ゴミ箱とか音声で近くに移動してくれたりとかいいかも 🙄
とにかくNode-RED Alexa Home Skill Bridge が神がかって便利なので今後もいろいろ活用考えたいです!
貴重な記事を読ませていただきました。孫を喜ばせようと奮闘していますが1箇所分からないところがありますので教えて頂きたく。「micro:bit BLEの書き込み用UUID」はmicro:bitによって違うのでしょうか?違う場合はどのように確認すればよろしいのでしょうか?初歩的な質問で申し訳ありませんが宜しくアドバイスをお願いします。
お問い合わせありがとうございます。
Generic BLE 出力ノードでmicro:bitを選択して接続するとGATT Characteristics に各プロパティーのUUIDが表示されます。
Write Without ResponseのUUIDを指定してみてください。
早速のご返事有難うございます。やってみます。後ほど結果報告します。
何度かやって見ましたがGATT Characteristics の表示が(not available)になります。前行程の設定がどこか間違っているのでしょうか?
BLEノードでBBC micro:bitは選択可能でしたでしょうか?
パソコンはBLE対応の機種でしょうか?
ご教示のほどよろしくお願いいたします。
はい、BBC micro:bitは選択出来ました。パソコンはまずraspberry pi zeroでやってみてその後MacBook proでやってみましたが状況は変わらず(not available)でした。
PCとの接続も問題ないとなると、ちょっと難しいですね。。
私の方でも実機で調べてみます。
以下にノードの説明ページがございますのでご参照ください。
https://flows.nodered.org/node/node-red-contrib-generic-ble
お手数をお掛けして申し訳ありません。ここのサイトでMain Bluetooth services, pairing not requiredのプログラムをmicro:bitに読み込んでGeneric BLE 出力ノードでmicro:bitを選択して接続するとGATT Characteristicsが正しく表示されます。
https://www.bittysoftware.com/downloads.html
その後、元のプログラムに戻すと正しく動作しません。この現象でどこの設定が間違っているのか想定可能でしょうか?