United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

バーチャルアシスタント リモコン

本プロジェクトでは、ラズベリーパイと赤外線センサーを利用し、ある家電をリモート操作する。さらに、Amazon Echo と連携させることを試みる。こうすれば、普通な家電製品でもEchoで操作するのも可能になる。そしてより便利なユーザーエクスペリエンスを提供するために、アンドロイドのリモートアプリも開発する。そのアプリによって家電の操作も可能になる。

1.ハードウェアの設計、実装  

赤外線通信を行えるよう、ラズベリー パイにセンサー用のボードをつけた。このボードには、赤外線LEDと赤外線センサーがあり、さらに室温を読むための温度センサーもついている。図 1は回路の設計であり、図 2は実装したものである。複数のLEDを用意したのは、今後の拡張性を持たせるためだ。

まず、発信用の赤外線LEDは、トランジスタで増幅させたラズベリー パイのGPIO信号を使っている。

ラズベリー パイでは、デバイス毎の制御信号を生成しGPIOを通じて赤外線LEDを点滅させることで、家電側に制御信号をおくる。家電から信号を受信する場合は、赤外線センサーが受ける。この設計を用いる赤外線センサーは受けた赤外線信号を復調できるタイプである。復調した電子信号はセンサーからラズベリー パイのGPIOに送る。温度センサーはI2C経由でラズベリー パイ接続している。ラズベリー パイが定期的に温度センサーのデータを読み出す。 

IMG_6363_f956f954f4311818b65195d66b50dd6fc9bf8718.jpg

図 1、回路の設計 

IMG_6362_604411018ef5f9d42fcc863835705f27a6b374e5.jpg

図 2、実装したボード 

2.赤外線信号の解析、リプレイ 

ラズベリー パイはデバイスの制御コマンドを知らなければならない。赤外線制御のプロトコルは大きく2つのタイプがある。一つはコマンドだけのタイプ。もう一つはコマンドに加えステータス情報を含むタイプである。例えば、テレビやシーリングライトのプロトコルは前者のコマンドのみのタイプだ。一方、エアコンなどのプロトコルはコマンドだけではなく、設定温度や風量などの可変情報を含むタイプだ。コマンドのみタイプは、コマンドの内容を細かく解析しないでもいい。単純にデバイスのコマンドパタンを記録し、赤外線LEDで再現すれば、制御できる。一方、ステータス情報を含むタイプは、状況に応じてコマンドの解釈を変更する必要がある。 

赤外線のコマンドを記録や再現することはLIRCというパッケージで行える。LIRCがGPIOを用い、赤外線LEDやセンサーを接続し、コマンドラインの制御ツールを提供している。このツールにより、リモコンのパタンを記録し、LIRCに保存することが出来る。利用例が図 3である。インストールの方法は、図 4である。まず、apt-getでLIRCをインストールする。次に、/etc/modulesにLIRC用のドライバーに設定を入れる。更に、/etc/lirc/hardware.confの中で、ラズベリー パイに対応している設定を入れる。最後に、/boot/config.txtにデバイス情報を追加する。 

コマンドのみタイプのコマンドを記録や再現する方法は下の通りである。まず、本物のリモコンで図 5のような設定用ファイルを作る。作る方法はirrecordというコマンドラインのツールにより、知っているパタンを文字で入力し、または、本物のリモコンを用い、赤外線センサーにパタンを送り、入力する。次に、できた設定用ファイルをLIRCに提供する。最後に、ユーザーがコマンドラインのツールで設定ファイルに書いてあるパタンを再現できる。それを対して、状態を含むタイプのパタン解析、再構築する方法も、LIRCで出来る。まず、解析することについて、mode2というLIRCのコマンドラインのツールで、赤外線センサーにパタンを送った信号を保存し、図 6を示すPythonプログラムで1や0を判明する。赤外線の1や0の表し方がプロトコルによると、違いがある。判明するPythonプログラムがデバイスの製造元により、実装された。今回に対応しているエアコンの製造元は三菱なので、プログラムは三菱のプロトコルに対応している。Pythonプログラムでいくつのパタンを収集したら、毎ビットの意味が分かる。この情報でコマンドを再構築用のPythonプログラムを作る。このプログラムが入力した情報でコマンドを構築し、IR_remoteというライブラリを使用して、赤外線LEDで信号を出す。 

今回のプロジェクトが制御できるデバイスが、デバイスが、エアコン、テレビ、シーリングライトである。対応しているコマンドが表 1や表 2に書いてある。新たなデバイスを加えてほしい場合は、上の通りで、プロトコルのタイプを調べ、対する方法を用いれば、追加できる。 

表 1、テレビのコマンド 

コマンド 

機能 

KEY_Power 

電源 

KEY_Up 

 

KEY_Down 

 

KEY_Right 

 

KEY_Left 

 

KEY_VolumeUp 

音量を上げる 

KEY_VolumeDown 

音量を下げる 

KEY_Menu 

メニューを開き 

 

表 2、シーリングライトのコマンド 

コマンド 

機能 

KEY_Power 

電源 

KEY_BrightlessUp 

明るくなる 

KEY_BrightlessDown 

暗くなる 

KEY_Blue 

冷色 

KEY_Red 

暖色 

 

 3.バックエンド側の実装

アンドロイドや音声制御アプリをLIRCや再構築用のPythonプログラムに簡単に接続するために、flask restfulというPythonライブラリを用い、RESTful APIに基づいてPythonウェブサーバーを開発した。このサーバープログラムは、アプリを接続するURIにより、LIRCのコマンドラインのツールや再構築用のPythonプログラムを呼び出し、赤外線のコマンドをデバイスに送る。更に、室温を提供するため、サーバーがwiringPIで温度センサーのデータを定期的に読んでおり、RESTful APIでユーザーアプリに室温のデータを提供している。 

最後に、ユーザーアプリがサーバーに自動的に接続するために、サーバーが自分のIPアドレスを定期的にUDPでブロードキャストしている。 

表 3、サーバーが提供しているRESTful API 

アドレス 

機能 

/remote_list 

LIRCにあるコマンドを確認 

/remote/ 

<remote_name>/ 

<command> 

<remote_name>の<command> 

というコマンドを呼び出す 

/remote/ac 

エアコンの制御やエアコンの状態を確認 

 

表 4、/remote/acに対応するパラメーター 

パラメーター 

可能な入力 

説明 

power 

on, off 

入れ、切れ 

mode 

cold, hot, dry 

冷房、暖房、乾燥 

temp 

up, down 

温度を上げり、下げり 

speed 

auto, 1, 2, 3 

風量 

dir 

auto, 1, 2, 3, 4, 5 

風向 

 

4.アンドロイドアプリの開発 

Amazon Echoによって音声制御と共にコントロール用のアンドロイドアプリも開発予定になる。本プロジェクトでは三つの家電:エアコン、テレビ、シーリングライトを対応する予定なので、アプリのインターフェースとしてはエアコン、テレビ、シーリングライトそれぞれのインターフェースを作成する。更に、より使いやすくなるために、アプリを起動した途端に自動的にラズベリーパイと接続する。これを実現するために、バックエンド側は定期的にラズベリーパイのIPアドレスを含むブロードキャストを送り、アプリはそのパケットの中のIPアドレスと接続する。 

アプリとバックエンド側の通信について、バックエンドの提供するRESTfulAPIを使用し、バックエンドにリクエストを送る。 

本アプリはエアコン、テレビ、シーリングライト三つの家電を操作でき、それぞれの機能は表 6の通りになる。アプリの全体的なイメージは図 8の通りになる。 

UIについてはそれぞれのインターフェースが実際のリモコンと似るようにデザインしたので、簡単に使える。UIは[字段]図 9から12までの通りになる。 

表 6、対応している家電や家電の機能 

家電 

機能 

テレビ 

電源、音量・チャンネル調整、メニュー 

エアコン 

現在の部屋温度の表示、電源、温度、風速、風向、運転切替 

シーリングライト 

電源、明るさ、色調整 

 

app_diagram_cc1123941e6470a61191bd9b11946bd5d3fd2cf9.png 

 

図 8、アプリのイメージ 

_2018-07-06_12.01_.13__deab0677e790019831983ad0f5ace87120bfb91b.png

 

図 9、Main UI

tv_8c372fd329cfc5be437b58bf0b7b63d60981ba8e.png

 

図 10、TV Remote 

ac_1de97f6dd127685adcb907e7807c75baa92b6fb1.png

 

図 11、AC Remote

light_5b65be9b179c349cb4d31973f2e252aecfc3ec7a.png

図 12、Light Remote 

 

VolleyというJavaのネット通信ライブラリを使ってラズベリーパイに設置したFlaskサーバーと通信する。例えば、テレビをつける時にはsendRequest関数を利用し、PUT methodでFlaskサーバーにhttp://IP-of-raspberry:5000/remote/pionner.tv/KEY_POWERというクエリを送る。 

5.Alexa on Raspberry Pi 

Amazon開発者アカウントがあれば、Alexaサービスを簡単にRaspberry Piにインストールできる。Amazon開発者コンソールから、Alexaのページをアクセシし、Raspberry Piの情報を登録したら、AmazonからデバイスTokenを貰う。そのTokenを利用し、ラズベリーパイで認証を行う。認証が終わったら、https://github.com/alexa/alexa-avs-sample-app/wiki/Raspberry-Piを従い、アレクササービスをラズベリーパイにインストールする。 

6.Alexaスキルによる音声制御の開発 

Alexaスキルの開発は対話モデルの作成とAWS Lambdaによる対話インテントの処理の二つ部分に分けられている。 

対話モデルの定義のフォーマットはJSONファイルであり、主要な部分はインテントとサンプル発話とスロット三つがある。 

  1. インテント:インテントとは、プログラミング言語に、会話機能を示すものである。ユーザーの音声リクエストはインテントを通じ、AWS Lambdaにある登録された関数を呼び出す。 
  1. サンプル発話とはインテントに関連する音声コマンドである。Alexa対話モデルはAWSクラウドを使い、サンプル発話のテキスト内容をディープラーニングにより、音声認識モデルをトレーニングとビルドする。開発者側はディープラーニングや音声認識関する知識の必要がない。 
  1. スロット:スロットとは、プログラミング言語に、インテントのパラメーターだ。インテントをLambdaに送る時に、スロットの内容も送られる。  

 

デモ

Source Code:

https://github.com/YagiGo/RaspberryPiVoiceRemote
https://github.com/sonicyang/ir_remote

sipuora さんはまだ自己紹介を入力されていません...