PythonとpigpioでRaspberry Piの赤外線制御 (家電、エアコン、照明、テレビなどを制御するホームIoT)

Pythonとpigpioを使ってRaspberry Piで赤外線の送受信を行う方法について解説しています。サンプルプログラムを用意しているので、簡単に受信、登録、送信動作をさせることができるほか、データ解析も可能です。赤外線を使ってエアコン、照明、テレビなどの家電を制御することが可能になります。

更新日 : 2020年9月3日

pigpioについて

pigpioはRaspberry PiでGPIOを制御するライブラリの1つで、モジュールを通じてPythonから利用できます。赤外線送受信はタイミングがシビアで、通常のGPIOを制御する方法だと、他のタスクが入るなどでタイミングがずれてうまくいかないケースがあります。pigpioにはマイクロ秒オーダーで波形を制御する機能があり、これを使うことで安定した赤外線通信が可能になります。

pigpioは赤外線に特化したものではないので、別途プログラムを準備する必要があります。そこで、Indoor Corgiでサンプルツールを開発、用意したので、簡単に赤外線送受信をすることができます。

Pythonやpigpioを使った基本的なGPIO制御の方法、プログラムの書き方を知りたい方は、以下の記事を参照して下さい。

PythonでRaspberry PiのGPIO、LED、スイッチ制御

Raspberry Pi(ラズパイ)では、GPIOを通じて電気信号を送受信することで、様々なデバイスを制御することができます。本記事では、基本的なLEDとスイッチについて、Pythonプログラムで制御する方法を解説します。LEDにステータスを表示させたり、スイッチが押されたら何らかの動作をさせるなど、自分が好きなように動作をプログラミングすることが可能になります。

LIRCについて

これまで、LIRCを使って赤外線制御する方法を解説していましたが、初期設定や送信データの登録などがややこしく、バージョンの違いによる変更も多くなっていました。初めて赤外線を使う方や、特に理由が無い方は、初期設定や送信データの登録が簡単な本記事の方法を推奨します。

サンプルコードのダウンロード

以下からダウンロードして、cgir.pyとcgirtool.pyを同じディレクトリに配置してください。

ファイル機能
cgir.pypigpioを使って赤外線の送受信、データ解析をするモジュール
cgirtool.py赤外線送受信、データ解析をコマンドラインから使用できるようにしたツール

Pythonプログラムの準備

cgirtoo.pyでは、docoptモジュールを利用しています。以下のコマンドを実行してインストールします。

sudo pip3 install docopt

pigpioの準備

pigpioを使うには、Pythonプログラムを実行する前に、サービスを実行しておく必要があります。以下のコマンドを実行します。

sudo service pigpiod start

Raspberry Pi起動時にpigpiodを自動で立ち上げたい場合は以下を実行します。

sudo systemctl enable pigpiod.service

拡張基板の準備

赤外線送受信機能が搭載されている拡張基板「RPZ-IR-Sensor」もしくは「RPi TPH Monitor」を装着します。GPIO番号を合わせることで、他の基板や自作の回路の場合でも動作させることができます。

RPZ-IR-Sensor
RPi TPH Monitor

赤外線を受信してコードを記録する

いよいよ赤外線を受信してみます。お使いの家電などのリモコンを準備して、以下のコマンドを実行します。「rec」は赤外線を受信して登録する動作を指示しています。「tv_power」の部分は登録する名前で、自由に付けることができます。ここでは、例としてテレビの電源ボタンを「tv_power」としました。

./cgirtool.py rec tv_power

エラーが出る場合は、cgirtool.pyと同じディレクトリに移動して実行して下さい。cgir.pyもモジュールとして使用するので、同じディレクトリに入れておきます。

デフォルトでは拡張基板「RPZ-IR-Sensor」と「RPi TPH Monitor」に対応したGPIO4を使用します。変更する場合は「-g」オプションにつづけてGPIO番号を指定します。詳細は「cgirtool.py -h」で表示されるヘルプを参照して下さい。

以下のように受信中のメッセージが表示されるので、リモコンのボタンを押して受信機に向けて送信して下さい。

------------------------------------
赤外線コード"tv_power"を受信中...  受信機に向けて赤外線を送信して下さい.

以下のように受信コードが表示されれば成功です。受信コードは赤外線のパルス波形の時間と、空白時間をus(マイクロ秒)で記録したものです。デフォルトでは「codes.json」というファイルに、先ほど指定した名前「tv_power」で保存されます。

対応フォーマットであれば、続けてデータの内容も表示されますが、ここでは気にしなくて構いません。

以上で受信と登録は完了です。

------------------------------------
赤外線コード"tv_power"を受信中...  受信機に向けて赤外線を送信して下さい.

受信コード
[9000, 4400, 640, 500, 640, 500, 640, 500, 630, 500, 630, 1600, 640, 500, 640, 1600, 640, 500, 640, 1600, 640, 1600, 640, 1600, 640, 1600, 640, 500, 630, 1600, 640, 500, 640, 1600, 640, 1600, 640, 1600, 640, 1600, 650, 500, 640, 1600, 640, 510, 630, 500, 640, 510, 630, 500, 640, 500, 650, 500, 640, 1600, 640, 500, 640, 1600, 640, 1600, 640, 1600, 640]

Format NEC
Frame#1 0x50, 0xAF, 0x17, 0xE8

赤外線コード "tv_power" を登録しました.

以下のように複数の名前をスペースで区切って指定すると、連続で受信&登録することができます。複数のボタンを登録する際に便利です。

./cgirtoo.py rec tv_power tv_volp tv_volm

赤外線を送信する

次に、先ほど受信して登録した「tv_power」を送信してみます。以下のコマンドを実行します。「send」は赤外線を送信する動作を指示しています。「tv_power」の部分は登録済みのコードから送信したいものを選びます。

./cgirtool.py send tv_power

デフォルトでは拡張基板「RPZ-IR-Sensor」と「RPi TPH Monitor」に対応したGPIO13を使用します。変更する場合は「-g」オプションにつづけてGPIO番号を指定します。詳細は「cgirtool.py -h」で表示されるヘルプを参照して下さい。

赤外線LEDを実際の家電などに向けて送信し、機器が反応すれば成功です!

以下のように複数の名前をスペースで区切って指定すると、連続で送信することもできます。「-w」オプションで送信の間隔を秒数で指定します。

./cgirtool.py send -w 3 tv_power tv_volp tv_volp

登録された赤外線コードを管理する

登録済みの赤外線コードを確認するには、以下のように「list」サブコマンドを使用します。

./cgirtool.py list
登録済赤外線コード
tv_power

不要になったものを削除するには「del」サブコマンドを使用します。

./cgirtool.py del tv_power
赤外線コード "tv_power" を削除しました.

登録された赤外線コードは、デフォルトでは現在のディレクトリの「codes.json」ファイルに保存されます。違う場所で実行するとこのファイルが見つからず、登録済みのコードが使えません。そういった場合は「-c」オプションでパスとファイル名を指定して下さい。「-c」オプションは受信や送信動作でも使用可能です。

./cgirtool.py rec -c /file_path tv_power
./cgirtool.py list -c /file_path

赤外線データ解析

パルスと空白時間を記録した赤外線コードを見ただけだと、実際にどんなデータを送っているのか分かりにくいと思います。本ツールには対応フォーマットである、AEHA(家製協)、NEC、SONYフォーマットであれば、コードを解析してデータに変換する機能があります。

例えば、エアコンでは「冷房」のボタンを押した場合でも、実際には温度や風量などのデータも送られていることが多いです。データ解析機能を使うと、どこのバイトが温度のデータか推測したり、逆に自分の好きな温度のコードを生成するようなことが可能です。

なお、手持ちのリモコンの赤外線コードを記録して、それを再利用(送信)するだけであればデータ解析をする必要はありません。

赤外線コードをデータに変換(デコード)

登録済みコードをフォーマットとデータに変換するには以下のコマンドを実行します。結果は画面に表示される他、「-f」オプションで指定したファイルにjson形式で保存されます。なお、このjsonファイルは、コードを保存している「codes.json」とは別のものです。「codes.json」を上書きしないように注意して下さい。

./cgirtool.py dec -f tv_power.json tv_power
赤外線コード "tv_power" をデコード

コード
[9000, 4400, 630, 510, 630, 500, 640, 500, 640, 500, 640, 1600, 630, 510, 630, 1600, 640, 500, 640, 1600, 640, 1600, 640, 1600, 630, 1600, 620, 520, 610, 1650, 610, 530, 610, 1650, 630, 1600, 610, 1650, 620, 1650, 640, 510, 610, 1650, 630, 500, 640, 510, 640, 500, 640, 500, 640, 510, 630, 510, 630, 1600, 640, 500, 620, 1650, 610, 1650, 630, 1600, 640]

Format NEC
Frame#1 0x50, 0xAF, 0x17, 0xE8

ファイル "tv_power.json" へ保存しました.

データから赤外線コードを生成(エンコード)

今度は逆に、送信したいフォーマットとデータを含むjsonファイルから、赤外線コードを生成して登録してみます。jsonファイルの書式は、デコードで作成されたファイルを編集するか、参考にして下さい。

今回は例として、先ほどデコードしたファイルをそのまま利用します。以下のコマンドを実行します。

./cgirtool.py enc -f tv_power.json tv_power2

これで、生成したコードが「tv_power2」として登録されます。今回は特にデータを変更していないので、「tv_power」と同じ機能になります。

まとめ

Pythonとpigpioを使ってRaspberry Piで赤外線の送受信を行う方法とサンプルプログラムの使い方についての解説は以上です。赤外線通信を使うと、Raspberry Piで自在にテレビ、エアコン、照明などの家電をコントロールしたり、スマートフォンなどから遠隔で操作することが可能です。また、汎用リモコンでRasbperry Piに指示を出すようなことも考えられます。

Indoor Corgi製の拡張基板「RPZ-IR-Sensor」は赤外線以外にも温度、気圧、湿度、明るさセンサーを搭載しているので、温度が一定を超えたらエアコンをONする、といった応用が可能です。ぜひ参考にして下さい。

RPZ-IR-Sensor (Raspberry Pi用 温度/湿度/気圧/明るさ/赤外線 ホームIoT拡張ボード)

動作を自由にプログラミング可能な、Raspberry Pi/Zero(ラズパイ)用ホームIoT拡張ボードです。BME280温湿度気圧センサーとTSL2572明るさセンサー、赤外線送受信機能を搭載。IoT赤外線リモコンとして、温度が上がったらエアコンをオンにする、暗くなったら照明を点灯する、スマホ経由でテレビの操作をする、気温の記録、といった使い方が可能です。

RPi TPH Monitor Rev2 (Raspberry Pi用 温度/湿度/気圧/赤外線 ホームIoT拡張ボード)

動作を自由にプログラミング可能な、Raspberry Pi(ラズパイ)用ホームIoT拡張ボードです。BME280温湿度気圧センサーと赤外線送受信機能を搭載。IoT赤外線リモコンとして、温度が上がったらエアコンをオンにする、スマホ経由でテレビの操作をする、気温の記録、といった使い方が可能です。ディスプレイやLEDに情報表示も可能です。

ESP-IR+TPH Monitor (ESP-WROOM-02搭載 WiFi/赤外線/温度/湿度/気圧 ホームIoT基板)

Arduino IDEで動作を自由にプログラミング可能なホームIoT基板です。WiFi内蔵マイコンであるESP-WROOM-02を採用しました。温度/湿度/気圧センサーと赤外線送受信機能を搭載。IoT赤外線リモコンとして、温度が上がったらエアコンをオンにする、スマホ経由でテレビの操作をする、気温の記録、といった使い方が可能です。