フォト
2017年8月
    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 31    
無料ブログはココログ

LPC810

2016年8月17日 (水)

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

作成した赤外線リモコン受信モジュールのテストとしてサーボモータを操作してみました。


IcigoJamのプログラムはこんな感じです。

20160817235717

赤外線リモコン受信、お手軽に遠隔操作でいて良い感じです。


サーボーモータは安価で省電力化で動作するSG90というのを2個使いました。
専用のカメラ用マウントに取り付けています。
SG90は秋月電子で1個 400円、Aliexpress で送料無料で1個 $1.2くらいです。マウントは$1.38くらい。

IchigoJamのVCC(3.3V)で2つモータを同時に動かせました。
3.3Vでも動いたけど、実際は4.8V~6Vが動作電圧なので別電源にて5Vを取った方がよいでしょう。

Dscn5619

IchigoJamのPWM出力について

下図の黄色記載部がPWMとして利用出来るピンです。OUTピンの2~5のピンとなります。

Ichigojam121

PWMコマンドの使い方はリファレンスよりも下記の記事を参考にしたほうが良いです。
  福野泰介の一日一創 - 世界一簡単なサーボモーター制御、ロボットに一歩近づくIchigoJam

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

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

2016年7月21日 (木)

LPC810を使ったUART-I2Cブリッジの改良版が出来ました

機能拡張を検討していたUART-I2Cブリッジ、取りあえず完成しました。
   プログラムソース ダウンロード UART2I2C_20160906.zip (613.2K) (2016/09/06 修正)
   コマンドマニュアル暫定版 ダウンロード UART-I2C_DOCV2L1PDF.zip (346.2K) (追加)
   
GitHubによる公開 LPC810 UART-I2Cブリッジモジュール  (追加)

 
  ※プログラムソースを解凍したファイル内の
     UART2I2C_20160906\UART2I2C\Release\UART2I2C.hex
     を使った場合のLCP810への書き込み方法は、下記が参考になります。    

     LPC810のフラッシュへの書き込みをシリアルインターフェースで行なう
       http://www.nxp-lpc.com/programming_note/note3.html

いくつかコマンドを追加、バグ修正、回路修正を行いました。

Dscn5462

回路図の修正

回路図というには、部品はタクトスイッチと配線のみです。
I2C用のピンSCL、SDAは内部プルアップ抵抗を利用することで外付け抵抗不要にしました。
また、前バージョンのSCL、SDAのオープンドレイン設定が間違っていることが判明し、
それを訂正しました。

02
(シリアル通信は115200bps、8bit パリティなし、ストップビット1)

機能修正・追加(コマンド追加)

・I2Cスレーブアドレスの指定を8ビットから7ビットに変更しました。
 
・改行コードの扱い方の修正
  - 受信時の改行はCR+LF、LFのみの両対応としました。
  - 送信時の改行コードはデフォルトをCR+LF(0x0D,0x0A)とし、コマンドにて
    CR+LF/LF を切り替えられるようにしました。
 
・ローカルエコーの有無(デフォルトはローカルエコーなし)を設定出来るようにしました。
 
・I2Cバスに接続しているI2Cデバイスを調べてそのデバイスのアドレスを表示する機能
を追加しました(ラズベリーパイのi2cdetectコマンドみたいなやつです)。

   01

   パラメタの指定により、形式を切り替えることが出来ます。

   04

・ダミーコマンドの追加
  処理自体は何もしません(常に正常の00を返す)。
  シリアル通信チェックや補助コマンドで正常終了の復帰値を取得したい場合に
  利用するコマンドです。

コマンド一覧

03

現在、コマンドマニュアルを作成しています。出来次第、公開します。
(2016/07/22 暫定版を公開済)

関連記事
LPC810を使ったUART-I2Cブリッジの改良版が出来ました (16/07/21) [この記事です]
LPC810を使ったUART-I2Cブリッジの機能拡張の検討中 (16/07/13)
UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 (15/05/17)
Wiiヌンチャクの動作確認しました (15/05/17)
LPC810を使ったUART-I2Cブリッジがやっと出来ました (15/04/15)
ATtiny13AでUART-I2Cブリッジを試作したが微妙 (15/03/29)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3 (15/03/26)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備2 (15/03/25)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備 (15/03/24)

公開・ダウンロードサイト
GitHub - LPC810 UART-I2Cブリッジモジュール

2016年7月13日 (水)

LPC810を使ったUART-I2Cブリッジの機能拡張の検討中

以前作成しました「LPC810を使ったUART-I2Cブリッジ」の機能拡張を考えています。

現時点で追加・変更しようと思っているのは
1)i2cdetect
       接続しているI2Cデバイスをスキャンしその結果を表示する
       (ラズベリーパイのi2cdetectコマンドみたいなやつです)
2)I2Cバスのリセット
       I2Cスレーブがフリーズした感じの時、バスリセットして復活させるのが目的です。
3)HELPコマンド
       コマンドの簡単な説明を出力する。
4)LPC810ではなく、attiny85 digisparkでUSB接続で簡単利用する(出来るならば)。
5)ローカルエコーの有効/無効の切り替えコマンド
       対話テストにて使う際、ターミナルソフトの設定でエコーONにする必要があります。
       面倒なので、入力された文字列を行単位でそのまま出力する機能を追加します。
6)改行コードの変更
      現状、受信時の改行コードを現行のCR+LF(0x0D 0xA)から、
      LF(0x0A)に変更し+CRは無視するようにし、CR+LF、LFの両対応とする。
      出力の改行コードはデフォルトをCR+LF(0x0D 0xA)とし、コマンドにて
      LF(0x0A)とCR+LF(0x0D 0xA)を切り替えるようにする。
7)ウオッチドックタイマーによるフリーズからの復旧
     何らかの理由でフリーズした場合、リセットして自己復旧できるようにする。
8)I2Cアドレスを8ビット指定から7ビット指定に変更

です。

その前に現バージョンの仕様が自分でも忘れている感じなので、マニュアルを作成して
います。

取りあえず現段階のコマンドマニュアル(暫定版)を突貫工事で作成しました。
  ダウンロード UART-I2C_DOCPDF.zip (279.4K)
  ダウンロード UART-I2C_DOCV1L2PDF.zip (290.2K)  2016/07/14 修正版
  ダウンロード UART-I2C_DOCV1L3PDF.zip (300.6K) 
2016/07/16 修正版

以後、下記で修正版等を公開します。
https://github.com/Tamakichi/LPC810-UART-I2C-Bridge

自分では作成した覚えがない機能が結構ありました(夜中に小人さんが作ってくれた?)
補助コマンドの記載内容はかなり怪しいので見直し中です(特にエラーの戻り値の有無)。

話変わって、
最近、同モジュールの質問を受けまして、
以前から気になっていたOLEDキャラクターディスプレイを
ご利用とのことで私も衝動買いしました。

早速、LPC810を使ったUART-I2Cブリッジで動作確認しました。
表示が無茶苦茶綺麗です。だだし消費電力が大きいです。

Dscn5404

写真の"Thank you!"の表示は、
パソコンからTeraTermにて下記のコマンドをシリアル接続経由で送信しています。
    @c7800@h01020c0180 
(2016/07/16 微妙に間違っていたため修正しました)
    @c7840@sThank you!

比較的簡単な制御で表示出来ました。

2016/07/17 追記
まずは、I2Cアドレスを7ビット指定に変更し、ラズパイのi2cdetectっぽい機能を追加
しました。3つのI2Cスレーブを接続してちゃんと認識出来ました。

01

だだし、もうプログラム領域の余りが400バイトしかないです。
取りあえず、今回の改造はここまでかなぁ

関連記事
LPC810を使ったUART-I2Cブリッジの改良版が出来ました (16/07/21)
LPC810を使ったUART-I2Cブリッジの機能拡張の検討中 (16/07/13) [この記事です]
UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 (15/05/17)
Wiiヌンチャクの動作確認しました (15/05/17)
LPC810を使ったUART-I2Cブリッジがやっと出来ました (15/04/15)
ATtiny13AでUART-I2Cブリッジを試作したが微妙 (15/03/29)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3 (15/03/26)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備2 (15/03/25)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備 (15/03/24)

公開・ダウンロードサイト
GitHub - LPC810 UART-I2Cブリッジモジュール

2015年6月14日 (日)

IchigoJamでDVR8830を使ったロボットカー制御(2)

ちょっと間が空きましたが、前回の続きです。

ロボットカーのキャスターが不調のため、ホームセンタで購入した別の物に交換しました。

        Dscn3895
                       (写真は構成を変更作業中の様子です)

更にブレットボードからユニバーサル基板実装に移行しました。
また電池をエネループ3本(3.6V)に変更してDC-DCコンバータを不要としました。
有線リモコンをこの前作成した、赤外線リモコンに変更しました。
  関連記事:LPC810を使ってIchigoJamで赤外線リモコン受信を行う
                 LPC810を使ってIchigoJamで赤外線リモコン受信を行う(2)

前回よりもコンパクトになりました。

Dscn3897

早速走行試験をしてみます。
今回、助手のるみちゃんは怯えて隠れてしまい手伝ってくれませんでした。



いい感じで動きました。赤外線リモコンでも2、3メートルくらいは離れていても
操作出来ています。

IchigoJamのプログラムはこんな感じです。
意外と短い記述で済みます。Arduinoを使うよりも簡単に動かせます。
1.0.0b16でバグがあり、ちょっとハマりました。110から190行で省略可能なTHENを
省略すると16進数の判定が正しく行われませんでした。なので省略しません。

10 CLS:CLV
20 POKE #700,0,0,0,0,0
30 LET[0],#F<<2+`10,0,#F<<2+`01,#0
40 'I2C IR remote
50 R=I2CR(#20,#704,1,#8CC,4)
60 LC 0,0:?HEX$(B,2);:?" ";:? A
70 IF A=1 GOTO 50
110 IF B=#08 THEN C=[0]:D=[1]:GOTO 200
120 IF B=#A8 THEN C=[1]:D=[1]:GOTO 200
130 IF B=#28 THEN C=[2]:D=[1]:GOTO 200
140 IF B=#88 THEN C=[0]:D=[0]:GOTO 200
160 IF B=#98 THEN C=[2]:D=[2]:GOTO 200
170 IF B=#48 THEN C=[1]:D=[0]:GOTO 200
190 IF B=#68 THEN C=[1]:D=[2]:GOTO 200
195 C=[1]:D=[1]
200 GOSUB 500
210 GOTO 50
500 'MTR DRV(C,D)
510 POKE #701,C:POKE #703,D
520 R=I2CW(#60,#700,1,#701,1)
530 R=I2CW(#64,#702,1,#703,1)
540 RETURN

もうちょっとアクションを増やしたり、センサー類を付けて遊んでみたいと思います。

2015年6月 6日 (土)

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

この前ブレッドボード上に実装して赤外線リモコン受信をユニバーサル基板に実装しました。
秋月電子でちょうどいい感じの基板が売っていたの利用してみました。

Dscn3887

端子はVCC、GND、SDA、SCLです。ユニバーサル基板実装時のシリアル通信、
ISP用、リセット用のタクトスイッチは省略しました。

Dscn3888

IchigoJamに接続して問題なく動作することを確認しました。

Dscn3881


結線はこんな感じです。抵抗は2.2kΩ(1/6w)を利用。回路図は前回と同じですが、
シリアル、ISP用タクトスイッチは省略しています。

02

これを使って、以前試した「IchigoJamでDVR8830を使ったロボットカー制御」
有線リモコンを赤外線リモコンに置き換える予定です。


2015年5月31日 (日)

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

IchigoJamを赤外線リモコンで操作する試みで、
この前やった、Arduino を使った赤外線リモコン受信LPC810(通称 どんぐり)を使って
やってみました。まずはブレッドボード上にて実装しました。

結論としてはかなり使えそうです。3メール離れても受信出来ました。
基板実装して、ロボットカーをリモコン操作をやってみようと思います。

Dscn3858

方式は下記のように、LPC810をI2CスレーブとしてIcihoJamから赤外線リモコンの
受信データを読みにいきます。

03

LPC810まわりの実装は、下図の通りです。
赤外線リモコン受信モジュールは、秋月電子で購入したPL-IRM2161-XD1
使っています。2個で100円と安価な部品です。

01

シリアル通信(115200)はデバッグ用に利用します。通常は接続しなくてもOKです。
赤外線リモコンは、こんな感じのを使いました。ボタンに割り当てられている
コードは写真の右側の値となります。NEC方式の通信方式です。

I2Cのアドレスは適当に0x40(8ビットアドレス)を割り当てました。

機能としては単純で4コマンドのみです。
コマンドコードを1バイト送信して、直前に押したリモコンボタンのコードと状態コードの
計4バイトを取得します。

送信コマンドは下記の通り
  00 通常受信(リピート機能OFF)
  01 リピート機能有効受信
  FF デバッグモードON受信
  FE デバッグモードOFF受信

受信データ4バイト
  2バイト: 状態コード   (0:新しい値  1:前回済み)
  2バイト: ボタンコード  00~ FF

リピート機能OFFの場合、ボタンを押しっぱなしにした場合は1回だけ押されたと判断
します。リピート機能ONの場合、ボタンを押しっぱなしは"連打"に相当します。

IchigoJamで使う場合、次のような感じで使います。

10 'I2C IR remote
20 CLS:CLV:POKE #700,1
30 X=16:Y=12
40 R=I2CR(#20,#700,1,#8CC,4)
50 LC 0,0:?HEX$(B,2);:?" ";:? A
60 IF A=1 GOTO 110
70 IF B=#88 IF Y>1  Y=Y-1
80 IF B=#98 IF Y<22 Y=Y+1
90 IF B=#28 IF X>1 X=X-1
100 IF B=#68 IF X <30 X=X+1
110 LC X,Y:? "O"
120 GOTO 40

これを実行した画面はこんな感じです。単純に○をリモコンで上下左右動かすだけです。

02

40行のI2CRコマンドでコマンドの送信とリモコン操作のボタンコードを取得しています。
#8CCのアドレスに受信データを格納します。このアドレスから4バイトは変数のA、B
の領域です。そのためプログラムで変数A、Bを使って値判定しています。

変数領域#800~#8FFの内訳は次のようになっているようです。
1変数あたり2バイトを使用します。
  #800  - #8C9  配列変数  [00] - [100]
  #8CA - #8CB  空き
  #8CC - #8FF  変数 A - Z

次にLPC810のプログラムについてです。
IR受信処理はarduinoのソースをちょこと修正しただけで利用できました。
I2Cスレーブまわりはライブラリを自作しました。LPC810のマニュアルを読み込んで
実装したのですが、取りあえず動いているといった感じです。

ソースを置いておきます。

LPC810ソース ダウンロード IRtoI2C_050531.zip (281.3K)

関連記事
  LPC810を使ってIchigoJamで赤外線リモコン受信を行う(2) ・・・ 基板実装
  IchigoJamでDVR8830を使ったロボットカー制御(2)            ・・・ 赤外線リモコンで操作

2015年5月17日 (日)

UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 -

以前作成したLPC810を使って作成した「UART-I2Cブリッジ」ですが、
用途としてIC2デバイスの動作確認ツールとして活用しています。
ちょっとした調査ならプログラムを作成しないで行えます。

その活用方法のご紹介です。
試しに、Aliexplressで購入したI2C接続のリアルタイムクロックの動作確認をしてみます。

05_2

実物はこんな感じです。送料無料で$1.20(150円)で購入できます。

Dscn3824

使い方や仕様については、デジットさんのブログ
「I2Cバス接続のリアルタイムクロックモジュール入荷!」の記事が参考になります。

基板上にはI2C接続デバイスである、リアルタイムクロック DS1307 と
EEPROM  AT24C32 (4キロバイトEEPROM)が搭載されています。

早速、UART-I2Cブリッジに接続してみます。

Dscn3826

動作確認のツールとしてTeraTermを使います。
通信条件と、端末設定は次の通りです。

01_2

端末の設定では改行コード、ローカルエコーの設定をします。

03_2

@vと入力してバージョンが正常に表示されることを確認します。

04_3

これで準備終了です。

まずは、リアルタイムクロックモジュール上の「リアルタイムクロック DS1307」の
動作確認をしてみます。

デジットさんのブログで公開している「取扱説明書(PDF)」と、DS1307のメーカーの
公開資料を参考にします。
  Maxim S1307 64 x 8、シリアル、I2Cリアルタイムクロック

Maximの資料によると、I2CアドレスはD0でレジスタの内容は下記の通りです。

06_2

I2C接続によるこのデータのは受信は下記の通りです。

10

I2Cアドレスが0xD0で、取得したいレジスタのアドレスを送信してデータを
受信する仕様です。

早速やってみます。
00hから3Fhの64バイトを取得してみます。
UART-I2Cブリッジのコマンドにすると次のようになります。
 @rd040@h00

一括データ送受信を使います。書式は下記の通りです。
  @r[I2Cアドレス][受信データ長][送信データ指定部][改行]

受信データ長は0x40は64バイトを指定、受信前に送信するデータは00です。
@hはデータを16進数で指定するコマンドです。

実行すると下記の結果となります。

08_3

00が実行結果(正常終了)、その下の128桁の文字列が取得データです。
デフォルトでは、16進数の連続文字列として返されます。

これだと結果が分かりにくいので、出力形式を16進ダンプ形式に変更してみます。
 @o2@rd040@h00

出力形式を指定する@oコマンドを頭につけて実行します。
こんな感じでちょっと分かりやすくなります。

09

データを確認すると、このモジュールは正しい時刻が設定されていないようです。
時間も進まず止まっています。レジスタ00のCHに1がセットされているために
時計が止まった状態です。

次にデータの設定を行ってみます。
コマンドとしては、
  一括データ送信   @w[I2Cアドレス][送信データ指定部][改行]
を利用します。

現在の時刻 2015/05/17 (日) 21:00 を設定してみます。
レジスタと設定する値は次の通りとなります。00~07のレジスタに設定すます。

レジスタアドレス:設定値、説明
00:  00   CH=0, SEC = 00秒
01:  00   00分
02:  21   21時 
03:  01   日曜
04:  17   17日
05:  05   05月
06:  15   2015年
07:  00   外部出力なし

UART-I2Cブリッジのコマンドにすると次のようになります。
上記のデータの前に書き込みアドレスの00を付けて送信します。
  @wd0@h000000210117051500

11_2

設定した値を読んでみます。
  @o2@rd008@h00

時計が動いているかを確認するため、3回実行してみます。

12

右から 15年、5月、17日、01(日曜)、21時、01分、25秒と読めます。
また3回の実行で秒が進んでいるのが分かります。

リアルタイムクロックはちゃんと動作しているようです。

次にEEPROM  AT24C32を使ってみます。I2Cアドレスは0xA0です。

EEPROM内アドレス0000に"Hello,World"を書き込んでみます。
データ部の@h0000がアドレスを16進数で指定、@sがデータを文字で指定しています。
AT24C32の仕様では、ページ単位(1ページ32バイト)の書き込みとなります。

書き込み
@wA0@h0000@sHello,World.

13_2

書き込んだデータの読出し

@oで出力形式をバイナリ(無変換)を指定、@ra00cがI2CアドレスA0から12バイトを
データ送信後に読みだす命令です。読み出す前のデータを@hで16進数で指定して
います。ここではアドレスを指定しています。

@o1@ra00c@h0000 

14

一度に読み出せるデータはコマンドの仕様上、255バイト(0xFF)となります。
ちょっと試すとこんな感じです。
@o2@ra0ff@h0000

アドレス00から255バイトを読んで見ました。

15

ここは仕様的に00を指定すると256バイト表示出来るように修正したいですね。

このリアルタイムクロック、コマンド的にはシンプルなので
IchigoJamでも使えそうですね。

接続しているデバイスをスキャンしてリスト表示する機能と
モニター機能(I2Cバス上のデータを表示)も欲しくなってきました。
改造の余地ありです。

関連記事
LPC810を使ったUART-I2Cブリッジの改良版が出来ました (16/07/21)
LPC810を使ったUART-I2Cブリッジの機能拡張の検討中 (16/07/13)
UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 (15/05/17) [この記事です]
Wiiヌンチャクの動作確認しました (15/05/17)
LPC810を使ったUART-I2Cブリッジがやっと出来ました (15/04/15)
ATtiny13AでUART-I2Cブリッジを試作したが微妙 (15/03/29)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3 (15/03/26)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備2 (15/03/25)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備 (15/03/24)

公開・ダウンロードサイト
GitHub - LPC810 UART-I2Cブリッジモジュール


Wiiヌンチャクの動作確認しました

以前購入したWiiヌンチャク用(多分ぱちもん)
ブレッドボードやArduinoに接続するアダプタが到着したので動作を確認しました。
動作確認にはちょっとハマりました。

アダプタはこんな感じの製品です。

Dscn3820

Wiiヌンチャクの端子にこんな感じで接続します。

Dscn3821

早速、arduinoに接続して動作を確認します。

arduinoでの使い方は次のサイトを参考にしました。
todbot blog - “WiiChuck” Wii Nunchuck Adapter Available

アダプタの接続はアナログポート A2からA5を使います。
A2 : Lレベル  0V出力 (GND)
A3 : Hレベル  5V出力
A4 : I2C SDA
A5 : I2C SCL

電圧は、3.3V推奨のようですが、5Vでも動作します。

Dscn3818

次にプログラムを参考サイトのリンクから入手しArduinoの書き込みます。
todbot/wiichuck_adapter - https://github.com/todbot/wiichuck_adapter

早速動かして見たのですが...

04

値がちゃんと取れません。プログラムを修正してエラーを返すようにしても
エラーは発生していないようです。
アダプタを抜くと、I2Cの通信エラーとなるのでI2Cのアドレスが正しく、かつ
データ取得も正常のようです。

05

そこで、以前製作したUART-I2C変換モジュールで動作確認してみました。

Dscn3819

接続して、TeraTermからサンプルソースを参考にして、I2Cのコマンドを
送信してみます。

@wA4@h4000 がハンドシェイク用のコマンド、@wA4@h0000が利用開始、
@gA406がデータ取得です。

06

試した感じでは、I2Cの通信は問題なさそうです。
ただし、読み取り値がFFFFFFFFFFと正常な値ではありません。

「うーん、これは不良品ではないだろうか」
取りあえず、WiiヌンチャクのI2Cコマンド仕様を探して調べてみることに...
多くのサイトで紹介されており、今回使ったコマンドで問題ないようです。
下記のサンプルやI2Cの解説も同じ感じです。
http://www.robotshop.com/media/files/PDF/inex-zx-nunchuck-datasheet.pdf

ところが、下記の資料の中で
http://web.engr.oregonstate.edu/~sullivae/ece375/pdf/nunchuk.pdf

次の文面を発見
To communicate with the Nunchuk,we must send a handshake signal.
If you are using a black Wii Nunchuk, send 2 bytes 0xF0, 0x55 to initialize
the first register and 0xFB, 0x00 to initialize the second register of the Nunchuk.
On a white Wii Nunchuk, send 0x40, 0x00 followed by 0x00.

要するに、「黒ヌンチャク」と「白ヌンチャク」でハンドシェイクで送るデータが違うようです。
サンプルソースや、出回っている情報は「白ヌンチャク」のものだけです。

私のは「白ヌンチャク」ですが、ぱちもんなので「もしかしたら...」と思い
「黒ヌンチャク」用のハンドシェイクを行ってみると、

07

それらしい値が帰ってきました。
私のは「黒ヌンチャク」のようです。

この修正をArduinoに反映してみると、それっぽい値が取れました。

08

ヌンチャクの操作によって値が変わります。
加速度センサーもちゃんと動いているようです。

I2Cで送信するコマンドは単純なので、IcihoJamでも使えそうです。

(追記)
IchigoJamでも試したのですが、結果はダメでした。
IchigoJamに、データ取得だけを行うコマンドがありません。
I2CR(I2Cアドレス、送信データアドレス、データ長、受信データアドレス、データ長)
というコマンドは、データ送信付きの受信コマンドのため使えませんでした。
データ長に0を指定すると256バイト送信されます。

今回は諦めることにします。


※上記のIchigoJamに関する記載は古いです。
最新のファームウェア1.2.2βでは利用できます。

(参考情報)
福野泰介の一日一創 IchigoJam trying to connect Wii Nunchuck via I2C

関連記事
LPC810を使ったUART-I2Cブリッジの改良版が出来ました (16/07/21)
LPC810を使ったUART-I2Cブリッジの機能拡張の検討中 (16/07/13)
UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 (15/05/17)
Wiiヌンチャクの動作確認しました (15/05/17) [この記事です]
LPC810を使ったUART-I2Cブリッジがやっと出来ました (15/04/15)
ATtiny13AでUART-I2Cブリッジを試作したが微妙 (15/03/29)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3 (15/03/26)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備2 (15/03/25)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備 (15/03/24)

公開・ダウンロードサイト
GitHub - LPC810 UART-I2Cブリッジモジュール

2015年4月30日 (木)

書籍「挿すだけ!ARM32ビット・マイコンのはじめ方」を購入

最近マイブームのLPC810関連の書籍「挿すだけ!ARM32ビット・マイコンのはじめ方」を
購入しました。

Dscn3779

こちらの書籍の方が、ちょっと前に購入した「ボクのLPC810工作ノート」よりも
私向きでした。ライブラリとしてはCMSIS_COREのみの利用なので、LPC810の
「ハードウェアを自分で操る」というプリミティブな楽しみが味わえます。
こちらの方かLPC810の習得には向いていると思います。

「ボクのLPC810工作ノート」は工作事例集っといった感じです。
これはこれで、参考書的に使えます。

徐々に、Arduinoから徐々にARM+mbedと方向転換していきます。
ARM(というか32ビットCPU)の方が慣れると楽です。開発環境でデバッガが使える等、
大人(プロ)の環境です。