ラズパイを赤外線リモコン化してエアコンや扇風機を自動制御する
エアコンや扇風機など、赤外線リモコンで制御できる家電をRaspberry Piから制御してみたいと思います。
ラズパイを赤外線リモコン化する手順はこんな感じです!
使用したのはRaspberry Pi 4Bです。
こちらの記事ではスマホからのオンオフ制御もやってみました。
赤外線リモコンを学習させる
はじめに、使用するリモコンの赤外線の信号をラズパイに学習させる必要があります。
リモコンのボタンを押した時に出力される赤外線を赤外線受信モジュールを使って受信し、その信号を保存するという流れです。
赤外線受信モジュール
赤外線受信モジュールとは、フォトダイオード、フィルタ、アンプなどがパッケージ化されたもので、受信した赤外線のパターンを電気信号に変換して出力することができます。
この電気信号のパターンを学習することで、リモコンのボタンをコピーすることができるのです、
今回使った赤外線受信モジュールはOSRB38C9AAです。
端子は左から、出力、GND、電源です。
それぞれラズパイボードの、GPIO21、GND、3.3Vに接続します。
pigpioをインストール
次に、赤外線のパターンを学習するためのプログラミングの準備していきます。
「pigpio」はGPIOを制御するパッケージです。
「RPi.GPIO」より応答が高速です。
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install pigpio python3-pigpio
インストールしたら起動時にpigpioを自動起動するようにしておきます。
sudo systemctl enable pigpiod.service
sudo systemctl start pigpiod
これでpigpioがデーモンとして起動時に自動で起動します。
IR Record and Playbackを使って学習
「IR Record and Playback」はラズパイのGPIOに入力された赤外線パターンを読み取って保存することができます。
また、保存したパターンを送信することもできます。
赤外線パターンの学習の手順は次の通りです。
- IR Record and Playbackをダウンロード
- ダウンロードしたファイルを解凍
- irrp.pyの実行
- 赤外線パターンの学習
1.ダウンロード
下記のコマンドでIR Record and Playbackをダウンロードします。
wget http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip
2.解凍
ダウンロードしたファイルをunzipで解凍します。
unzip irrp_py.zip
unzipをインストールしていない場合は、下記コマンドでインストールできます。
sudo apt install zip unzip
3.実行
解凍した「irrp.py」を実行します。
python3 irrp.py -r -g21 -f circulator power flow updown lr
オプションの説明は次の通りです。
オプション | 説明 |
---|---|
-r | 学習モード |
-g21 | GPIOの番号を指定 GPIO21を選択しているので「-g21」となる |
-f circulator | 学習値を保存するファイル名を指定 今回は「circulator」というファイル名で保存 |
power flow updown lr | 学習するボタンの名称を指定 今回は、power、flow、updown、lrという4つの名前で保存する |
サーキュレーターの制御をやってみようと思うので、学習値を保存するファイルを「circulator」としました。
学習させるのは4つのボタンで、
- 電源オン・オフ→power
- 風量→flow
- 上下首振り→updown
- 左右首振り→lr
としました。
4.学習
実行すると、「Press key for ‘power’」と表示されるので、赤外線受信モジュールに向けてリモコンの電源オン・オフボタンを押します。
すると、「Press key for ‘power’ to confirm」と確認を要求されるので、もう一度電源オン・オフボタンを押します。
これが、flow、updown、lrと順番に繰り返されます。
完了すると、irrp.pyと同じディレクトリに「circulator」というファイルが生成されています。
中身はこのようになっています。
{"flow": [9034, 4502, 589, 555, 589, 555, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589],
"lr": [9034, 4502, 589, 555, 589, 555, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589, 1676, 589, 555, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 555, 589, 1676, 589, 555, 589, 1676, 589, 555, 589, 1676, 589, 1676, 589, 555, 589],
"power": [9034, 4502, 589, 555, 589, 555, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589],
"updown": [9034, 4502, 589, 555, 589, 555, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 1676, 589, 555, 589, 555, 589, 555, 589, 1676, 589, 1676, 589, 555, 589]}
ラズパイから赤外線送信
学習した赤外線パターンを送信します。
irrp.pyを送信モードで実行し、赤外線LEDからパターンを送信します。
赤外線LED
今回使った赤外線LEDは「OSI5FU5111C-40」です。
ちょっと大きめで、電流はDCで100mAまで流せます!
Raspberry Piとはこのように接続します。
カソードをGPIO20に接続、3.3Vとアノード間の抵抗は220Ωを4パラ(55Ω)にしています。
このLEDのVFは1.35Vなので、LEDに流れる電流:IFは、
\[
IF = \frac{3.3 – 1.35}{55} = 35.5mA
\]
ですが、おそらくGPIOの出力抵抗が数十Ωあるので、実際にはそんなに流せていないと思います。
また、4Bの定格電流はTBDでしたが、類似品では16mAとなっていました。
電流を流しすぎですが、定常的に流れるわけではないので良しとします(自己責任でお願いします!)
本来は間にトランジスタを入れて電流を流すべきですね。
電流をもっと流せるので、赤外線の送信距離も長くできます。
irrp.pyを送信モードで実行
次のコマンドでirrp.pyを送信モードで実行します。
python3 irrp.py -p -g20 -f circulator power
「-p」が送信モードのオプション、赤外線LEDはGPIO20に接続しているので、「-g20」を指定します。
これで「circulator」ファイルに保存された「power」の信号が送信されます。
登録した風量切り替えや首振りも同様に制御できます。
ラズパイからコマンドでサーキュレーターを制御 pic.twitter.com/9mR1x5OUdA
— りょうのすけ (@ryo_analog) 2022年7月24日
これだけでは単にリモコンの代わりになっただけなので、気温によって自動的にオン・オフさせてみたいと思います。
エアコンや扇風機を自動でオン・オフさせる
温湿度センサー:DHT11を使って温度をモニターし、設定した温度で自動的にオン・オフするプログラムを作ってみます。
気温が高い時だけ扇風機をオンさせたり、エアコンから離れた場所の温度制御などに使えます。
今回は、先程使ったサーキュレーターを自動的にオン・オフさせたいと思います。
Pythonコード
import RPi.GPIO as GPIO
import dht11
import time
import subprocess
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)
instance = dht11.DHT11(pin=17)
circulator = 0
settemp = 27 #設定温度
#irrp.pyを実行するコマンド
cmd = "python3 irrp.py -p -g20 -f circulator power"
try:
while True:
result = instance.read()
if result.is_valid():
if circulator == 0 and float(result.temperature) > float(settemp): #サーキュレーターがオフ、かつ設定温度以上
subprocess.run([cmd], shell=True) #サーキュレーターをオン
circulator += 1 #circulator = 1(オン状態)
elif circulator == 1 and float(result.temperature) < float(settemp -1): #サーキュレーターがオン、かつ設定温度-1℃以下
subprocess.run([cmd], shell=True) #サーキュレーターをオフ
circulator -= 1 #circulator = 0(オフ状態)
time.sleep(3)
except KeyboardInterrupt:
if circulator == 1:
subprocess.run([cmd], shell=True)
GPIO.cleanup()
サーキュレーターがオンかオフかを「circulator」の値で判断します。
0がオフ、1がオンです。
デフォルトが0のため、必ずサーキュレーターがオフしている状態でプログラムを走らせる必要があります。
irrp.pyはシェルコマンドで実行させるように作られています。
なので、「subprocess」を使ってコマンドを送信する必要があります。
サーキュレーターをオフさせる温度は設定温度より1℃低くしています。
そうしないと、設定温度付近でオン・オフをずっと繰り返してしまうためです。
実行結果
分かりやすいようにLCDに現在の気温とオン・オフ設定温度を表示させています。
LCDの使い方はコチラ