TWELITE 簡単アプリで I2C の動作確認


TWELITE の「超簡単！標準アプリ」には I2C を使ってセンサーなどの情報を取得する機能があります。

今回は、その機能を使って I2C の基本的なアクセスが可能なことを確認してみます。

# 環境

- TWELITE DIP
- Microchip MTCH6102

MTCH6202 タッチセンサICです。I2Cでタッチセンサの情報を取得できます。
http://ww1.microchip.com/downloads/jp/DeviceDoc/40001750A_JP.pdf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/06fb43e6-77e9-0a2c-8686-cd2c0dbf0bb2.png)


今回は、これを搭載した nüno モジュールの試作品が手元にあったのでそれでテストしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2430a6b7-f916-8022-0e8a-9327eebcd4d8.png)
これは GROVE 端子がついていて使いやすいです。

nüno とは、導電布タッチセンサーモジュールとして以下に公開されています。
https://github.com/tendots/nuno


# 配線

|TWELITE DIP 基板ピン番号|TWELITE DIP 基板上のシルク表記|TWELITE CHIP パッド番号|TWELITE IO名 |I2C機能|GROVE 配線色|
|:---:|:---:|:---:|:---:|:---:|:---:|
|1 |GND|GND|GND|GND|黒|
|2 |14 |14|DIO14|SCL|黄|
|19 |15 |17|DIO15|SDA|白|
|28 |VCC|VCC |VCC|VCC|赤|
![IMG_20200920_165222548.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/db9fb4f1-511e-0b9b-4ce1-2fad4f31f47b.jpeg)
GROVE 配線色は、SeeedStudio の色割り当てです。M5STACK 用の配線だと黄と白が入れ替わっていますので注意。

# MTCH6102

MTCH6102 の動作モードはいくつかあり、使用にあたってどの動作モードにするかを書き込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1a96e91b-f33b-3fba-8ded-47f2551ffd15.png)


今回は、動作モードを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 によるデータ送受信は以下のように定義されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c63ab6f8-676a-1833-aeea-a48cb618585b.png)

読み込みについてはただ単に読み込むだけではなくて、一旦書き込んでから読み込みなのだそうです。


コマンド電文のフィールド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 を一体化した基板を作ってみました。

![IMG_20200920_165059783.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6032cb0f-7586-8b9d-ba75-307597e3173a.jpeg)

次バージョンの nüno はこちらで作っています。
https://github.com/tendots/nuno2


## nüno2 を使って無線で MTCH6102 と通信する


先の例では :DB..... というコマンドを使って自分自身のI2Cデバイスを操作しました。

:78... というコマンドに替えると無線での接続先のI2Cデバイスを操作できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/48f39da7-173a-d5cb-1754-fc6a60c8af1a.png)


通常の TWELITE を親機モードにして、nüno2 と無線でやり取りしてみます。

まず、先の


:DB880104250501X

を無線で接続した子機へのリクエストに直してみます。

:78880104250501X


と打ち込んでアドレス 0x25 に対し、レジスタ 0x05 を読み込みしてみます

:78890104010103F5

と出れば、レジスタ 0x05 の中身 0x03 の読み出しができています。

なお、このコマンドを連打してみましたが、1秒ごとしか返事は返ってこないみたいです。




  アドレス0x05に 0x02を書いて、タッチモードにします。
  アドレス0x20に 0x07を書いて、NUMBEROFXCHANNELSを設定します
  アドレス0x21に 0x06を書いて、NUMBEROFYCHANNELSを設定します
  アドレス0x80-0x87 を読み込んで、チャンネルごとのRAW値を読み込みます。