ワイヤレスリモコンを改造しよう3

前回の続きです。夜な夜な解析を続けた結果、あきらめてPA5を直接制御することで方針転換。ずっとRaspberry Pi 3から電源をとって、ピンセットでショートしてボタンを押したことにして観測してたけど、なぜか実機が動作しないという問題がおこって、あらためて普通に組み立てた状態で観察するという手戻りがあったものの、解析結果はこういう感じ。

  • 長いパルスと短いパルスの組み合わせで信号を作っている
  • 41パルスで1コマンドをあらわしている
  • 1回ボタンを押すと5回同じコマンドが送信される
  • コマンド間は9.93msecぐらい
  • 長いパルスは0.99msecぐらい(1と呼ぶことにする)
  • 短いパルスは0.34msecぐらい(0と呼ぶことにする)
  • ON信号:0001010100010101010101110
  • OFF信号:0001010100010101010101000

今回はRaspberry Pi 3から制御しようと思っている。シェルスクリプトでGPIOを制御する方法もあるけど、今回は将来的にはインターネット上にあるサーバーに書かれている状態を参照してON/OFFしようと思っているので、ライブラリが充実してそうなPythonで挑戦する。gpiozeroというライブラリがGoogle検索上位にきたのでこれを使おう。

あと、今回は0.39msecとか0.99msecというパルスを作らないといけない。これはPythonでは秒単位でスリープするsleepに少数で時間を指定する方法がでてきた。


led.on()
sleep(0.39/1000)
led.off()
sleep(0.99/1000)

とやれば短いパルスを再現できるはずだと思ったけど、このスリープはあまり正確ではないらしく、実測で調整して

led.on()
sleep(0.21/1000)
led.off()
sleep(0.88/1000)

とした。コマンドとコマンドの間は9.93msecあいてるんだけど、ここもうまくいかないので実測で調整して

sleep(8.93/1000)

とした。

実際のソースコード全体がこちら。

from gpiozero import LED
from time import sleep
import sys

led = LED(17)
adj   = 0.18 #msec. this value is to adjust too long sleep
adjlon= 0.11
adjin = 1.0
short = 0.39 -adj #msec
long  = 0.99 -adjlon #msec
inter = 9.93 -adjin  #msec
on    = "0001010100010101010101110"
off   = "0001010100010101010101000"
num   = 5

def short_out():
       led.on()
       sleep(short/1000)
       led.off()
       sleep(long/1000)

def long_out():
       led.on()
       sleep(long/1000)
       led.off()
       sleep(short/1000)

def modulate_out( str ):
       short_out()
       for x in range (0, num):
               sleep(inter/1000)
               for c in str:
                       if c == '0':
                               short_out()
                       else:
                               long_out()

if sys.argv[1] == "on":
       print "on"
       modulate_out(on)
else:
       print "off"
       modulate_out(off)


基板にのっていた制御用ICはとりはずして、Raspberry Pi 3からGND, 3.3V電源, GPIO17の3線をそれぞれ接続。そしてコマンド実行。

$ python gpio.py on

LEDが光るとともに、リレーがカチッとなる!感動!

$ python gpio.py off

リレーがカチッとなる!感動!

スリープ時間が最初の実験よりやや短めになってたから、長いパルスの値をちょっと調整した。