福野泰介の一日一創 - create every day

IchigoJamを赤外線リモコンで簡単遠隔操作!スマートホーム実現に向けて、信号の解読にも挑戦しよう!

2018/05/06
#IchigoJam #maker #asm 

家電を自在にコントロール!赤外線リモコンで操作する家電は、IchigoJamでも制御可能。
まずは予備実験として、見えない光、赤外線を使った、IchigoJam遠隔コントロール実験から。

1コ20円の赤外線受光モジュールとブレッドボード、ワイヤー3本で、回路を作りましょう。
IchigoJam CN5の5VとGND、CN4のIN1からワイヤーで赤外線受光モジュールの3本足側へ接続します。

順番は、3本足を上にして左から5V、IN1、GNDの順。
※受光モジュールの電源は、4.7-5.3Vなので、VCC(3.3V)では動きません

つないだら、早速受光しているか実験するプログラム

1 LED !IN(1):CONT RUN

赤外線受光モジュールは普段は1、38kHzで振動する赤外線を捉えたら、0が出力されます。
IN(1)でその信号をとらえ、そのまま!演算子で反転させて、LEDに連動させています。

家のテレビや電気など適当なリモコンを向けてボタンを押すと、チカチカ点滅します。

赤外線リモコンからの信号を待って、LEDをつけるプログラムはこちら。ロボットの発進制御にも使えますね!

10 IF IN(1) CONT 20 LED1

※何もしなくてもチカチカする場合、電源のノイズを拾ってしまっているので、別の電源を使うか、新品の乾電池x3(1.6*3=4.8V)を使いましょう。ノイズ対策方法も何かあるかもしれません。

ボタンをいろいろ押し分けたり、違う家電のリモコンの信号を向けてみたりすると、長さやパターンが違うことがわかります。 この信号を解読にも挑戦してみましょう。

赤外線リモコンの38kHzで点滅する赤外線LEDを光らせるパターンの違いで信号を伝えます。その信号を見るプログラムを書いてみると

1 ?IN(1);:CONT RUN

ただ、信号が一瞬すぎてうまく区別できそうにありません。BASICでは速度が足りない時は、マシン語の出番。 マシン語で光っている時間、消えている時間を計測してみます。

10 POKE#800,112,181,114,182,7,34,18,2,138,24,0,40,51,208,80,35,27,3,1,51,27,3,1,36,164,4,254,38,0,33,0,240,37,248,1,49,33,66,28,209,29,104,0,45,247,209,228,8,0,32,0,33,0,240,26,248,1,49,33,66,17,209 20 POKE#83E,29,104,0,45,247,208,17,84,1,48,0,33,0,240,15,248,73,28,33,66,6,209,29,104,0,45,247,209,17,84,1,48,176,66,231,209,0,33,17,84,1,48,98,182,112,189,156,37,173,0,1,61,253,209,112,71,80,35 30 POKE#878,27,2,1,51,27,4,4,51,1,36,0,38,17,92,73,0,0,41,234,208,28,96,0,240,22,248,30,96,0,240,19,248,1,57,247,209,1,48,17,92,73,0,0,41,221,208,0,0,0,0,0,240,8,248,0,0,0,0,0,240,4,248,1,57,245,209 40 POKE#8BA,1,48,226,231,154,37,1,61,253,209,112,71 120 N=USR(#800,1) 130 ?"LEN:";N 140 FOR I=0 TO N-1:?PEEK(#700+I);" ";:NEXT

RUNしてリモコン信号を当ててみましょう。

71 30 10 7 11 6 11 22 10 24 10 7 10 23 10 7 10 7 10 7 9 24 9 8 9 8 9 24 9 8 9 24 10 7 9 25 9 7 10 7 9 25 9 8 9 8 8 8 9 8 9 8 9 24 9 8 9 8 9 8 8 8 9 8 9 8 9 8 8 8 9 8 9 25 8 8 9 8 9 8 9 8 9 7 9 25 9 8 9 7 9 8 9 8 9 8 9 25 8 85 68 34 9 7 10 7 9 25 9 24 9 8 9 25 8 8 9 8 9 8 9 24 9 8 9 8 8 26 8 8 9 25 8 9 8 25 8 9 8 9 8 25 8 9 8 9 8 8 8 9 8 9 8 25 8 9 8 9 8 9 8 8 8 9 8 9 8 9 8 8 8 9 8 26 7 9 8 9 8 9 8 9 8 8 8 26 8 9 8 8 8 9 8 9 8 9 8 25 8 0

いくつか見ているとパターンが見えてきます。

最初の長い部分のあと、短い点灯とそのあとの消灯時間の違いで0と1を表しているようです。 数えてみるとちょうど48コ、6byte分の信号を2回送っています。 解析できた構造はこんな感じ

ヘッダ(ON:70 OFF:30) [0(ON:8 OFF:8), 1(ON:8 OFF:24)] x 48bit(6byte) フッタ(ON:8)

※数の単位は2cycle(38kHz) - 上記を2度送信している

信号の違いを確認してみましょう。

A 001101000100101010010000010000000001000001000001 B 001101000100101010010000010000000101000001000101

家の電気のリモコンAとBで切り替えで、2bit異なることががわかります。
ボタンに合わせた動作をプログラムすれば、リモコンで遠隔操作するロボットや便利道具もできそうですね。

上記、マシン語プログラム、実はリモコン送信用プログラムも含んでいます。赤外線LEDがあればリモコン発信も実験できます。

100 INPUT"1:SEND 2:RECV ?",N 110 IF N=1 N=USR(#800,0):GOTO 100 120 N=USR(#800,1) 130 ?"LEN:";N 140 FOR I=0 TO N-1:?PEEK(#700+I);" ";:NEXT 150 GOTO 100

赤外線リモコン信号読み取り&送信用マシン語プログラム(for asm15

' IN1 - 赤外線受光モジュール / OUT1 - 赤外線LED PUSH {LR,R4,R5,R6} CPSID '割り込み禁止 R2=7 'PCGの先頭 #700 R2=R2<<8 R2=R1+R2 R0-0 IF 0 GOTO @SEND R3=#50 ' IN1 の address PIO0_10 R3=R3<<(24-(10+2)) R3+=1 R3=R3<<(10+2) ' PIO0_10 R4=1 R4=R4<<18 '初回信号オーバーフロー判定 R6=254 'オーバーフロー判定 R1=0 @BACK0 GOSUB @WAIT2526 R1+=1 R1&R4 IF !0 GOTO @END R5=[R3]L R5-0 IF !0 GOTO @BACK0 R4=R4>>(18-15) 'オーバーフロー判定変更 R0=0 '配列書き込み位置 @LOOP R1=0 @BACK1 GOSUB @WAIT2526 R1+=1 R1&R4 IF !0 GOTO @END R5=[R3]L R5-0 IF 0 GOTO @BACK1 [R2+R0]=R1 R0+=1 ' 1byteずつ R1=0 @BACK2 GOSUB @WAIT2526 R1=R1+1 R1&R4 IF !0 GOTO @END R5=[R3+0]L R5-0 IF !0 GOTO @BACK2 [R2+R0]=R1 R0+=1 ' 1byteずつ R0-R6 IF !0 GOTO @LOOP @END R1=0 [R2+R0]=R1 R0+=1 CPSIE ' 割り込み許可 POP {PC,R4,R5,R6} @WAIT2526 R5=156 ' 1cycle '(48000/38*2=2526 - overhead 14cycle - 6) / 4 = 626 (=156*4) R5=R5<<2 R5-=1 ' 1 cycle IF !0 GOTO -1 ' 分岐するとき3cycle しないとき1 - 4*loop-2 RET ' 3cycle @SEND R3=#50 ' OUT1 の address PIO1_0 R3=R3<<8 R3+=1 R3=R3<<16 R3+=`00000100 'PIO1_0 R4=1 'PIOオン用 R6=0 'PIOオフ用 'R2 データが格納されたアドレス 'R0 == 0 @ON R1=[R2+R0] R1=R1<<1 ' 2倍する R1-0 IF 0 GOTO @END @ON_LOOP [R3]L=R4 GOSUB @WAIT631 [R3]L=R6 GOSUB @WAIT631 R1-=1 IF !0 GOTO @ON_LOOP R0+=1 @OFF R1=[R2+R0] R1=R1<<1 ' 2倍する R1-0 IF 0 GOTO @END @OFF_LOOP NOP NOP GOSUB @WAIT631 NOP NOP GOSUB @WAIT631 R1-=1 IF !0 GOTO @OFF_LOOP R0+=1 GOTO @ON @WAIT631 'use R5 R5=154 ' 1cycle '(48000/38/2=631 - overhead 5cycle (+10/2) - 5) / 4 = 154 R5-=1 ' 1 cycle IF !0 GOTO -1 ' 分岐するとき3cycle しないとき1 - 4*loop-2 = 618 RET ' 3cycle

links
- はじめてのマシン語 - IchigoJamではじめるARMマシン語その1
- レゴテクニックシリーズをIchigoJamと赤外線LEDで制御する(マシン語) / Control Lego Technic by IchigoJam and IR LED
- 赤外線リモコン受信モジュール SPS-440-1(38kHz): センサ一般 秋月電子通商 電子部品 ネット通販 (70コまとめ買いで@10円!)

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image