LIRCなしでRaspberry PiにIRリモコンを接続 - Python UARTアプローチ
IRリモコンをRaspberry Piに統合する際、LIRCを使わずUARTシリアルインターフェースに直接アクセスすれば簡単かつ軽量です。ハードウェアセットアップからPythonデコードまで、最小限のコードでリモコン信号を確実に取得する全プロセスを解説します。
なぜLIRCをスキップするのか?
LIRCはIRデバイスの汎用フレームワークを提供しますが、シンプルなプロジェクトにはオーバースペックで、レイテンシや互換性問題を招くことも。内蔵UARTピン(TX/RX)と低速シリアルプロトコルを使えば、デバッグしやすい軽量で決定論的なソリューションが実現できます。
ハードウェア概要
- IRセンサー: HX1838(または任意の5V IRレシーバー)でシリアルデータ出力
- Raspberry Pi GPIO: センサー出力をGPIO 15(RX)に接続。センサーのVCCを5V、GNDをグランドピンに
- UARTピン設定: ttyAMA0のデフォルトコンソールを無効化し、UARTをセンサー入力専用に
ステップ1 - Raspberry PiをUART用に準備
1. カーネルコマンドラインをバックアップ:
sudo cp /boot/cmdline.txt /boot/cmdline_bp.txt
2. ttyAMA0パラメータを削除(例:console=ttyAMA0,115200、kgdboc=ttyAMA0,115200)/boot/cmdline.txtから:
sudo nano /boot/cmdline.txt
結果は以下のように:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 elevator=deadline rootwait
3. ttyAMA0ログインプロンプトをマスク /etc/inittabで:
sudo nano /etc/inittab
以下をコメントアウト:
#X:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
ステップ2 - pySerialインストール
UART通信用のPythonシリアルライブラリserialモジュールを提供するpySerialをインストール:
sudo apt-get install python-serial
インストール後、スクリプトでインポート可能:
import serial
ステップ3 - IRセンサー配線
- センサーの出力ピンをGPIO 15(RX)に接続
- センサーに5Vとグランドを供給
- センサーは出力のみなので、TX(GPIO 14)はこのプロジェクトでは未使用
ステップ4 - IRバイトを読み取る基本Pythonスクリプト
HX1838は2400bpsでシリアルストリームを送信。以下のスニペットはキー1回押下あたり12〜16バイトを読み取り、ASCIIコードを表示します。
import serial
ser = serial.Serial('/dev/ttyAMA0')
ser.baudrate = 2400
for _ in range(15): # 最大15バイト取得
byte = ser.read(1)
print(ord(byte))
試行錯誤の結果、2400bpsが最も確実でした。低速ほど空中伝送でのビットエラー確率が下がるためと考えられます。
ステップ5 - Samsungリモコンキーのデコード
Samsung TVリモコンで検証したところ、キー1回押下で12〜16バイトが得られました:
- バイト0-5: ヘッダー - 全キー共通
- バイト6-11: ペイロード - 押下ボタンを一意に特定
- バイト12: テール(このリモコン固有)
キーをマッピングするため、バイト6-11の重み付け和を計算:
keyidentity = (byte[6] + 2*byte[7] + 3*byte[8] + 4*byte[9] + 5*byte[10] + 6*byte[11])
最も堅牢な手法ではありませんが、各ボタンで一意の値が得られ比較が容易です。必要ならハッシュやXORに置き換えて衝突耐性を高められます。
完全例: ir_serial3samsung.py
以下は効率化されたスクリプトで:
- 24バイト(2フレーム分)読み取りシリアルバッファをフラッシュ
- 最初の12バイトのみでキーをデコード
- 計算された
keyidentityを即時表示
import serial
ser = serial.Serial('/dev/ttyAMA0', 2400)
while True:
# 24バイト読み取りでバッファクリア
raw = ser.read(24)
# 最初の12バイトが1キー分に対応
key_bytes = raw[:12]
key_id = sum((i+1)*b for i, b in enumerate(key_bytes[6:12]))
print(f'Key ID: {key_id}')
スクリプト実行後、Samsungリモコンのボタンを押すと一意のKey IDが表示されます。これらのIDをルックアップテーブルに格納し、アプリケーションのアクションにマッピングしてください。
結論
UARTとシンプルなPythonスクリプトでIRリモコン信号を取得すれば、LIRC不要でレイテンシ削減、デコードロジックの完全制御が可能。コードが最小限かつ透明なためデバッグも容易です。シリアルデータを出力するあらゆるIRリモコンにこのパターンを応用でき、Raspberry Piプロジェクトの汎用的なソリューションになります。
詳細な手順は元記事を参照:How to Use and Emulate…
製造プロセス
- Python、SQLite、LabVIEWによるRaspberry Pi高精度温度プロファイリング
- Raspberry Pi 2でDS18B20温度センサー読み取りガイド
- Raspberry PiでMaxim 1-WireセンサーとDS2482 I2Cブリッジを用いた温度測定
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- Raspberry Piでサーバークローゼットの温度を正確に監視
- Raspberry Pi 3とPubNubでリモート気象監視
- TI SensorTagをNode-RED経由でBlynkと統合 – Raspberry Pi Zero編
- Raspberry PiとAS3935で落雷検知: 実践ガイド
- ネイティブADCなしでRaspberry Pi上のアナログセンサーを測定
- LIRCでプロフェッショナルなRaspberry Piユニバーサルリモコンを構築
- Raspberry PiでPIRモーションセンサーとLEDを制御