フォト
2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ

« Arduinoで8x8LEDマトリックスを直接(直結)で制御する | トップページ | LPC810を使ってIchigoJamで赤外線リモコン受信を行う(4) »

2016年8月15日 (月)

LPC810を使ってIchigoJamで赤外線リモコン受信を行う(3)

以前作成したLPC810を使ったIchigoJam用赤外線リモコン受信モジュールを改良しました。
対象とするIchigoJam はファームウェア 1.2.1です。

    Dscn5582

前回からの改良点
  1)I2C用プルアップ抵抗不要。
    内部のプルアップ抵抗を利用するようにしました
  2)赤外線リモコンのボタンコードを調べる機能の追加(強化)
    シリアルTXDポート(2番ピン)から随時ボタンコードをテキスト形式で出力します。
 3)IchigoJam BASICによるプログラミングでPOKEを使わないでI2CRを使える
 インタフェースにしました。

仕様および機能
  ・インタフェース
      I2C(アドレス 0x20)                : ボタンコード取得用
      UART (115200bps,TXDのみ)  : 赤外線リモコンのボタンコード調査用
  ・機能
      赤外線リモコン受信モジュールが直前に受信したボタン情報を返す(I2C)
      赤外線リモコン受信モジュールが受信したボタン情報を随時出力(UART)

回路図

               Photo
                       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方式リモコン)。 

      Dscn5587

     ・LPC810のGND、VCC、2番ピン(TXD)をIchigoJamのGND、VCC、RXDピンに
       接続してIcigoJamを起動させます。
      (ボタンコードを調べる場合に限りRXDピンにつなげます)

     ・赤外線¥リモコンのボタンを押すと、ボタンに対応するコードが表示されます。

    20160813215500   

     IR=90 の2桁の16進数90がボタンコードとなります。
    
     IR=** と表示されるのは、リピート(ボタンを押し続けている状態)を意味します。

     注意)
        対応していない赤外線リモコンの場合では何も表示されません。
        1つのボタンに複数のコードが割り当てられている場合があります。

     これにより、手持ちの赤外線リモコンのボタンコードを調べることが出来ます。
 
      実際に調べたコードの例
      Dscn3787
     通常、赤外線リモコン上のボタンは全て異なるコードとなります。

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

          実行結果      
        20160814115742

        出力の①部分は実行後何も操作をしていない状態です。
        初期値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

          実行結果      
         20160815090714

        出力の①部分は実行後何も操作をしていない状態です。
        初期値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 

       実行結果
       20160815095250

       40行の"1"を"0"としてリピート機能を無効にすると、ボタンの押しっぱなしで
       は動かなくなり、何回も押さないとキャラクタが動かなくなります。

       50行を
        50 'IF[0]=1 GOTO @PRN

       とコメントアウトして状態コードによる判定を利用しないようにすると、
       キャラクタが常に動くようになります。
       ヘビゲーム(長さを競う、自分の身体、壁にぶつかるとゲームオーバー)なんか
       に使えそうです。

追記
   ユニバーサル基板に実装してみました。
   せっかくなので、新しく販売されました「IchigoJam T 」用に小型化しました。
   こんな感じす。

      Dscn5574

   IchigoJam T には、I2C利用のための端子が別途あります(写真の右側の5ピン)。

     Dscn5576

   ここに直接装着して利用します。いい感じに乗りました。

     Dscn5580

   
   基板図(左:表、右:裏)

    Photo
   実物(裏)

       Dscn5592

   なんとかプリント基板化したいなぁ   

« Arduinoで8x8LEDマトリックスを直接(直結)で制御する | トップページ | LPC810を使ってIchigoJamで赤外線リモコン受信を行う(4) »

IchigoJam」カテゴリの記事

LPC810」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/64053929

この記事へのトラックバック一覧です: LPC810を使ってIchigoJamで赤外線リモコン受信を行う(3):

« Arduinoで8x8LEDマトリックスを直接(直結)で制御する | トップページ | LPC810を使ってIchigoJamで赤外線リモコン受信を行う(4) »