UKey's Labo

Siri – Raspberry PiでIoT – 赤外線リモコンを作ってSiriで操作する

実現したいこと

僕の部屋は3.5畳と狭いのですが、一応エアコンはあります。

「Hey Siri, エアコンつけて」でとりあえずエアコンONにしたい。

Alexa – Raspberry Pi連携がまず候補にあった(Alexaも自作予定)のですが、まずは赤外線リモコン部分でどハマリして完成までに2ヶ月くらいかかってしまいました。

ここからAlexa作成してって何ヶ月かかるんだよ。。。と思っていましたが。

存在感が薄かったSiriが実は僕のそばにずっといました(iPhone SE)。

なんで君のことを忘れていたのか。。。

ということで、Siri – Raspberry Piで連携して「Hey Siri, エアコン入れて」を実現することにしました。

具体的には、以下のようなフローでエアコンをONにします。

こちらの記事では、以下の流れで作成していきます。

  1. LIRCのインストール、設定
  2. 回路の作成
  3. 赤外線リモコンデータの作成
  4. リモコンデータの送信
  5. 回路の変更
  6. IFTTTの設定
  7. iPhoneでのショートカット作成
  8. 完成

かなり道のりは長く、長文になってしまいましたが、この記事がどなたかのお力になれれば幸いです。

動作環境

環境 バージョン
Macbook Air (Raspberry Pi SSH接続用) macOS Mojave 10.14.2
Rasperry Pi ZERO WH Raspbian GNU/Linux 9.6 (stretch)
iPhone SE iOS 12.1.2

前提条件

Raspberry Piの初期設定、nginx、phpの設定は以下に記載してあります。

LIRC(Linux Infrared Remote Control)とは

赤外線リモコンのキーが押されたときにプログラムに合わせて特定のコマンドに変換することができるデーモン。

このLIRCプログラムを使用して、赤外線リモコンから発せられるIR信号の解析を行います。

また、解析したIR信号を、赤外線LEDから家電(ここではエアコン)に送信します。

ちなみに。
僕の部屋のエアコンはFUJITSUのAS-ASSW-Wという、結構古めのエアコンです。機能もそんなに多くはありません。
多機能なエアコンになると、リモコンも多機能なものだと思いますが、多機能なエアコンはリモコンと情報をやりとりして、 高度な処理をしているようなので、機種によってはこの方法ではうまくいかない場合があります。

LIRCのインストール、初期設定

以下のコマンドでLIRCをインストール。

sudo apt -y install lirc

あとは設定をやっていきます。

/boot/config.txtの修正

/boot/config.txtは普通のPCであればBIOSで行われるようなシステム設定のパラメータが記載されています。
参考サイト:Raspberry Pi 公式ドキュメントを日本語訳

ここでLIRCの有効化、IN/OUTを設定します。

sudo vim /boot/config.txt

50行目あたりにある以下のコメントを外し、gpioのINとOUTを割り当てます。

後にINは赤外線受光器へ接続、OUTは赤外線LEDへ接続します。

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

↓ 修正

# Uncomment this to enable the lirc-rpi module
dtoverlay=lirc-rpi
dtparam=gpio_in_pin=26
dtparam=gpio_out_pin=27

lirc-rpi → Linux Infrared Remote Control – Raspberry Pi(?)

設定後は再起動します。

sudo reboot

※SSH接続している場合は、一旦接続が切れます。しばらくたってから、再接続してください。

optionファイルの修正

/etc/lirc/lirc_options.conf

# devinputからdefaultに修正
driver          = devinput
↓
driver          = default

# autoから/dev/lirc0に修正
device          = auto
↓
device          = /dev/lirc0

devinput.confを削除する

cd /etc/lirc/lirc.conf.d/

sudo rm -i devinput.conf

lircdを再起動する

sudo systemctl restart lircd

回路の作成

僕は電子回路パーツをお店で購入しましたが、秋月電子、千石電子等の通販でも手に入ると思います。

パーツ一覧

品名 種類 個数
PL-IRM1261 赤外線受光器 1
OSI3CA5111A 赤外線LED 1
OSI5FU5111C 赤外線LED 1
2SC1815-Y NPNトランジスタ 1
10Ω抵抗 抵抗器 1
22Ω抵抗 抵抗器 1
10KΩ抵抗 抵抗器 2
1KΩ抵抗 抵抗器 1

その他、ジャンパワイヤ等の配線材、ブレッドボードが必要になります。

必要な個数は上記の通りですが、パーツの個体差が結構あるらしいので、各パーツを予備としてプラス2,3個購入しておくといいかもしれません。

赤外線受光器の作成

まずは赤外線受光モジュールを作成します。赤外線リモコンからIRデータを受信し、その受信データを元に赤外線LEDで出力するデータを作成します。

こちらはそう難しくありません。

使用した赤外線受光モジュールはこちらです。

PL-IRM1261

接続方法はデータシートの通り、以下のようにしました。

パーツの画像が代替画像を使用しているのでPL-IRM1261とは異なりますが。

左から順に以下のように接続しています。

赤外線LED発光器の作成

実際にエアコンに電波を飛ばす部分なので結構重要ですが、回路は難しくありません。
ちなみに電子工作はド素人なので、以下の回路は参考程度にしておいてください。

回路の構成

構成は以下のようにトランジスタを使用したスイッチング回路にしました。

使用するトランジスタはよく使われている、2SC1815-Yを使用することとしました。

赤外線LED

赤外線の光は通常は可視光ではないので光ってもわかりにくいですが、デバッグのし易さも考慮して、発光時に

少し光るものを選択しました。(のちにもう少し出力が高い赤外線LEDに変更します)

まずはLEDが光るかどうかが調べたかったので。

OSI3CA5111A-秋月電子

データシートを確認してみます。

1.6Vで50mAが当該LEDの最適値なので、それに合わせて抵抗値を決めていきます。

R1の抵抗値

赤外線LEDに直列につなぐ抵抗の値を決めます。

赤外線LEDに1.6V、50mAなので、以下の式で求めることができます。

R1 = (3.3V - 1.6V) / 50mA
   = 34Ω

R2の抵抗値

コレクタ・エミッタ間で50mA流すために、ベース・エミッタ間にどれだけ電流を流せばいいのかを求めます。

トランジスタのhfe(直流電流増幅率)を調べます。

以下、2SC1815Yデータシート

2SC1815Yなので、直流電流増幅率は120~240倍。個体差を考慮して、120~240の間をとって180倍として考えます。

ちなみに今回回路に使用した2SC1815YのhFEをテスタで測定したところ、hFEは200程度でした。

赤外線LEDに流す電流(コレクタ電流)が50mA、直流電流増幅率が180なので、以下の公式でベースに流す電流が求められます。

ベース電流 = 50mA / 180
         ≒ 278μA

トランジスタのベース・エミッタ間に入力する電圧は0.7V、入力されるGPIO27の電圧が3.3Vなので、

R2 = (3.3V - 0.7V) / 278μA
   = 9.701kΩ
   ≒ 10kΩ

R3の抵抗値

R3はプルダウン抵抗なので、決め打ちで10kΩとします。

補足

回路の設計にLTSpiceを使用しましたが、シュミレーションの精度をなるべく上げたかったので、
以下サイトを参考に、2SC1815YをLTSpiceに追加しました。

回路シミュレーション LTspice の使い方(2) 部品の追加

回路図に値を設定してシュミレートしてみる

算出した抵抗の値を元に、LTSpiceに抵抗値を設定していきます。

インプット(GPIO27)は、3.3Vのパルスを設定しています。

また、今回は5ミリ秒で過渡解析をシュミレートしています(.tran 5m

この条件でのシュミレート結果は以下のようになりました。

2SC1815Yの増幅率設定が想定している180hFEとは異なるため(恐らく)、シュミレート結果としては、
赤外線LEDに流れる電流は30mAという結果でした。

異常なまでの過電流にはならないので、とりあえず実際に回路を組んでみることにしました。

ブレッドボードで回路を作成

こんな形で組んでみました。

ちなみにR3の34Ωは、10Ωと22Ωを直列に繋いで、32Ωの抵抗に変更しました。

ここまで作成したら、次はいよいよリモコンデータを読み込み、エアコンを操作してみます。

IRデータの読み込み

IRはInfrared(赤外線)の略(?)。

手動でIRデータの読み込みを行うため、一旦lircdを止める。

sudo systemctl stop lircd

以下、コマンドを実行。

mode2 -d /dev/lirc0 | tee ~/irdata.txt

実行すると、以下が表示され、入力待ち状態になります。

Trying device: /dev/lirc0
Using device: /dev/lirc0

この状態で、赤外線受光モジュールに向けてリモコンのボタンを押し、以下のようなデータが出力されれば成功です。

Using driver default on device /dev/lirc0
space 16777215
pulse 3328
space 1576
pulse 469
space 359
pulse 477
space 354
pulse 473
space 1180
pulse 470
space 357
pulse 481
...

ctrl + cで実行終了します。

注意点として、赤外線受光器によっては、ノイズを拾ってしまい、正しいデータを受信できていない場合があります。
pulsespaceが交互に出力されていない場合は怪しいです。

同じ品番によっても、個体差があったりして質が悪いのですが、うまくいってないと感じたら、
赤外線受光器を交換してみることをオススメします。

作成されたファイルに出力された文字列を編集して、赤外線データを作成します。

僕はmac側のテキストエディタでちまちま編集してデータを作成しましたが、
先人の方々がネット上にたくさん情報を残してくれていて、プログラムで編集する方法もあるようなので、
そちらを参考にして編集してもよいかと思います。

以下のように、spacepulseを消して、数値の羅列にしていきます。

3328 1576 469 359 477 354 473 1180 470 357 481 1170 469 381 468 342 475 358 513
1139 479 1168 470 356 478 357 474 355 492 1160 468 1177 471 362 472 352 478 360
475 353 476 369 462 357 474 360 472 359 474 357 473 358 474 358 477 356 474 367
462 1179 473 356 474 377 453 362 469 362 472 362 468 359 476 355 474 1177 477
354 471 358 475 357 472 360 476 1223 422 1178 472 1175 475 1180 468 1182 462
1184 465 1176 472 1181 466 356 474 359 473 1179 469 360 477 355 474 357 471 359
474 359 473 358 475 356 476 356 480 1172 479 1169 472 355 475 356 473 1192 458
356 481 353 475 356 476 359 481 1167 481 1173 467 357 474 359 471 360 483 1165
472 362 470 358 473 357 477 358 473 356 477 357 473 1181 468 354 479 353 481
351 477 354 478 354 492 342 476 355 476 360 469 356 476 358 475 354 494 339 477
353 481 351 477 356 477 353 477 356 495 337 478 353 477 354 477 354 479 353 503
328 480 351 480 369 463 365 490 329 477 355 477 358 474 355 480 352 478 352 478
357 515 1146 474 341 481 1170 500 328 507 326 478 1171 477 368 464 354 481 349
479 354 479 354 476 1173 502 332 471

編集する際の注意点としては。

この作成した文字列を使用して、以下を実施していきます。

スイッチON、スイッチOFF、両方必要な場合は作成しておきましょう。
スイッチONだけでいい場合はそれでも問題ないです。

configファイルの作成

/etc/lirc/lircd.conf.d/配下にconfigファイルを作成します。ファイル拡張子が.confであれば、ファイル名は任意のもので問題ないです。ここでは、myroomaircon.confとしてファイルを作成します。

ファイル内容は以下になります。

sudo vim /etc/lirc/lircd.conf.d/myroomaircon.conf
begin remote

  name            myroomaircon
  flags           RAW_CODES
  eps             30
  aeps            100
  gap             200000
  toggle_bit_mask 0x0

  begin raw_codes
    name on
{ONのときの文字列}

    name off
{OFFのときの文字列}

  end raw_codes

end remote

{ONのときの文字列}部分には、リモコンボタンをONした際に取得し、編集した文字列を、
{OFFのときの文字列}部分には、リモコンボタンをOFFした際に取得し、編集した文字列をそれぞれ設定します。

上記のように、name ~で、複数のボタンが登録できます。

ファイルの作成が完了したら、lircdを再起動してファイルを読み込みます。

sudo systemctl restart lircd

.confファイルが正しく読み込めて、lircdが正常に動作しているか確認します。

sudo systemctl status lircd

ここで何かしらエラーが発生している場合は、修正してlircdを再起動してください。

赤外線出力可能なデータ一覧を取得します。

irsend list '' ''

ここで、先程作成した.confファイル名が出力されれば、次のコマンドも実行してみます。
僕の場合はmyroomairconが出力されたので、実行するコマンドは以下になります。

irsend list myroomaircon ''

以下のように出力されれば、出力準備完了です。

0000000000000001 on
0000000000000002 off

では、実際にLEDデータを送信してみましょう。

irsend send_once myroomaircon on

LEDは発光しましたか?

エアコンがここで動作してくれれば、これで回路は一旦作成完了です。

僕の場合はLEDは発光しましたが、エアコンは動作してくれませんでした。
このとき、回路からエアコンまでの直線距離は2mくらいですかね。。

ここでエアコンが動作しないということで、とりあえず原因は以下のどちらかと思いました。

ということで。

延長コードを引っ張り出してきてRaspberry piとつなぎ、エアコンの赤外線受光部までraspberry piを近づけながら、何度もデータを送信してみました。

結果、赤外線受光部から5cmという近距離まで近づけると、エアコンがONになりました!わーい(使い物にならない)

赤外線出力が弱いので、赤外線パーツを交換し、回路も変更して出力を上げることにしました。

赤外線LEDは以下に交換しました。

OSI5FU5111C – 秋月電子

また、回路図は以下に修正して、赤外線LEDに流れる電流量も増やしてます。
R2を1kΩに変更しています。

赤外線LEDに流れる電流量は70mAというシュミレーション結果です。

回路を組み直して再度実施してみたところ、2m近くは離れていてもエアコンがONになることが確認できました。

IFTTTの連携準備

SiriとRaspberry Piを連携するための準備を進めます。

今回はSiri - IFTTT(Webhooks) - Raspberry Piで連携するので、webhooksで赤外線送信コマンドを実行できるように、webサーバを構築します。

raspberry piにweb環境を構築します。

web環境がすでにあれば問題ないですが、ない場合は以下を参考にして環境構築します。

<内部リンク>

環境が整えば、あとは以下のファイルを作成します。

ここでは/var/www/html/aircon.phpを作成しますが、ファイル名、パス等は任意のもので問題ないです。

<?php
    exec("irsend send_once aircon on");

あとはブラウザで外部ネットワークからhttps://[アドレス]/aircon.phpでエアコンがONになるか確認しておきましょう。

IFTTTの登録と設定

iPhoneのIFTTTアプリから設定していきます。webからも同様の手順で登録できるかと思いますので、お好みの方で設定してください。

まだIFTTTアプリをインストールしていない場合は、App Storeからインストールします。

任意のアカウントを作成してください。

ちなみに僕はGoogleアカウントでアカウント作成しました。

アカウントを作成したら、右下のMy Appletsをタップし、右上の+ボタンをタップ。

thisをタップ

検索窓にwebhooksを入力して、webhooksが表示されたら、タップ。

Receive a web requestをタップ。

Connectをタップ

webhooks初回作成時は以下のようにブラウザが一度立ち上がりますが、そのまま“開く”をタップする。

すると再度同じ画面が表示されるので、再度“Connect”をタップ。

Event Nameに任意の名前を入力します。ここではmyroom_aircon_onとしました。
入力したら、create triggerをタップ。

thatをタップ。

検索窓にwebhooksを入力して、webhooksが表示されたら、タップ。

Make a web requestをタップ。

「URL」/var/www/html/aircon.phpのURLを入力。
例)https://sample.com/aircon.php

今回はデータ渡しはないので、とりあえず「Method」はGET、
「Content Type」は一応text/plainは指定してます。「Body」は空で問題ないです。 Create Connectionをタップ。

webhooksが実行された際にiPhoneへの通知がほしい場合は、赤枠を有効にしてください。
デバッグ時はあったほうが無難かもしれません。必要なければ無効のままでいいです。後で編集可能です。

完了したら「Finish」をタップで完了です。

「こんなのもどうですか?」的な画面に飛ばされた場合は、とりあえず戻る。

Siriのショートカットから呼び出すURLが必要になるので、My AppletsからServiceタブを選択し、
Webhooksをタップします。

右上の歯車マークをタップ。

Account Infoにある、URLをタップ。

下記赤枠部分のURLをコピーします。一部{event}となっていますが、とりあえずこのままコピーします。

iPhoneショートカットを作成する

ショートカットアプリがインストールされていない場合はApp Storeからインストールしてください。

ショートカットアプリを開き、ショートカットを作成をタップ。

矢印部分を上にスライドします。

テキストを選択。

先程コピーした、webhooksへのURLを貼り付けます。 {event}部分は、Event Nameで設定したものに書き換えてください。

同じ要領で、変数を選択。 変数名はここではIFTTT URLとしています。

次に、URLの内容を取得を選択。 もし見つからない場合は、検索窓に”URL”と入力すると表示されると思います。

URLの内容を取得は特に変更は必要ありません。

ここまでの設定で問題ない場合もありますが、稀にショートカット実行時(ここではSiriにエアコンをつけるようにお願いしたとき)、 即時実行してくれない場合があります。

お願いしたら即やってもらいたいので、以下も設定しておきました。
設定するには、iOS標準のメールアプリが必要になります。

メールを送信を追加。

作成シートを表示をOFF。
送信元はIFTTTに登録してあるメールアドレス。※僕はGoogleアカウントとIFTTTが紐付いているので、自動でGmailアドレスが設定されていました。
宛先には、[email protected]を指定。

ここまでできたら、赤枠のボタンをタップして、実行してみます。

実行が完了して、連携が成功してwebhooksが実行されれば通知がきます。 さらに、エアコンがONになれば成功です。

あとはSiriに話しかけて実行できるように設定していきます。
右上のマークをタップ。

名前、アイコンを任意のものに変更します。

そして、Siriに追加をタップ。

録音ボタンを押して、このショートカットを実行したいときのセリフを登録します。

僕は、「エアコンつけて」にしました。

問題なければ、完了をタップ。

これで、「Hey Siri、エアコンつけて」が実現できました!

参考サイト