「導電布タッチセンサーモジュール nüno ver.2 を有線で使ってみる」
https://qiita.com/nanbuwks/items/5b174546da5df383f155
の続きです。
「TWELITE 簡単アプリで I2C の動作確認」
https://qiita.com/nanbuwks/items/8b789009cf561d36027e
で確認した内容を元に、無線でタッチセンサーの情報を取得してみます。
使うもの
nüno ver.2
これは基板+電池+ケース+導電性布を接続するホックです。
内部にはCR2032ボタン電池が内蔵されています。
今回の方法は電池消費が激しいたため実験用途に外部から3.3Vを供給するのがいいかも知れません。
TWELITE DIP
nüno からの電波信号を受信するものとして、市販の TWELITE モジュールが使えます。
「超簡単!標準アプリ(App_Twelite)」が初期設定されている TWE-Lite-DIP のシリーズだとプログラムの変更なしに受信できます。
写真は PCB アンテナの TWE-Lite-DIP-PCB です。
今回は、このようにUSBシリアルモジュールをつなげてPCで受けてみました。
PC , 通信ソフト
今回は Ubuntu Linux 20.04 で picocom を使っています。通信条件さえ合わすことができれば OS や通信ソフトは何でも構いません。
接続
送信側の nüno モジュールは電池を装着するだけで動作し始めます。
受信側の TWELITE DIPは親機に設定するために、GPIO10番をGNDに落とします。(写真、黄色のジャンパー)
これを含め、以下のように配線します。
シルク表記 | 信号名 | 接続先 | 用途 |
---|---|---|---|
VCC | VCC | USBシリアル3.3Vに接続 | 電源供給用 |
GND | GND | USBシリアルGNDに接続 | 電源供給用 |
RX | RX | USBシリアルTXに接続 | PCからの送信用 |
TX | TX | USBシリアルRXに接続 | PCへの受信用 |
10 | M1 | GNDに接続 | 親機モード設定用 |
1 | AI4 | VCCに接続 | ノイズによる余計な信号発生を抑制 |
A2 | AI3 | VCCに接続 | ノイズによる余計な信号発生を抑制 |
0 | AI2 | VCCに接続 | ノイズによる余計な信号発生を抑制 |
A1 | AI1 | VCCに接続 | ノイズによる余計な信号発生を抑制 |
PC 上での通信ソフト
$ picocom -b 115200 -r -l --omap crcrlf /dev/ttyUSB0
として親機と通信します。
通信条件は以下の通り
- ボーレート 115200
- フロー制御 なし
- 改行コード crlf
linux の改行コードは cr なので cr をキー入力すると crlf に変換するようにしています。
ポートが開くと以下のように電文が流れてきます。
:788115015D810B96CF000A33000CBE228406220F160B6836
:7881150160810B96CF000A7F000CBF228406220F160B68E6
:7881150160810B96CF000AB1000CBD238406220F160B24F9
:788115015A810B96CF000AE1000CBE228406220F160B648F
:7881150166810B96CF000B19000CAC238406210F150AB111
:788115015D810B96CF000B61000C57228406200E140A10CC
:7881150172810B96CF000B9B000C282384061F0D1409DDE1
:7881150172810B96CF000BD5000C052384061E0D13097B2E
:7881150172810B96CF000C15000BEE2284061E0D1309760B
:7881150172810B96CF000C61000BDA2284061E0D130961E8
:7881150172810B96CF000C9F000BCF2284061E0D13091006
・・・
これは、子機である nüno モジュールから定期で送られる信号を受信して、このように表示されています。
子機にも標準では「超簡単!標準アプリ(App_Twelite)」が書き込まれているため、この電文は状態通知
「相手端末からの状態通知:ステータス 0x81 - MONO-WIRELESS.COM」
https://mono-wireless.com/jp/products/TWE-APPS/App_Twelite/step3-81.html
の内容となります。
動作確認
:78880104250501X
と打ち込んで子機の I2C アドレス 0x25 に対し、レジスタ 0x05 を読み込みしてみます
: | 78 | 88 | 01 | 04 | 25 | 05 | 01 | X |
---|---|---|---|---|---|---|---|---|
セパレーター | 子機に接続したI2Cデバイス | 簡単アプリI2Cコマンド | 任意の数値 | I2Cデバイスへ書込 | I2Cアドレス | I2Cレジスタ | 書き込みデータ長 | チェックサム |
:78890104010103F5
と出れば、レジスタ 0x05 の中身 0x03 の読み出しができています。
なお、このコマンドを連打してみましたが、1秒ごとしか返事は返ってこないみたいです。
子機の設定
アドレス0x05に 0x02を書いて、タッチモードにします。
:7888010125050102X
: | 78 | 88 | 01 | 01 | 25 | 05 | 01 | 02 | X |
---|---|---|---|---|---|---|---|---|---|
セパレーター | 子機に接続したI2Cデバイス | 簡単アプリI2Cコマンド | 任意の数値 | I2Cデバイスへ書込 | I2Cアドレス | I2Cレジスタ | 書き込みデータ長 | データ列 | チェックサム |
:788901010100FC
と帰ってきたらOKです。
タッチ値の読み出し
MTCH6102には、RX0~RX14の15本のピンがあります。レジスタアドレス0x80-0x8E を読み込んで、ピンごとのRAW値を読み込むことができます。
nüno ではこのうち 8 本を使っていますが、旧モジュールでは RX0~RX7、nüno 2 モジュールでは RX2~RX9 の割当になっています。
RX0 の読み出し
以下はレジスタアドレス0x80を読み込んで、RX0 を読んだ例です。
:78880104258001X
: | 78 | 88 | 01 | 04 | 25 | 80 | 01 | X |
---|---|---|---|---|---|---|---|---|
セパレーター | 子機に接続したI2Cデバイス | 簡単アプリI2Cコマンド | 任意の数値 | I2Cデバイスから書込&読出 | I2Cアドレス | I2Cレジスタ | 読み込みデータ長 | チェックサム省略 |
結果
タッチしていない状態
:78890104010100F8
タッチした状態
:7889010401011BDD
取得できました
多チャンネルの値を連続で読み出し
上記のやりかたをチャンネルごとにアドレスを変えて、読み込みすることでRX0~RX9の値を読み出しできますが、約1秒ごとしか子機からの信号が親機に伝わらないので10チャンネルの転送には約10秒かかります。
もっと効率的なやり方として、以下のようにデータ長を指定すると連続したレジスタアドレス分のデータが取得できます。
:7888010425800AX
布電極の端から2つ目のところを手で持ったうえで帰ってきたデータは以下のとおりです。RX8、すなわちレジスタアドレス 0x88 に該当するところが反応しています。
:78890104010A0000000000000282FE006D