【ラズパイ入門】赤外線リモコンの信号受信、押されたボタンの識別【Python】

「Raspberry Pi」はLinuxOS相当のOS上でブラウザ操作やプログラミングが直接可能でありながら、汎用入出力(GPIO)ピンを標準搭載しているため「センサー系」「駆動系」との接続、制御が容易に可能なコンピュータです。

こちらの記事では、GPIOピンをLED素子と接続し、GPIOピンを出力モードに設定してLED素子を点滅させる方法を紹介しました。今回はGPIOピンを入力モードとして使用する事例として、GPIOピンと赤外線受信機を接続し、赤外線リモコンの信号を受信する方法を紹介します。

「Raspberry Pi」はその特徴から「常駐型サーバ」「IOTデバイス」として用いられることも多いと思います。そのため、ユーザが外部から簡単に信号を送信することができれば、活用の幅が広がりますので、ぜひ参考にしてください。

PS4コントローラとRaspberry Pi 3BをBluetooth接続し、キーイベントを取得する方法もこちらの記事で紹介しています。PS4コントローラを使用する場合は、Bluetooth接続が前もって可能なことや、長期間の接続が困難といった制約があります。この記事で紹介する方法は、「Raspberry Pi」の5V出力ピンと、GPIOピンのみを使用するためハードウェア上の制約が少なく、より汎用的な方法になります。

 

「Raspberry Pi」は以下の記事をもとに、OSのインストールと環境設定されていることを前提としています。
関連記事

この記事では、Raspberry Piの購入後に実施する以下の2点について、書いています。 1. OS(Raspbian)インストール 2. 初期セットアップ この記事は以下のような方向けのものになります。 Raspberr[…]

raspberry-pi-initial-set-up
関連記事

この記事では、Raspberry Pi 3 MODEL Bを対象に、ロボット製作に適した開発環境のセットアップ手順を紹介します。 このセットアップ手順を実行することで、以下の記事で紹介したようなロボット用のプログラミングが可能になりま[…]

make-jupyter-notebook
※「3. 主要なパッケージのインストール」までで、本記事に必要な「Python」「RPi.GPIO」がインストールされます。その他の設定は必須ではない認識ですが、省略した上で本記事で紹介するスクリプトが正常に動作するかは未検証です。
広告

 

動作確認済み環境


開発マシン: Raspberry Pi 3 MODEL B
OS: Raspbian Buster with desktop(Release date: 2019-09-26)
プログラミング言語: python2(version=2.7.16) or python3(version=3.7.3)

 

用意するもの


(必須)
・Raspberry Pi本体 × 1個
・ブレッドボード × 1個
・赤外線受信機(VS1838B) × 1個
・ジャンパワイヤ(+側、オスーメス) × 2本
・ジャンパワイヤ(-側、オスーメス) × 1本
・赤外線リモコン(Car mp3) ※テレビのリモコンでも可
※この記事で紹介する方法では、「Raspberry Pi本体」と「ブレッドボード 」以外は、「Kuman 35個 電子工作入門キット ラズベリーパイ」という商品に同梱されているものを使用しています。
(任意)
・LED素子 × 1~3個
・抵抗器 × 1~3個
・ジャンパワイヤ(+側、オスーメス) × 1~3本
・ジャンパワイヤ(-側、オスーオス) × 1~3本
この記事では、赤外線リモコンのボタン押下時に対応したLED素子を点灯させることで、ボタンの識別結果の整合性を確認します。
赤外線受信機は「Kuman 35個 電子工作入門キット ラズベリーパイ」に同梱されているVS1838Bを使用します。この赤外線受信機の動作電圧は5Vであるため、「Raspberry Pi 」の5V出力端子と直接接続するのみで動作しますが、他の赤外線受信機を使用する場合は仕様に合わせた電源の確保や抵抗器の準備が必要になる可能性があります。
抵抗器の抵抗値は、GPIOピンの出力電圧(3.3V)と、LED素子の最大定格電流から、オームの法則(電圧(V)=電流(I)×抵抗値(R))をもとに決定してください。最大定格電流を超える電流を流すとLED素子が故障する可能性があります。「Kuman 35個 電子工作入門キット ラズベリーパイ」に同梱されているLED素子を使用する場合は付属の「CDチュートリアル」を参考に、抵抗値は220Ωのものを使用します。
ジャンパワイヤ(オスーメス)は、ジャンパワイヤ(オスーオス)とジャンパワイヤ(オスーメス)を組み合わせて作成します。

 

配線方法


(赤外線受信機)※必須

  1. 「Raspberry Pi」の5V出力ピン(5V)を、赤外線受信機(VS1838B)の「VCC」端子に接続する。
  2. 「Raspberry Pi」のGPIOピン(g26)を、赤外線受信機(VS1838B)の「OUT」端子に接続する。
  3. 「Raspberry Pi」のグラウンド(GND)を、赤外線受信機(VS1838B)の「GND」端子に接続する。
「赤外線受信機(VS1838B)」の端子は、右から「VCC」「GND」「OUT」と並んでいます。
GPIOピンは26番を使用していますが、任意に変更可能です。ただし、後ほど紹介するPythonスクリプトで指定するピン番号は使用したピン番号に対応させる必要があります。

赤外線受信機(VS1838B)のデータシート

 

(LED素子)※任意

  1. 「Raspberry Pi」のGPIOピン(g16, g20, g21)を、抵抗器(220Ω)を挟んで、「LED素子」のプラス側に接続する。
  2. 「Raspberry Pi」のグラウンド(GND)を、「LED素子」のマイナス側に接続する。
「LED素子」は、基本的に足が長い方がプラス側、短い方がマイナス側になります。
GPIOピンは16、20、21番を使用していますが、任意に変更可能です。ただし、後ほど紹介するPythonスクリプトで指定するピン番号は使用したピン番号に対応させる必要があります。

(設計図)※任意部分は青色のワイヤで表しています。

infrared_receive

(実際の配線イメージ)

infrared_receive_image

※写真は見やすさのために設計図と前後逆(赤外線受信部分が手前に来る向き)の状態で撮影しています。

 

(Raspberry Pi 3のピン配置)

GPIO

※UART、I2C、SPI用のピンも使用可能です。

広告

 

プログラミング


①事前準備

「Raspberry Pi」のGPIOピンを使用して赤外線を受信する場合は、通常の「RPi.GPIO」ではなく「pigpio」パッケージを使用します。2つのパッケージの違いはその応答速度で、連続的に放出される赤外線の時系列データを認識する際には応答速度の速い「pigpio」でないと正確に識別することができません。

Pythonスクリプトの作成の前に、まずはこの「pigpio」パッケージのインストールし、「pigpio」のデーモン(バックグラウンドの常駐プロセス)を起動しておく必要があります。

(手順)

①-1. pigpioのインストール

 

①-2. pigpioのデーモン起動

繰り返しになりますが「pigpio」パッケージを使用する場合には、事前にデーモン(バックグラウンドの常駐プロセス)を起動しておく必要があります。上記コマンドで「Raspberry Pi」起動時にデーモンが起動するように設定を変更します。

 

①-3. pigpioのステータスの確認

「pigpiod.service」の「Active」状態が「active (running)」となっていることを確認します。

 

②赤外線リモコンのボタンの学習

赤外線リモコンのボタンを識別するためには、ボタンに対応した赤外線のパターンを事前に学習データとして保存しておく必要があります。保存したパターンと受信した赤外線を比較することにより押下された赤外線リモコンのボタンを識別します。

赤外線のパターンの取得には既存のPythonスクリプト(パブリックドメイン)を使用します。

(手順)

②-1. こちらのサイトから「IR Record and Playback」(irrp_py.zip)をダウンロード・解凍

 

②-2. 「irrp.py」を実行

(実行コマンド)

(引数オプション)

オプション名 説明 詳細
-r レコードモードで実行 指定したボタンの赤外線の時系列データを保存するモードで実行する
-g{GPIO Number} GPIOピンの番号を指定 赤外線受信機「OUT」端子を接続したGPIOピン番号を指定する
-f{OUTPUT_FILE_NAME} 出力ファイル名を指定 {OUTPUT_FILE_NAME}にレコード結果を保存する(Json形式)
なし レコードするボタン名を指定 任意の名前で複数個のレコード対象のボタンを指定できる

 

②-3. 「irrp.py」の標準出力に従って、学習させたい赤外線リモコンのボタンを押下

(標準出力の例)

・「Press key for {ボタン名}」「Press key for {ボタン名} to confirm」に続いて、赤外線リモコンのボタンを2回押下します。
・「Short code, probably a repeat, try again」と出力されても再度ボタンを押下すれば問題ありません。

 

②-4. 「irrp.py」と同じフォルダ内にレコード結果が保存されていることを確認

(レコード結果の例)

※赤外線リモコン(Car mp3)の全ボタンのレコード結果

 

③赤外線リモコンのボタンの識別

(Pythonスクリプト)

(実行コマンド)

・ボタンの識別結果の確認のために、「0」~「3」ボタン押下時のLEDの点灯パターンを変化させています。
・LEDの点灯方法に関しては末尾で紹介する関連記事内で説明していますので割愛します。
・赤外線受信に関する「normalise」「compare」「cbf」関数は、「irrp.py」からそのまま流用しています。
・受信した赤外線は照射角度や照明の明るさなどの影響で変化するため、事前に学習したパターンとの完全一致ではなく「irrp.py」の「compare」関数で比較しています。
・28-38行目の定数値は「irrp.py」のデフォルト値を設定しています。
(動作確認の様子)

 

関連記事


関連記事

「Raspberry Pi」はLinuxOS相当のOS上でブラウザ操作やプログラミングが直接可能でありながら、汎用入出力(GPIO)ピンを標準搭載しているため「センサー系」「駆動系」との接続、制御が容易に可能なコンピュータです。 その[…]

eye_catch
関連記事

この記事では、以前に紹介した ・1602 LCDモジュールに任意の文字列を表示する方法 ・赤外線リモコンのボタンを識別する方法 を組み合わせて、1602 LCDモジュールをマルチモニター化する方法を紹介します。 赤外線リモコンの[…]

関連記事

この記事では、Raspberry Pi 3 MODEL BとPS4コントローラ(以下では、「DS4」とします。)をBluetooth接続し、「Linux Input Subsystem」経由でキーイベントを取得する方法を紹介します。 […]

connect-ps4-controller-image
関連記事

先日公開した記事ではロボット本体の組み立て方法について紹介しました。 この記事では組み立てたロボットを動作させるソフトウェアのプログラミング方法について紹介します。 開発環境は以下の通りです。 開発・制御用コンピュータ[…]

develop-robot-apps-env
広告