2026-02-07
タミヤのローリングロボの赤外線リモコンがNECフォーマットと判明したので、カスタマーコードとデータを使って赤外線LEDを使って発信するプログラムを作りました。


1つの赤外線LEDでモーターを制御している様子

赤外線LEDは、赤外線(波長850nm)で光るLEDの一種。
付けたり消したりすることで信号を送っています。

NECフォーマットでは、1秒に3.8万回の点滅(38kHz)が基本。
次のIchigoJam BASICの高速エルチカプログラムでも・・・

1 LED1:WAIT1 2 LED0:WAIT1 3 GOTO1

これで、1秒間に約30回、30Hzエルチカ。この1000倍速く点滅させる必要があります。

1秒間に5000万回計算できる100円コンピューターくんが本気を出せる言語、マシン語の登場!

@ON R1=22 @ON_LOOP [R3]L=R4 GOSUB @WAIT631 [R3]L=R6 GOSUB @WAIT631 R1-=1 IF !0 GOTO @ON_LOOP RTN @WAIT631 R5=154 R5-=1 IF !0 GOTO -1 RET

レジスタR3に、LEDがつながっているOUTポートを制御するメモリマップドI/Oのアドレス、R4にON、R6にOFFの値をセットし、上記プログラムで38kHzエルチカさせます。

631サイクル待つサブルーチン、@WAIT631を使って38kHzを実現。メモリへの代入に2サイクルを加えた、633サイクルは、48MHzで37.9kHz。(48*1000*1000)/633/2 = 37914(Hz)。(参考、マシン語とサイクル数は、Cortex-M0 Armマシン語表より)

カスタマーコードを上位8bit、データを下位8bitにセットして、OUT1につないだ赤外線LEDを使って、NECフォーマットで送信するマシン語を作ります。

U=USR(AD,0x0015)

データを入力すると送信する、IchigoJam BASICにしたプログラム全文がこちら。

10 POKE#700,112,181,114,182,255,38,1,70,49,64,204,67,52,64,5,10,53,64,234,67,50,64,32,6,11,4,24,67,19,2,24,67,40,67,80,35,27,2,1,51,27,4,4,51,1,36,0,38,172,33,73,0,28,96,0,240,45,248,30,96,0,240 20 POKE#73E,42,248,1,57,247,209,172,33,0,0,0,0,0,240,35,248,0,0,0,0,0,240,31,248,1,57,245,209,33,34,22,33,28,96,0,240,24,248,30,96,0,240,21,248,1,57,247,209,22,33,32,66,0,208,66,33,0,0,0,0,0,240 30 POKE#77C,11,248,0,0,0,0,0,240,7,248,1,57,245,209,64,8,1,58,229,209,98,182,112,189,154,37,1,61,253,209,112,71 40 M=#00:INPUT C:GSB@C:CONT 50 @C:?USR(#700,M<<8+C):RTN

こちらが生成元のasm15マシン語のプログラムです。

@INIT PUSH {LR,R4,R5,R6} ' レジスタ保存 CPSID ' 割り込み禁止 ' IN : R0 = 0xMMCC (MM=メーカー8bit, CC=コマンド8bit) ' OUT: R0 = [~cmd_sw][cmd_sw][~mfg_sw][mfg_sw] ' regs used: R0-R6 only R6=255 ' 0xFF マスク R1=R0 R1&=R6 ' R1 = cmd R4=~R1 R4&=R6 ' R4 = cmd_inv R5=R0>>8 R5&=R6 ' R5 = mfg R2=~R5 R2&=R6 ' R2 = mfg_inv ' out = (cmd_inv<<24)|(cmd_sw<<16)|(mfg_inv<<8)|mfg_sw R0=R4<<24 R3=R1<<16 R0|=R3 R3=R2<<8 R0|=R3 R0|=R5 @SEND ' R0 LSBから32bit送るデータ R3=#50 ' OUT1 の address PIO1_0 R3=R3<<8 R3+=1 R3=R3<<16 R3+=`00000100 'PIO1_0 R4=1 'PIOオン用 R6=0 'PIOオフ用 @HEADER @ON_H R1=172 R1=R1<<1 ' 2倍 @ON_LOOP_H [R3]L=R4 GOSUB @WAIT631 [R3]L=R6 GOSUB @WAIT631 R1-=1 IF !0 GOTO @ON_LOOP_H @OFF_H R1=172 @OFF_LOOP_H NOP NOP GOSUB @WAIT631 NOP NOP GOSUB @WAIT631 R1-=1 IF !0 GOTO @OFF_LOOP_H @BODY R2=33 'カウンタ 33回回す @ON R1=22 ' 11x2 固定 @ON_LOOP [R3]L=R4 GOSUB @WAIT631 [R3]L=R6 GOSUB @WAIT631 R1-=1 IF !0 GOTO @ON_LOOP @OFF R1=22 ' 0のとき11x2、1のとき33x2 R0&R4 'R4=1 IF 0 GOTO @OFF_LOOP R1=66 @OFF_LOOP NOP NOP GOSUB @WAIT631 NOP NOP GOSUB @WAIT631 R1-=1 IF !0 GOTO @OFF_LOOP R0=R0>>1 R2-=1 IF !0 GOTO @ON @END CPSIE ' 割り込み許可 POP {PC,R4,R5,R6} ' RET @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

まずカスタマーコード、データコードから反転付きの32bitの送信用データを作成し、ヘッダー送信、33回ループで信号送信と続け、BASICに制御を戻しています。R4からR6はスタックに積んでおき、制御を返す時に元の値に戻します。

赤外線リモコンで動く家電を探して、いろいろ遊んでみよう!

links
- IchigoJamで赤外線リモコンNECフォーマットをデコード、タミヤローリングロボ制御コード一覧 - IchigoJamで作るIoT学習リモコン、古いエアコンもスマホ制御で快適に! インターン生も芸人さんも楽しいプログラミング入門とマシン語
- タミヤのローリングロボとレゴテクニック連結治具
- 赤外線リモコンの通信フォーマット

2026-02-06
赤外線リモコンで制御するタミヤのローリングロボ。どんな信号が出ているか解析してみました。

カスタマーコード: 0x00 赤 0x45 左前 0x46 前 0x47 右前 0x44 右旋回 0x40 停止 0x43 左旋回 0x07 左後 0x15 後 0x09 右後 0x16 MODE切り替え 青 0x0C 左前 0x18 前 0x5E 右前 0x08 右旋回 0x1C 停止 0x5A 左旋回 0x42 左後 0x52 後 0x4A 右後 0x0D MODE切り替え

赤外線リモコンモジュールは、正面から見て、左からOUTPUT/GND/VCCの順。IchigoJamにIN1/GND/VCCと直結でOK!


ソフトウェアは、以前作ったIchigoJamで作るIoT学習リモコンのコードに加えて、9msecのON、4.5mescのOFFに続く32bitでカスタマーコードコードとデータが反転チェック付きで送信される、NECフォーマットデコーダーをIchigoJam BASICで実装。

1 'IR-REMOCON-NEC-DECODER 100 L=USR(#D00,1):?L:WAIT10:IF L<16*4+4 CONT 110 FORI=0TO3:[I]=0:FORJ=0TO7:N=PEEK(#E03+I*16+J*2)<20:[I]=[I]|N<<J:NEXT:NEXT 115 IF[0]!=~[1]&255 OR [2]!=~[3]&255 GOTO 100 120 ?HEX$([1],2),HEX$([3],2) 130 GOTO 100 POKE#D00,112,181,114,182,14,34,18,2,138,24,0,40,53,208,80,35,27,3,1,51,27,3,1,36,164,4,2,38,54,2,2,62,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 POKE#D3E,33,66,17,209,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 POKE#D78,112,71,80,35,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 POKE#DBA,1,57,245,209,1,48,226,231,154,37,1,61,253,209,112,71

比較的ゆっくり通信される赤外線リモコンですが、普通のパソコンだけでは解析は困難。100円、たった48MHzのコンピューター(マイコン)ですが、フルに使える良さがあります。

jigブラウザのjiglet、jigマルチリモコン、懐かしい!

links
- IchigoJamで作るIoT学習リモコン、古いエアコンもスマホ制御で快適に! インターン生も芸人さんも楽しいプログラミング入門とマシン語
- タミヤのローリングロボとレゴテクニック連結治具
- 赤外線リモコンの通信フォーマット

2026-02-05
Boxで共有されるファイル郡。まとめてダウンロードしたくなったら調べるAPi、アプリケーション・プログラミング・インターフェイス。


「code4fukui/box-api」

OAuthでアクセス用のAPIキーを取得して、.envに設定してアクセスできるDeno用ライブラリとしてまとめました。

が、ダウンロードしようとして権限なしエラー。インデックスを作ってブラウザで次々見ていくスタイルでいくことにしました。

APIを使用せず、スクレイピングと、HTML内のscriptタグからJavaScriptを acorn-es を使って、JSONデータを抽出して、一覧を取得する、getSharedItems.js も合わせて公開。

作り溜めたものが役立っています。GitHubに公開しておけばAIくんの餌にもなってくれるはず。

クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS