以前、古いスマホを使って音声認識する話を書きました。
今回はスマホのAndroidアプリからRaspberry PiのPythonアプリに、認識した言葉を送信し、Raspberry Piからテレビに赤外線リモコン信号を送出する方法について書きます。
これで「めざましじゃんけん」システムが完成します!
流れは以下となります。
- AndroidアプリからRaspberry Piに言葉データを送信する
- Raspberry PiのPythonアプリで言葉データを受信して解析する
- Raspberry Piでリモコン信号を送信するコマンドを実行する
AndroidアプリからRaspberry Piに言葉データを送信する
スマホのAndroidアプリとRaspberry PiのPythonアプリ間はソケット(TCP/IP)通信を行います。
ソケット通信するプログラムはC言語で何度も書いたことがあったので楽勝だと思っていましたが、少し苦戦しました。
Androidアプリでソケット通信をするには、音声認識するスレッドとは別のスレッドを起動する必要があり、音声認識用スレッドとソケット通信用スレッド間のやり取りまで作り込まないといけないためです。
でも、それさえできれば特に難しくはなく、Androidアプリ部分の実装はできました。
Raspberry PiのPythonアプリで言葉データを受信して解析する
次はRaspberry PiのPythonアプリです。
PythonアプリはAndroidアプリからの言葉データを常に待ち受け、言葉データを受けたら、どのような言葉が含まれているかを解析します。
解析した結果、「じゃんけん」が含まれており、「じゃんけん」に続くのが「グー」であればリモコンの「青」、「チョキ」であればリモコンの「赤」、「パー」であればリモコンの「緑」に相当する信号を送出するコマンドを実行します。
Pythonは楽ですね。このPythonアプリの作成で躓くところはありませんでした。
ソケット通信にはsocketモジュールのメソッドを、コマンドの実行にはsubprocessモジュールのcallメソッドを使いました。
Raspberry Piでリモコン信号を送信するコマンドを実行する
最後にリモコン信号を送出するコマンドです。
Raspberry Piで赤外線リモコン信号を扱うために、オンラインショップ「ビクトリーセブン」で販売していた「赤外線リモコン送受信キット」を使いました。(このキットに含まれている赤外線LEDが優秀で、5m以上離れたところからでも信号が届きます。)
このキットがあれば、Raspberry Piにテレビの赤外線リモコンの信号を記憶させ、それを送出することができます。
(2018/7/28追記 残念ながら「ビクトリーセブン」は2017年12月に閉店したそうです。なので同キットはもう購入できません。古い情報を載せていてすみませんでした。キットと同等の部品や回路は下記で紹介している「Raspberry Piで遊ぼう!」にも載っていますので、そちらを参照いただければと思います。)
まずテレビの「青」ボタン、「赤」ボタン、「緑」ボタンの信号を、irrecordというコマンドを使って記憶します。
そして、irsendというコマンドで記憶した赤外線信号を送出します。Pythonアプリからはこのirsendコマンドを実行します。
このあたりの話は下記の本に記載がありますので、省略します。

Raspberry Piで遊ぼう! 改訂第4版 〜【2】から, モデルB+, Bまで全てに対応
- 作者: 林 和孝
- 出版社/メーカー: ラトルズ
- 発売日: 2015/07/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
どうでしょう。かなり簡単にできることがお分かりいただけたかと思います。
Pythonアプリを改造して機能を追加していけば、市販のスマートスピーカーのように赤外線リモコンを使う様々な機器が制御できます。
実際、私はこの仕組みを使ってテレビのON/OFFやチャンネルの切り替えを音声で行えるようにしています。
以下がRaspberry Piの様子です。見た目不格好ですが、ちゃんと働いてくれます。
テレビドアホンの上に乗っかっているのが、Raspberry Piで、そこから左上ににょきっと出ているのが赤外線LEDです。テレビの方を向いています。
今度、スマートスピーカーの得意分野である音楽の再生をやってみたいと思います。
(2020/01/05追記)
その後、離れた場所にある複数の機器に対応するため、赤外線LEDを3個に増やしてみました。↓の記事を書きましたのでよろしければご覧ください。