最近、電子工作の新たなツールとして手に入れたテスター FNIRSI DSO-TC3の機能を試していたら、赤外線通信のデコード機能に感動しました。そして、思いついたのが自作の赤外線リモコンを作ること。なんと、そのプログラムは人工知能ChatGPTに書かせてしまいました!
まずは、この驚きのプロジェクトの一部始終を以下の動画でご覧ください。
ただサーキュレータの電源をオンオフするだけのシンプルな動作ですが、確実に反応しています。プログラミング部分は実は私ではなく、AIのChatGPTが書いてくれたものなのです。ここではその驚きの過程を紹介します。
赤外線信号のデコード
初めにDSO-TC3を用いて赤外線信号のデコードを行いました。対象としたリモコンのボタンを押すと、以下のようなデコード結果が得られました。
- UserCode: 0x80DE
- DataCode: 0x00FF
この結果を基に、同様の赤外線信号を出力するリモコンを作るのが目標です。
電子部品の調達と回路作成
仕事の昼休みを利用して、赤外線LEDとRaspberry Pi Picoを購入しました。選んだのは光波長が940nmの赤外線LEDと、秋月電子オリジナルのRaspberry Pi Picoです。ブレッドボードと抵抗(22Ω)はすでに持っていました。
回路は赤外線LEDを使用しているものの、基本的には普通のLチカの配線と変わりません。
ChatGPTによるコード作成
さて、コードの作成ですが、これはChatGPTにお任せしました。ChatGPTとの対話を記録したスクリプトはこちらのChatGPTのスクリプトからご覧いただけます。
最初に生成されたコードは、さすがはChatGPT、それなりに完成度が高いものでした。しかし、実際にPicoに移して実行してみると、想定した値とは異なるデコード結果が出てしまいました。
- UserCode: 0x017B
- DataCode: 0x00FF
それで、この誤った結果を条件に加えてChatGPTに再度コードを生成してもらい、そして期待通りのデコード結果が得られました。以下に、そのコードを一部修正したものを載せておきます。
from machine import Pin, PWM
import time
def reverse_byte(b):
b = ((b & 0xF0) >> 4) | ((b & 0x0F) << 4)
b = ((b & 0xCC) >> 2) | ((b & 0x33) << 2)
b = ((b & 0xAA) >> 1) | ((b & 0x55) << 1)
return b
def send_ir_code(pwm, code, bits):
on = int((2**16-1) / 3)
off = 0
# NECプロトコルに基づくIR信号送信
# Header
pwm.duty_u16(on)
time.sleep_us(9000) # 9ms pulse
pwm.duty_u16(off)
time.sleep_us(4500) # 4.5ms space
# send
for i in range(bits):
pwm.duty_u16(on)
time.sleep_us(560) # 560us pulse
# 各ビットはoffの長さで決まる
pwm.duty_u16(off)
if code & (1 << (bits - 1 - i)): # 1
time.sleep_us(1690)
else: # 0
time.sleep_us(560)
# Stop bit
pwm.duty_u16(on)
time.sleep_us(560) # 560us pulse
pwm.duty_u16(off)
pwm = PWM(Pin(14))
pwm.freq(38000) # IR carrier frequency
# カスタムコード 0x80DE, データコード 0x00FF
custom_code = (reverse_byte(0x80) << 8) | reverse_byte(0xDE)
data_code = reverse_byte(0x00FF)
send_ir_code(pwm, (custom_code << 16) | data_code, 32) # 32ビットNECコード
主に使った機材と部品
まとめ: AIによる電子工作
こうして見ると、計測機器とAIの力を組み合わせれば、赤外線通信の専門知識がなくても赤外線リモコンを自作することが可能です。初めての赤外線通信プロジェクトだったので、すんなりと作れるとは思っていませんでした。しかし、AIが生成したコードを読み解くことで、電子工作の知識も深まったと思います。これぞ、最新のDIY体験と言えるでしょう。