6.4 IRリモートコントロール

消費者向け電子機器では、テレビやDVDプレーヤーなどの機器を操作するためにリモートコントロールが使用されます。 場合によっては、リモートコントロールによって手の届かない場所にある機器、例えばセントラルエアコンを操作することもあります。

IRレシーバーは、赤外線を受信するように調整されたフォトセルを搭載したコンポーネントです。 このタイプのレシーバーはほぼ常にリモートコントロールの検出に使用されています。すべてのテレビやDVDプレーヤーの前面には、クリッカーからのIR信号を受信するためのものがあります。 リモートコントロールの内部には、テレビをオン/オフにしたりチャンネルを変更するためのIRパルスを発生する対応するIR LEDがあります。

必要なコンポーネント

このプロジェクトで必要なコンポーネントは以下の通りです。

便利なのは、全体のキットを購入することです。リンクはこちら:

名前

キット内容

リンク

ケプラーキット

450以上

Kepler Kit

以下のリンクから個別に購入することもできます。

SN

コンポーネント

個数

リンク

1

Raspberry Pi Pico W

1

BUY

2

Micro USBケーブル

1

3

ブレッドボード

1

BUY

4

ジャンパーワイヤー

数本

BUY

5

赤外線レシーバー

1

BUY

回路図

sch_irrecv

配線

wiring_irrecv

コード

注釈

  • 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()