スマート3Dセンサー: WalabotとAlexaで声によるランプ制御 – LattePanda活用
必要なパーツと用品
| Amazon Echo(Alexa搭載スマートスピーカー) | ×1 |
| Walabot Creator(3Dイメージングセンサー) | ×1 |
| Arduino Leonardo(LattePanda内蔵のATMega32u4として機能) | ×1 |
| リレーモジュール | ×2 |
| LattePanda 2G/32GB(Windows 10搭載SBC) | ×1 |
| LattePanda 7インチ 1024×600 IPSディスプレイ | ×1 |
| ランプ(照明器具) | ×2 |
プロジェクト概要
課題: スマートホームデバイスの名前管理
Alexaなどのスマートスピーカーで複数のデバイスを制御する際、「どのデバイス名で呼べばいいか覚えてられない」「間違えて別のデバイスが動く」「イライラして手動操作に戻る」といった問題が起きがちです。「Alexa、このランプをつけて」と言っただけで、自分の近くにあるランプを特定して点灯できたら便利ではないでしょうか。
解決策: Walabotによる位置検出
カメラを部屋に設置して画像認識するのはプライバシーの観点から避けたいところです。そこで Walabot を使います。Walabotは電波(RF)を用いた3Dイメージングセンサーで、カメラなしで人の位置や動きを検出できます。手持ちサイズでプログラマブル、SDK/APIが提供されており、カスタムアプリ開発が可能です。

LattePandaの役割
LattePandaはIntel Atom x8300(クアッドコア)搭載のWindows 10動作SBCです。オンボードでArduino Leonardo互換のATMega32u4コプロセッサーとGPIOを備え、Walabot(USB接続)とArduino制御(リレー駆動)を1台で完結できます。


Node-REDでロジック構築
Node-REDはブラウザベースのフローエディターで、IoTデバイス連携ロジックを視覚的に組めます。以下のノードを使用:
node-red-contrib-alexa-local: Alexaのスマートホームスキルをエミュレートし、カスタムデバイス(ランプ)をAlexaに見せるnode-red-node-arduino: Firmata経由でArduino(LattePanda内蔵)のGPIOを制御

システム動作の流れ

3つのステップで構成:
- Walabotサービス処理(Python): Walabotから検出された物体(人)の座標を読み取り、TCPポート1890でJSONストリームとして配信。
- Walabotオブジェクトデータ取得・保存(Node-RED): ポート1890からJSONを受信、パースして最新の検出位置(X, Y, Z)をグローバル変数に保存。
- Alexaコマンド処理(Node-RED): Alexaからの制御コマンド受信時、保存されている最新位置に基づき、どのランプ(どのArduinoピン/リレー)を操作するか判定・実行。
ハードウェア構成
- LattePanda本体
- 7インチIPSディスプレイ
- USBワイヤレスキーボード/マウス
- Walabot Creator
- USB電源ハブ(Walabot給電用)
- リレーモジュール ×2
- ランプ ×2
インストール手順
- Walabot SDKインストール: 公式サイトからダウンロード・インストール。
- LattePandaでArduinoピンアクセス有効化: Windowsの「開発者モード」をONにする(設定→更新とセキュリティ→開発者向け)。
- Arduino IDEでStandardFirmata書き込み:
- Arduino IDEを開き、「ファイル」→「スケッチ例」→「Firmata」→「StandardFirmata」を選択
- ボード:「Arduino Leonardo」、ポート: LattePandaのCOMポートを選択
- 書き込み実行
- リレーをLattePandaのGPIOに接続(デジタルピン制御)。
- Node.jsとNode-REDインストール: Node.js インストール後、
npm install -g node-redでNode-RED導入。LattePanda公式ガイドも参照。 - Python 3インストール(Walabot Python SDK用)。
- プロジェクトリポジトリをクローン・実行:
git clone https://github.com/rondagdag/smart3DSensorForAlexa cd smart3DSensorForAlexa npm install npm start - Alexaアプリでスマートホームスキル有効化: 同一WiFiネットワーク上で「Alexa, discover devices」と話しかけ、ランプを検出させる。Node-REDエディターは
https://localhost:8080/red/でアクセス可能。
主要コード断片
Walabot Python サービス(TCP 1890でJSON配信)
from __future__ import print_function
from sys import platform
from os import system
from imp import load_source
import socket, sys
WalabotAPI = load_source('WalabotAPI', 'C:\\Program Files\\Walabot\\WalabotSDK\\python\\WalabotAPI.py')
if __name__ == '__main__':
WalabotAPI.Init()
WalabotAPI.SetSettingsFolder()
WalabotAPI.ConnectAny()
WalabotAPI.SetProfile(WalabotAPI.PROF_SENSOR)
WalabotAPI.SetThreshold(35)
WalabotAPI.SetArenaR(50, 400, 4)
WalabotAPI.SetArenaPhi(-45, 45, 2)
WalabotAPI.SetArenaTheta(-20, 20, 10)
WalabotAPI.SetDynamicImageFilter(WalabotAPI.FILTER_TYPE_MTI)
WalabotAPI.Start()
system('cls' if platform == 'win32' else 'clear')
numOfTargetsToDisplay = 1
if len(sys.argv) == 2:
TCP_IP = '127.0.0.1'
TCP_PORT = int(sys.argv[1])
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn, addr = s.accept()
while True:
WalabotAPI.Trigger()
targets = WalabotAPI.GetSensorTargets()
finds = '{"targets": ['
for i, t in enumerate(targets):
if i < numOfTargetsToDisplay:
print('Target {}\nx = {}\ny = {}\nz = {}\n'.format(i+1, t.xPosCm, t.yPosCm, t.zPosCm))
finds += '{"x": "%s", "y": "%s", "z": "%s"}' % (t.xPosCm, t.yPosCm, t.zPosCm)
finds += ']}'
conn.sendall(str.encode(finds))
conn.close()
WalabotAPI.Stop()
WalabotAPI.Disconnect()
Node-RED: JSONパースとグローバル変数保存(Functionノード)
raw = msg.payload.toString('UTF-8');
j = JSON.parse(raw);
var msg1 = { payload: raw };
var msg2 = { payload: j };
if (raw.length > 20) {
X = msg2.payload.targets[0].x;
Y = msg2.payload.targets[0].y;
Z = msg2.payload.targets[0].z;
global.set("X", X);
global.set("Y", Y);
global.set("Z", Z);
var msg3 = { payload: X };
var msg4 = { payload: Y };
var msg5 = { payload: Z };
}
return [msg1, msg2, msg3, msg4, msg5];
Node-RED: Alexaコマンド受信時の判定ロジック
node-red-contrib-alexa-local ノードでAlexaからのコマンドを受け、保存済みの位置(X, Y, Z)に基づき、どちらのリレー(ランプ)を操作するか振り分けます。フロー上ではFunctionノードで条件分岐を記述。

補足
本プロジェクトではカスタムAlexaスキルは作成せず、組み込みのスマートホーム機能(Philips Hueエミュレーション)を node-red-contrib-alexa-local で利用しています。これにより、「Alexa, turn on lamp」などの標準的な発話で制御可能です。
完全なNode-REDフローとPythonコードは GitHubリポジトリ で公開されています。
製造プロセス
- Raspberry Pi 3でコンピュータビジョン搭載SmartThingsモーションセンサー
- Raspberry Pi用DIY赤外線モーションセンサー構築 - ステップバイステップガイド
- スマートゴミ箱:自動廃棄物管理のためのセルラーIoTソリューション
- Raspberry PiとPythonでAmazon AlexaからChromecastを制御
- スマート信号機:IoTで実現する適応型街路灯
- Raspberry Pi で障害物回避ロボットを自作 – 初心者ガイド
- スマートペン:Raspberry PiとIMUで手書きと動きをリアルタイム追跡
- スマートテキスタイル向け超高感度・高耐久ひずみセンサーを開発
- 革新的超薄型センサーがスマートコンタクトレンズ機能を強化
- 先進TOMOPLEXセンサーフィルムで航空宇宙機のリアルタイム監視を実現
- ヒーテッドアパレル:専門家が明かすスマートテキスタイルの主役