ラズパイで赤外線制御 (家電、エアコン、照明、テレビなどを制御するホームIoT)

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

更新日 : 2024年9月29日

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にステータスを表示させたり、スイッチが押されたら何らかの動作をさせるなど、自分が好きなように動作をプログラミングすることが可能になります。

Raspberry Pi 5について

Raspberry Pi 5では信号制御に利用しているpigpioが動作しないため、本ソフトも動作しません。 対応は検討中です。

Raspberry Pi 4以前のモデルを使用してください。

赤外線制御プログラムの準備

赤外線制御ソフトウェア「cgir」をインストールします。ターミナルを開き、以下の$に続くコマンドを実行して下さい。ソースコードはGitHubに公開しています。

$ sudo python3 -m pip install -U cgir --break-system-packages

エラーが出る場合は最後のオプションを指定せずにお試しください。

$ sudo python3 -m pip install -U cgir

これまではプログラムファイルをダウンロードする形でしたが、2022年1月よりcgirをコマンドでインストールできるようになりました




pigpioの準備

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

sudo systemctl start pigpiod

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

sudo systemctl enable pigpiod

cgirとpigpioとはポート番号8888で通信しますので、他のソフトウェア等で8888を使用しないようにして下さい。

拡張基板の準備

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

RPZ-PIRS
RPi TPH Monitor

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

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

$ cgir rec tv_power

デフォルトでは拡張基板「RPZ-PIRS」、「RPZ-IR-Sensor」、「RPi TPH Monitor」に対応したGPIO4を使用します。変更する場合は「-g」オプションにつづけてGPIO番号を指定します。詳細は「cgir -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" を登録しました.

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

$ cgir rec tv_power tv_volp tv_volm

赤外線を送信する

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

$ cgir send tv_power

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

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

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

$ cgir send -w 3 tv_power tv_volp tv_volp



うまく動作しない場合

赤色LEDが点灯/点滅し続ける場合

cgir sendコマンド後、赤外線送信中を示す赤色LEDが点灯/点滅し続ける現象が発生した場合は、LEDに大きな電流が流れ続けている状態のため、まずRaspberry Piの電源ケーブルを取り外して電源を落として下さい。その後、以下の対策をお試しください。

pigpioの設定を変更する

pigpioを自動起動にしている場合、起動タイミングを遅らせると解決する場合があります。スーパーユーザーで /lib/systemd/system/pigpiod.service ファイルを開き、2行目のDescription行の次の行に「After=multi-user.target」を追加します。編集後にRasbperry Piを再起動します。

[Unit]
Description=Daemon required to control GPIO pins via pigpio
After=multi-user.target
[Service]
... (これ以降変更なし)

一部環境で、pigpioのクロックソースがPCMの場合、意図した周波数にならず送信に失敗(機器が反応しない)する現象を確認しています。その場合は以下をお試しください。

スーパーユーザーで /lib/systemd/system/pigpiod.service ファイルを開き、ExecStart行の最後に「-t 0」を追加します。編集後にRasbperry Piを再起動します。

ExecStart=/usr/bin/pigpio -l -t 0

設定ファイルの編集方法が分からない場合は、以下の記事を参考にして下さい。

電源とUSBケーブルの見直し

電源の供給能力が低い場合や、USBケーブルが長すぎて電圧が下がっている場合にうまく動作しない場合があります。他の電源とUSBケーブルをお試しください。コンセントに挿す電流供給能力の大きい電源、および短いUSBケーブルが適しています。

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

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

$ cgir list
登録済赤外線コード
tv_power

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

$ cgir del tv_power
赤外線コード "tv_power" を削除しました.

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

$ cgir rec -c /file_path tv_power
$ cgir list -c /file_path

赤外線データ解析

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

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

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

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

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

$ cgir 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ファイルの書式は、デコードで作成されたファイルを編集するか、参考にして下さい。

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

$ cgir enc -f tv_power.json tv_power2

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

まとめ

Pythonとpigpioを使ってRaspberry Piで赤外線の送受信を行う方法とサンプルプログラムの使い方についての解説は以上です。

赤外線通信を使うと、Raspberry Piで自在にテレビ、エアコン、照明などの家電をコントロールしたり、スマートフォンなどから遠隔で操作することが可能です。また、汎用リモコンでRasbperry Piに指示を出すようなことも考えられます。エアコンの自動ON、消し忘れ機能を実装する方法も記事にしているので参考にして下さい。

ラズパイと赤外線でエアコンの自動ON、消し忘れ機能を実現

普段、エアコンを消し忘れてしまい夜間つけっぱなしにしてしまったり、冬場に朝エアコンを入れても暖かくなるのに時間がかかったことは無いでしょうか?本記事では、Raspberry Piと拡張基板を利用して、毎晩のエアコン消し忘れ機能、および朝に温度が低い場合に自動で暖房を入れる機能を実現します。

ステッピングモーターの電流を最適化して省電力化&発熱対策 (Raspberry Pi + RPZ-Stepper)

ステッピングモーターは軽負荷や停止時であっても電流を消費するという特徴があります。一般的なモータードライバーだと、停止時にも電力を消費し続けたり発熱してしまいます。RPZ-Stepperは回転時、停止時それぞれについて、電流値を変更できるため、最適な値にすることで省電力化が可能です。また、ドライバーICの温度や、消費電流の測定も可能で、発熱やバッテリーでの動作時間の見積もりが可能です。

RPZ-RC-Servo (Raspberry Pi用 サーボモータードライバー)

RCサーボモーターを制御できるRaspberry Pi(ラズパイ)用拡張基板です。モーターの角度(位置)を指示すれば、自動で目標までモーターを動かしてくれます。ものを動かしたり回転させるシステムが実現できます。Raspberry Piへ電力を供給する機能もあり、単一電源でシステムを構成できます。