以前作成したLPC810を使ったIchigoJam用赤外線リモコン受信モジュールを改良しました。
対象とするIchigoJam はファームウェア 1.2.1です。
前回からの改良点
1)I2C用プルアップ抵抗不要。
内部のプルアップ抵抗を利用するようにしました
2)赤外線リモコンのボタンコードを調べる機能の追加(強化)
シリアルTXDポート(2番ピン)から随時ボタンコードをテキスト形式で出力します。
3)IchigoJam BASICによるプログラミングでPOKEを使わないでI2CRを使える
インタフェースにしました。
仕様および機能
・インタフェース
I2C(アドレス 0x20) : ボタンコード取得用
UART (115200bps,TXDのみ) : 赤外線リモコンのボタンコード調査用
・機能
赤外線リモコン受信モジュールが直前に受信したボタン情報を返す(I2C)
赤外線リモコン受信モジュールが受信したボタン情報を随時出力(UART)
回路図
IchigoJamとの必須接続はSCL、SDA、GND、VCCの4ピン
TXD(UART)は赤外線リモコンのボタンコード調査時に利用
LPC810にプログラム書き込み時には、TXD、RXD、GND、VCC、ISPの5ピン利用
※内部でプルアップしているのですが、ブレッドボード上で実装する場合、
SCL,SDAにプルアップ抵抗を入れた方がよいようですです。
(中華製の安価なブレッドボードに問題がありそうです)。
構成部品
・LPC810 32ビットARM マイコン(ARM Cortex-M0+, Flash 4KB, SRAM 1KB)
・TL1838 赤外線リモコン受信モジュール (他の類似品でもOK)
・線材等
※TL1838はArliexpressにて10個 $1.2で購入しました。
amazonでも販売されているようです。
LPC810は秋月電子は値上がりしてしまったので別のところでの購入がよいです。
スイッチサイエンス、マルツはまだ100円以下で購入出来ます。
LPC810用のプログラムソース(書き込み用HEXファイル含む)
ダウンロード IRtoI2C_20160817.zip (281.9K) (最新版)
2016/08/16 フリーズする不具合があり、修正しましたがまだ問題ありです。対応中!
2016/08/17 プルアップ抵抗を入れると安定するようです。調査中..
(IchiogamのI2C周りが意外と怪しいのでちょっと混乱中)
2016/08/17 プルアップ抵抗の件、ユーニバーサル基板実装版は問題かく動作します。
ブレットボード上だと問題ありで、プルアップ抵抗を入れると安定します。
プログラムのI2Cタイムアウト周りを少し修正しました。
解凍したフォルダ内の \IRtoI2C\Release\IRtoI2C.hex が書き込み用のHEXファイルです。
プログラムの書込み方法は、下記を参考して行って下さい。
「LPC810のフラッシュへの書き込みをシリアルインターフェースで行なう 」
http://www.nxp-lpc.com/programming_note/note3.html
関連情報(書き込みツールFlash Magic 公式サイト)
Flash Magic
IchigoJamで使ってみる
赤外線リモコン受信モジュールのI2Cスレーブアドレスは #20 です。
IchigoJamからの利用はI2CWコマンドを使って利用します。
1)赤外線リモコンのボタンコードを調べる
本モジュールを使うには、赤外線リモコン(NEC方式)が必要です。
小型で安っぽいものはほぼNEC方式です(写真は手持ちのNEC方式リモコン)。
・LPC810のGND、VCC、2番ピン(TXD)をIchigoJamのGND、VCC、RXDピンに
接続してIcigoJamを起動させます。
(ボタンコードを調べる場合に限りRXDピンにつなげます)
・赤外線¥リモコンのボタンを押すと、ボタンに対応するコードが表示されます。
IR=90 の2桁の16進数90がボタンコードとなります。
IR=** と表示されるのは、リピート(ボタンを押し続けている状態)を意味します。
注意)
対応していない赤外線リモコンの場合では何も表示されません。
1つのボタンに複数のコードが割り当てられている場合があります。
これにより、手持ちの赤外線リモコンのボタンコードを調べることが出来ます。
実際に調べたコードの例
通常、赤外線リモコン上のボタンは全て異なるコードとなります。
2)プログラムでボタンコードを取得する
IcigoJamのI2CRコマンドを利用します。利用可能なコマンドは2つです。
(例) R=I2CR(#20, "0", 1, #800, 4)
※ 朱色部は可変 部(任意に指定)、黒字分は固定(変更不可)
変数RはI2CRの実行結果を取得するためのものです。他の変数でも良いです。
I2CRの実行が正常の場合は0、異常の場合は1がセットされます。
#20は、本赤外線リモコン受信モジュールのI2Cスレーブアドレスです。
固定値となります。
"0"は、I2CRのコマンド指定部です。次の指定が可能です。
"0" : ボタンコード取得(赤外線リモコンのリピート機能無効指定)
"1" : ボタンコード取得(赤外線リモコンのリピート機能有効指定)
1 は コマンド指定部のデータ長(バイト数)です。常に1を指定します。
#800 は、取得したボタンコードを格納するアドレスです。
書込み可能な領域であれば任意のアドレスの指定が可能です。
(例)では、配列変数領域 [0]のアドレスである #800 を指定しています。
この場合、配列変数[0]、[1]にて取得した値を参照することが出来ます。
4 は 取得したボタンコードを格納するために使用するデータ長です。
常に4を指定します。
コマンドの詳細
"0" : ボタンコード取得(赤外線リモコンのリピート機能無効指定)
"1" : ボタンコード取得(赤外線リモコンのリピート機能有効指定)
上記2つのコマンドは、赤外線リモコン受信モジュールが受信した最新の
ボタンコードを取得します。違いは赤外線リモコンのリピート機能を使うか
使わないかです。
リピート機能とはボタンを押しっぱなしにした時に、何回もボタンを押した(連打)
ことにする機能です。有効にすると連打となり、無効にすると1回だけ押された
ことになります。
その結果をI2CRコマンドの第4パラメタで指定したアドレス(例では#800)に
返します。返す情報は、"状態コード + ボタンコード"の4バイトとなります。
状態コード :#0000 前回のコマンド実行から、新たにボタンが押された
:#0001 前回のコマンド実行から、操作なし
ボタンコード : #0000~ #00FF
直前に押したボタンコードです。
ちょっと分かりにくですが、押されたボタンを単純に調べるのであれば、
状態コードが 0 の場合にのみ ボタンコード を利用
すれば良いです。
リピート機能の有効・無効の指定により押しっぱなしが連打となります。
サンプルプログラムその1
コマンド:ボタンコード取得(赤外線リモコンのリピート機能有効指定)で
ボタンコードを取得し、その結果(配列変数[0]、[1])を表示する例です。
10 'I2C IR Sample1
20 CLS:CLV:CLP
30 @LOOP
40 R=I2CR(#20,"1",1,#800,4)
50 PRINT "STS=";[0];" BTN=";HEX$([1],2)
60 WAIT 50
70 GOTO @LOOP
実行結果
出力の①部分は実行後何も操作をしていない状態です。
初期値00が返されます。1回目は状態コードが0、2回目以降はボタンコード
の変化がないので状態コードが1となります。
2016/08/15 初期は#FF に変更しました。上記画像の00はFFになります。
複数のリモコンを調べたところ、00は良く使われるコードのためFFに変更しました。
現状、リモコンにボタンコード00がある場合、初期値00との判別が出来ませんので
ボタンコード00の利用は避けて下さい。
出力の②部分はボタンコード48のボタン[3]操作を操作しています。
上から5つは状態コードが0であることから"5回ボタンを押した"ことを意味します。
実際は、押しっぱなしにしていて、リピート機能が有効のため5回の連打となりました。
6行目以降は状態コードが1であることから、ボタンを離した状態です。
ボタンコードは直前に押されたボタンコード48が返されます。
サンプルプログラムその2
コマンド:ボタンコード取得(赤外線リモコンのリピート機能無効指定)で
ボタンコードを取得し、その結果(配列変数[0]、[1])を表示する例です。
10 'I2C IR Sample1
20 CLS:CLV:CLP
30 @LOOP
40 R=I2CR(#20,"0",1,#800,4)
50 PRINT "STS=";[0];" BTN=";HEX$([1],2)
60 WAIT 50
70 GOTO @LOOP
実行結果
出力の①部分は実行後何も操作をしていない状態です。
初期値00が返されます。1回目は状態コードが0、2回目以降はボタンコード
の変化がないので状態コードが1となります。
2016/08/15 初期は#FF に変更しました。上記画像の00はFFになります。
出力の②部分はボタンコード48のボタン[3]操作を押しっぱなしにしています。
リピート機能が無効のため最初の状態コードだけが0となり、以降は1となります。
これで1回だけ押されたと判断出来ます。
サンプルプログラムその3
キャラクタをリモコンで操作するプログラムです。
[2] (#88) 、[8](#98) で上、下、 [4](#28)、[6](#68)で左、右の操作です。
リピート機能を有効にしているのでボタンを押している間、キャラクタが動きます。
10 'I2C IR SAMPLE3
20 CLS:CLV:CLP:X=16:Y=12
30 @LOOP
40 R=I2CR(#20,"1",1,#800,4)
50 IF[0]=1 GOTO @PRN
60 IF [1]=#88 IF Y>1 Y=Y-1
70 IF [1]=#98 IF Y<22 Y=Y+1
80 IF [1]=#28 IF X>1 X=X-1
90 IF [1]=#68 IF X<30 X=X+1
100 @PRN
110 LC X,Y:? "O"
120 WAIT 10
130 GOTO @LOOP
実行結果
40行の"1"を"0"としてリピート機能を無効にすると、ボタンの押しっぱなしで
は動かなくなり、何回も押さないとキャラクタが動かなくなります。
50行を
50 'IF[0]=1 GOTO @PRN
最近のコメント