6.4 IRリモートコントロール¶
消費者向け電子機器では、テレビやDVDプレーヤーなどの機器を操作するためにリモートコントロールが使用されます。 場合によっては、リモートコントロールによって手の届かない場所にある機器、例えばセントラルエアコンを操作することもあります。
IRレシーバーは、赤外線を受信するように調整されたフォトセルを搭載したコンポーネントです。 このタイプのレシーバーはほぼ常にリモートコントロールの検出に使用されています。すべてのテレビやDVDプレーヤーの前面には、クリッカーからのIR信号を受信するためのものがあります。 リモートコントロールの内部には、テレビをオン/オフにしたりチャンネルを変更するためのIRパルスを発生する対応するIR LEDがあります。
必要なコンポーネント
このプロジェクトで必要なコンポーネントは以下の通りです。
便利なのは、全体のキットを購入することです。リンクはこちら:
名前 |
キット内容 |
リンク |
---|---|---|
ケプラーキット |
450以上 |
以下のリンクから個別に購入することもできます。
SN |
コンポーネント |
個数 |
リンク |
---|---|---|---|
1 |
1 |
||
2 |
Micro USBケーブル |
1 |
|
3 |
1 |
||
4 |
数本 |
||
5 |
1 |
回路図
配線
コード
注釈
kepler-kit-main/micropython
のパス内の6.4_ir_remote_control.py
ファイルを開くか、このコードをThonnyにコピペして、"Run Current Script"をクリックするか、単にF5キーを押して実行してください。右下隅の "MicroPython (Raspberry Pi Pico)" インタープリターをクリックするのを忘れないでください。
詳細なチュートリアルについては、 コードを直接開いて実行する を参照してください。
ここでは
ir_rx
フォルダ内のライブラリが必要です。Picoにアップロードされているか確認してください。詳細なチュートリアルは 1.4 Picoにライブラリをアップロード を参照してください。
import time
from machine import Pin, freq
from ir_rx.print_error import print_error
from ir_rx.nec import NEC_8
pin_ir = Pin(17, Pin.IN)
def decodeKeyValue(data):
if data == 0x16:
return "0"
if data == 0x0C:
return "1"
if data == 0x18:
return "2"
if data == 0x5E:
return "3"
if data == 0x08:
return "4"
if data == 0x1C:
return "5"
if data == 0x5A:
return "6"
if data == 0x42:
return "7"
if data == 0x52:
return "8"
if data == 0x4A:
return "9"
if data == 0x09:
return "+"
if data == 0x15:
return "-"
if data == 0x7:
return "EQ"
if data == 0x0D:
return "U/SD"
if data == 0x19:
return "CYCLE"
if data == 0x44:
return "PLAY/PAUSE"
if data == 0x43:
return "FORWARD"
if data == 0x40:
return "BACKWARD"
if data == 0x45:
return "POWER"
if data == 0x47:
return "MUTE"
if data == 0x46:
return "MODE"
return "ERROR"
# User callback
def callback(data, addr, ctrl):
if data < 0: # NEC protocol sends repeat codes.
pass
else:
print(decodeKeyValue(data))
ir = NEC_8(pin_ir, callback) # Instantiate receiver
ir.error_function(print_error) # Show debug information
try:
while True:
pass
except KeyboardInterrupt:
ir.close()
この新しいリモートコントロールには、バッテリーを隔離するためのプラスチック片が最後にあります。それを使用する際には、このプラスチック片を引き抜いてリモートを起動する必要があります。 プログラムが実行されているとき、リモートコントロールのボタンを押すと、Shellに押したキーが表示されます。
仕組みは?
このプログラムは少し複雑に見えますが、実際はIRレシーバーの基本機能を数行で実装しています。
import time
from machine import Pin, freq
from ir_rx.nec import NEC_8
pin_ir = Pin(17, Pin.IN)
# User callback
def callback(data, addr, ctrl):
if data < 0: # NEC protocol sends repeat codes.
pass
else:
print(decodeKeyValue(data))
ir = NEC_8(pin_ir, callback) # Instantiate receiver
ここでは ir
オブジェクトがインスタンス化され、IRレシーバーによって取得された信号を常に読み取ります。
結果はコールバック関数の data
に記録されます。
IRレシーバーが重複値(例:キーを押して離さない場合)を受け取ると、data < 0 となり、このデータはフィルタリングする必要があります。
そうでなければ、dataは使用可能な値であり、 decodeKeyValue(data)
関数がそれをデコードするために使用されます。
def decodeKeyValue(data):
if data == 0x16:
return "0"
if data == 0x0C:
return "1"
if data == 0x18:
return "2"
if data == 0x5E:
return "3"
if data == 0x08:
return "4"
if data == 0x1C:
return "5"
if data == 0x5A:
return "6"
if data == 0x42:
return "7"
if data == 0x52:
return "8"
if data == 0x4A:
return "9"
if data == 0x09:
return "+"
if data == 0x15:
return "-"
if data == 0x7:
return "EQ"
if data == 0x0D:
return "U/SD"
if data == 0x19:
return "CYCLE"
if data == 0x44:
return "PLAY/PAUSE"
if data == 0x43:
return "FORWARD"
if data == 0x40:
return "BACKWARD"
if data == 0x45:
return "POWER"
if data == 0x47:
return "MUTE"
if data == 0x46:
return "MODE"
return "ERROR"
1 キーを押すと、IRレシーバーは 0x0C
のような値を出力する必要があり、それを特定のキーに対応させる必要があります。
次に、いくつかのデバッグ関数があります。これらは重要ですが、私たちが達成したい効果には関係ないため、プログラムに含めています。
from ir_rx.print_error import print_error
ir.error_function(print_error) # Show debug information
最後に、主要なプログラムとして空のループを使用します。そして、try-exceptを使用してプログラムが ir
オブジェクトを終了させるようにします。
try:
while True:
pass
except KeyboardInterrupt:
ir.close()