「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の購入後に実施する以下の2点について、書いています。 1. OS(Raspbian)インストール 2. 初期セットアップ この記事は以下のような方向けのものになります。 Raspberr[…]
この記事では、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)
用意するもの
・ブレッドボード × 1個
・赤外線受信機(VS1838B) × 1個
・ジャンパワイヤ(+側、オスーメス) × 2本
・ジャンパワイヤ(-側、オスーメス) × 1本
・赤外線リモコン(Car mp3) ※テレビのリモコンでも可
※この記事で紹介する方法では、「Raspberry Pi本体」と「ブレッドボード 」以外は、「Kuman 35個 電子工作入門キット ラズベリーパイ」という商品に同梱されているものを使用しています。
・抵抗器 × 1~3個
・ジャンパワイヤ(+側、オスーメス) × 1~3本
・ジャンパワイヤ(-側、オスーオス) × 1~3本
赤外線受信機は「Kuman 35個 電子工作入門キット ラズベリーパイ」に同梱されているVS1838Bを使用します。この赤外線受信機の動作電圧は5Vであるため、「Raspberry Pi 」の5V出力端子と直接接続するのみで動作しますが、他の赤外線受信機を使用する場合は仕様に合わせた電源の確保や抵抗器の準備が必要になる可能性があります。
抵抗器の抵抗値は、GPIOピンの出力電圧(3.3V)と、LED素子の最大定格電流から、オームの法則(電圧(V)=電流(I)×抵抗値(R))をもとに決定してください。最大定格電流を超える電流を流すとLED素子が故障する可能性があります。「Kuman 35個 電子工作入門キット ラズベリーパイ」に同梱されているLED素子を使用する場合は付属の「CDチュートリアル」を参考に、抵抗値は220Ωのものを使用します。
ジャンパワイヤ(オスーメス)は、ジャンパワイヤ(オスーオス)とジャンパワイヤ(オスーメス)を組み合わせて作成します。
配線方法
(赤外線受信機)※必須
- 「Raspberry Pi」の5V出力ピン(5V)を、赤外線受信機(VS1838B)の「VCC」端子に接続する。
- 「Raspberry Pi」のGPIOピン(g26)を、赤外線受信機(VS1838B)の「OUT」端子に接続する。
- 「Raspberry Pi」のグラウンド(GND)を、赤外線受信機(VS1838B)の「GND」端子に接続する。
GPIOピンは26番を使用していますが、任意に変更可能です。ただし、後ほど紹介するPythonスクリプトで指定するピン番号は使用したピン番号に対応させる必要があります。
(LED素子)※任意
- 「Raspberry Pi」のGPIOピン(g16, g20, g21)を、抵抗器(220Ω)を挟んで、「LED素子」のプラス側に接続する。
- 「Raspberry Pi」のグラウンド(GND)を、「LED素子」のマイナス側に接続する。
GPIOピンは16、20、21番を使用していますが、任意に変更可能です。ただし、後ほど紹介するPythonスクリプトで指定するピン番号は使用したピン番号に対応させる必要があります。
(設計図)※任意部分は青色のワイヤで表しています。
(実際の配線イメージ)
※写真は見やすさのために設計図と前後逆(赤外線受信部分が手前に来る向き)の状態で撮影しています。
(Raspberry Pi 3のピン配置)
※UART、I2C、SPI用のピンも使用可能です。
プログラミング
①事前準備
「Raspberry Pi」のGPIOピンを使用して赤外線を受信する場合は、通常の「RPi.GPIO」ではなく「pigpio」パッケージを使用します。2つのパッケージの違いはその応答速度で、連続的に放出される赤外線の時系列データを認識する際には応答速度の速い「pigpio」でないと正確に識別することができません。
Pythonスクリプトの作成の前に、まずはこの「pigpio」パッケージのインストールし、「pigpio」のデーモン(バックグラウンドの常駐プロセス)を起動しておく必要があります。
(手順)
①-1. pigpioのインストール
①-2. pigpioのデーモン起動
①-3. pigpioのステータスの確認
②赤外線リモコンのボタンの学習
赤外線リモコンのボタンを識別するためには、ボタンに対応した赤外線のパターンを事前に学習データとして保存しておく必要があります。保存したパターンと受信した赤外線を比較することにより押下された赤外線リモコンのボタンを識別します。
赤外線のパターンの取得には既存の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」の標準出力に従って、学習させたい赤外線リモコンのボタンを押下
(標準出力の例)
・「Short code, probably a repeat, try again」と出力されても再度ボタンを押下すれば問題ありません。
②-4. 「irrp.py」と同じフォルダ内にレコード結果が保存されていることを確認
(レコード結果の例)
※赤外線リモコン(Car mp3)の全ボタンのレコード結果
③赤外線リモコンのボタンの識別
(Pythonスクリプト)
(実行コマンド)
・LEDの点灯方法に関しては末尾で紹介する関連記事内で説明していますので割愛します。
・赤外線受信に関する「normalise」「compare」「cbf」関数は、「irrp.py」からそのまま流用しています。
・受信した赤外線は照射角度や照明の明るさなどの影響で変化するため、事前に学習したパターンとの完全一致ではなく「irrp.py」の「compare」関数で比較しています。
・28-38行目の定数値は「irrp.py」のデフォルト値を設定しています。
関連記事
「Raspberry Pi」はLinuxOS相当のOS上でブラウザ操作やプログラミングが直接可能でありながら、汎用入出力(GPIO)ピンを標準搭載しているため「センサー系」「駆動系」との接続、制御が容易に可能なコンピュータです。 その[…]
この記事では、以前に紹介した ・1602 LCDモジュールに任意の文字列を表示する方法 ・赤外線リモコンのボタンを識別する方法 を組み合わせて、1602 LCDモジュールをマルチモニター化する方法を紹介します。 赤外線リモコンの[…]
この記事では、Raspberry Pi 3 MODEL BとPS4コントローラ(以下では、「DS4」とします。)をBluetooth接続し、「Linux Input Subsystem」経由でキーイベントを取得する方法を紹介します。 […]
先日公開した記事ではロボット本体の組み立て方法について紹介しました。 この記事では組み立てたロボットを動作させるソフトウェアのプログラミング方法について紹介します。 開発環境は以下の通りです。 開発・制御用コンピュータ[…]