TWELITE の「超簡単!標準アプリ」には I2C を使ってセンサーなどの情報を取得する機能があります。
今回は、その機能を使って I2C の基本的なアクセスが可能なことを確認してみます。
環境
- TWELITE DIP
- Microchip MTCH6102
MTCH6202 タッチセンサICです。I2Cでタッチセンサの情報を取得できます。
http://ww1.microchip.com/downloads/jp/DeviceDoc/40001750A_JP.pdf
今回は、これを搭載した nüno モジュールの試作品が手元にあったのでそれでテストしました。
これは GROVE 端子がついていて使いやすいです。
nüno とは、導電布タッチセンサーモジュールとして以下に公開されています。
https://github.com/tendots/nuno
配線
MTCH6102
MTCH6102 の動作モードはいくつかあり、使用にあたってどの動作モードにするかを書き込みます。
今回は、動作モードを2に設定し、その後設定値を読み出せることができるか試してみます。
TWELITE 簡単アプリでのI2Cのアクセス方法
https://mono-wireless.com/jp/products/TWE-APPS/App_Twelite/step3-I2C.html
では、
:DB88010123230055
という電文を送ることにより、自分自身に接続している I2C デバイスに書き込みする例が示されています。
: | DB | 88 | 01 | 01 | 23 | 23 | 00 | 55 |
---|---|---|---|---|---|---|---|---|
セパレーター | 自分自身に接続したI2Cデバイス | 簡単アプリI2Cコマンド | 任意の数値 | I2Cデバイスへ書込 | I2Cアドレス | I2Cレジスタ | 書き込みデータ長 | チェックサム |
この例をそのまま実行してみたら、以下のように返ってきました。
:DB89010100009A
: | DB | 89 | 01 | 01 | 00 | 00 | 9A |
---|---|---|---|---|---|---|---|
セパレーター | 自分自身に接続したI2Cデバイス | 簡単アプリI2Cコマンド | (リピート) | (リピート) | 実行結果(0:FAIL,1:SUCCESS) | データ長 | チェックサム |
実行失敗となっています。
そもそもサンプルとはI2Cアドレスが異なっているので、以下のように直して送ります。
読み出し
:DB880102250500X
: | DB | 88 | 01 | 02 | 25 | 05 | 00 | X |
---|---|---|---|---|---|---|---|---|
セパレーター | 自分自身に接続したI2Cデバイス | 簡単アプリI2Cコマンド | 任意の数値 | I2Cデバイスから読出 | I2Cアドレス | I2Cレジスタ | 書き込みデータ長 | チェックサム省略 |
アドレス 0x25 に対し、レジスタ 0x05 を読み込みしてみます。
結果
:DB890102000099
: | DB | 89 | 01 | 02 | 00 | 00 | 99 |
---|---|---|---|---|---|---|---|
セパレーター | 自分自身に接続したI2Cデバイス | 簡単アプリI2Cコマンド | (リピート) | (リピート) | 実行結果(0:FAIL,1:SUCCESS) | データ長 | チェックサム |
となりました。
失敗してますね・・・データシートを見てみるとI2C によるデータ送受信は以下のように定義されています。
読み込みについてはただ単に読み込むだけではなくて、一旦書き込んでから読み込みなのだそうです。
コマンド電文のフィールド5は、0x01が書き込み、0x02が書き込みですが、0x04が書き込み&読み出しとなっています。これを使うといいのかな?
:DB880104250501X
: | DB | 88 | 01 | 04 | 25 | 05 | 01 | X |
---|---|---|---|---|---|---|---|---|
セパレーター | 自分自身に接続したI2Cデバイス | 簡単アプリI2Cコマンド | 任意の数値 | I2Cデバイスから書込&読出 | I2Cアドレス | I2Cレジスタ | 読み込みデータ長 | チェックサム省略 |
結果
:DB89010401010392
: | DB | 89 | 01 | 04 | 01 | 01 | 03 | 99 |
---|---|---|---|---|---|---|---|---|
セパレーター | 自分自身に接続したI2Cデバイス | 簡単アプリI2Cコマンド | (リピート) | (リピート) | 実行結果(0:FAIL,1:SUCCESS) | データ長 | データ | チェックサム |
成功し、データ値 0x03 が取得できました。
実際に、デバイスを外すと
:DB890104000097
と変化しているので I2C デバイスから応答があったらしいことがわかります。
書き込み
動作モード指定レジスタ 0x05 に タッチモード 0x02 を設定します。
:DB88010225050102X
と出すと
:DB8901020101CCCB
となりましたが、これはコマンドを間違えていました。やり直し。
:DB88010125050102X
: | DB | 88 | 01 | 01 | 25 | 05 | 01 | 02 | X |
---|---|---|---|---|---|---|---|---|---|
セパレーター | 自分自身に接続したI2Cデバイス | 簡単アプリI2Cコマンド | 任意の数値 | I2Cデバイスから書込 | I2Cアドレス | I2Cレジスタ | 書込データ長 | データ列 | チェックサム省略 |
と出すと
:DB890101010099
|:|DB|89|01|01|01|00|99|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|セパレーター|自分自身に接続したI2Cデバイス|簡単アプリI2Cコマンド|(リピート)|(リピート)|実行結果(0:FAIL,1:SUCCESS)|データ長|チェックサム|
書けたかな?
デバイスを外していると
:DB89010100009A
と応答が変化するのでデバイスは反応しているようです。
ベリファイ
先程書き込み動作する以前はモード設定レジスタ0x05の内容は0x03でした。
その後0x02を書き込んだので、正常に書き込まれたかどうか確認してみます。
先程の「読み出し」実験で使用した電文をそのまま使ってみます。
:DB880104250501X
: | DB | 88 | 01 | 04 | 25 | 05 | 01 | X |
---|---|---|---|---|---|---|---|---|
セパレーター | 自分自身に接続したI2Cデバイス | 簡単アプリI2Cコマンド | 任意の数値 | I2Cデバイスから書込&読出 | I2Cアドレス | I2Cレジスタ | 読み込みデータ長 | チェックサム省略 |
結果
:DB89010401010293
: | DB | 89 | 01 | 04 | 01 | 01 | 02 | 93 |
---|---|---|---|---|---|---|---|---|
セパレーター | 自分自身に接続したI2Cデバイス | 簡単アプリI2Cコマンド | (リピート) | (リピート) | 実行結果(0:FAIL,1:SUCCESS) | データ長 | データ | チェックサム |
0x05 レジスタの値が 0x02 になっていることが確認できました。
nüno2
上の結果を元に、nüno モジュールの次バージョンとして、TWELITE と MTCH6102 を一体化した基板を作ってみました。
次バージョンの nüno はこちらで作っています。
https://github.com/tendots/nuno2
nüno2 を使って無線で MTCH6102 と通信する
先の例では :DB..... というコマンドを使って自分自身のI2Cデバイスを操作しました。
:78... というコマンドに替えると無線での接続先のI2Cデバイスを操作できます。
通常の TWELITE を親機モードにして、nüno2 と無線でやり取りしてみます。
まず、先の
:DB880104250501X
を無線で接続した子機へのリクエストに直してみます。
:78880104250501X
と打ち込んでアドレス 0x25 に対し、レジスタ 0x05 を読み込みしてみます
:78890104010103F5
と出れば、レジスタ 0x05 の中身 0x03 の読み出しができています。
なお、このコマンドを連打してみましたが、1秒ごとしか返事は返ってこないみたいです。
アドレス0x05に 0x02を書いて、タッチモードにします。
アドレス0x20に 0x07を書いて、NUMBEROFXCHANNELSを設定します
アドレス0x21に 0x06を書いて、NUMBEROFYCHANNELSを設定します
アドレス0x80-0x87 を読み込んで、チャンネルごとのRAW値を読み込みます。