赤外線LEDで赤外線信号を送信する送信機をつくります。

赤外線LEDで赤外線信号を送信

赤外線センサーでキャッチできる送信機をつくります。
赤外線LEDを使って赤外線パルスで数字データーを送信します。

赤外線LED

配線図

プラス端子 GP 17   長い方
Gnd アース(GND)   短い方

MicroPythonプログラム

# GPIOピン制御・PWM制御のライブラリを読み込む
from machine import Pin, PWM

# 時間関連のライブラリを読み込む
import time

# PWM制御を行うピンの設定
ir = PWM(Pin(17, Pin.OUT))

# PWM制御の動作周波数を設定
# 一般的なリモコンで使用されている周波数 = 38KHz
f = 38000
ir.freq(f)

# PWM制御の周期(波が上下に1回振動するのにかかる時間)
# 周期 = 1/周波数(38kHz)= 26μs

# PWMのデューティー比(HIGHとLOWの比率)
# 一般的なリモコンのデューティー比 = HIGH:1/3、LOW:2/3
# 16bitの最大値 = FFFF(16進数)= 65535(10進数)
# 65535 * 0.3333 = 21845(10進数)= 5555(16進数) 1/3になります
dty = 0x5555

# 解析したデータが信号を一つ送るのに掛かっていた時間 = 300us
# 300usの長さの信号になるようにPWM信号を繰り返す
# 300us/26us = 11.5回
# しかしtime.ticksで赤外線通信の稼働時間を計測した結果、
# 理想のフレーム長(53ms~55ms)に足りない
# よって稼働時間が53ms以上になるように「20」と調整した
adj = 20


def decimal_to_binary_list(decimal):
    binary_list = list(bin(decimal)[2:])
# bin()関数で2進数文字列を取得し、最初の2文字('0b')を取り除く
    binary_list = [int(bit) for bit in binary_list]
# 文字列を整数のリストに変換
    return binary_list

def sendcode(data):
    decimal_number = data

# 10進数を2進数に変換
    binary_result = decimal_to_binary_list(decimal_number)

# 結果を表示
    print(binary_result)
    
# 赤外線通信の稼働時間を計測開始
    start = time.ticks_us()

# 16bitのコードを読み込む
    for bit in binary_result:
       
# コードの値が「1」のときの処理
        if(bit == 1):
        
# デューティー比1/3がHIGHのPWM信号を送信(adj回分)
            for i in range(1, 1*adj):
                ir.duty_u16(dty)
            
# LOWのPWM信号を送信(7×adj回分)
            for i in range(1, 7*adj):
                ir.duty_u16(0)
         
# コードの値が「0」のときの処理
        else:
        
        # デューティー比1/3がHIGHのPWM信号を送信(adj回分)
            for i in range(1, 1*adj):
                ir.duty_u16(dty)
            
        # LOWのPWM信号を送信(3×adj回分)
            for i in range(1, 3*adj):
                    ir.duty_u16(0)
    
# ストップビット(データの終端を示す信号)
    for l in range(1,1*adj):
        ir.duty_u16(dty)

# トレーラー(通信の終わりを示す信号)
    for l in range(1,1*adj):
        for i in range(1,97):
            ir.duty_u16(0)
              
# 赤外線通信の稼働時間を出力(53000us以上になっていればOK)
#print(time.ticks_diff(time.ticks_us(), start))
    
while True:
# 送信する数値を設定
    data = 10
    sendcode(data)
    time.sleep(1)
 一般的なリモコンで使用されている周波数 をPWMで発生させて赤外線LEDに送り発進させます。

リモコンで使われている設定に合わせる
1 PWM制御の動作周波数を設定
一般的なリモコンで使用されている周波数 = 38KHzなのでf = 38000 ir.freq(f)にします。
PWM制御の周期(波が上下に1回振動するのにかかる時間)は 1/周波数(38kHz)= 26μsになります。
2  PWMのデューティー比(HIGHとLOWの比率)を設定
一般的なリモコンのデューティー比はHIGH:1/3でLOW:2/3 dty = 0x5555になります。
 16bitの最大値 = FFFF(16進数)= 65535(10進数)
65535 * 0.3333 = 21845(10進数)= 5555(16進数)
データが信号を一つ送るのに掛かっていた時間 は300usなので300usの長さの信号になるようにPWM信号を繰り返します。
300us/26us(PWM制御の周期) = 11.5回
3 繰り返し回数(adj)の設定
このままではtime.ticksで赤外線通信の稼働時間を計測したときに理想のフレーム長(53ms~55ms)に足りないので稼働時間が53ms以上になるように繰り返し回数値をadj = 20としています。

実行

 

送信する数値をdata = 10にして送信しました。
[1,0,1,0](2進数)で送信されています。

前回製作した受信機では10進数「10」と表示されました。

自由研究

テンテン
テンテン

スイッチによって送信する数値を変えるようにすることで赤外線リモコンとしていつかえます。
今回は4桁の2進数なので0〜15までの数値を送信できます。