導電布タッチセンサーモジュールnüno ver.2
nüno とは
オープンソースの導電布タッチセンサーモジュールです。
2018 年にリリースした Ver.1 は、GROVE 端子で様々な電子工作につながって使用することができました。
nüno ver.2
2020年に nüno ver.2 をリリースしました。
本体基板比較 左側:Ver.1 右側:Ver.2
(写真は双方共試作バージョンの基板です)
ver.1 はタッチセンサーコントローラーのみ搭載していて、外部からのマイコンなどで受信や制御などをすることが必要でした。
それに対し、Ver.2 は無線マイコンとして TWELITE を搭載し、タッチセンサー情報を無線で送信することができます。
また、ボタン電池で駆動することができます。ボタン電池で駆動するファームウェアは未完成ですが、駆動時間として2週間を目標に開発中です。
無線で使用するには
nüno ver.2 の無線規格は IEEE802.15.4 をベースとした mono-wiress の TOCONET プロトコルを nüno 用に拡張し、 nuno2 プロトコルとしたものです。
無線で使用する場合は nuno2 プロトコルを使用してタッチ情報を取得する必要があります。そのやりかたは後日公開します。
有線で使ってみる
はんだづけ
nüno ver.2 は無線を使わず、有線での使用も可能となっています。有線の場合は nüno ver.1 と同じように使用できます。今回は、そのやり方を解説します。
まず、GROVE端子を nüno ver.2 モジュールにはんだづけします。その場合、電池面が上になります。有線で接続する場合は電池は使用しません。
I2C コネクタは2箇所ありますが、こちらに取り付けます。
次に、モジュール搭載の無線マイコンの機能を停止するために、リセット信号をONにします。ピンをこの位置にはんだづけします。
ジャンパーブロックでショートすると、無線マイコンが停止します。
外部マイコンに接続
GROVEコネクタにケーブルをつなげ、外部のマイコンの I2C バスに接続します。
今回は ESP32 の GND/3.3V/21/22 に直接接続しました。
21/22 は ESP32 の標準の I2C の SDA と SCLになります。
作例ではESP32 モジュールとして WEMOS LOLIN32 を使っています。
I2C バスは 3.3V で動かす必要があります。Arduino UNO などの 5V 系のマイコンに接続する場合は、レベル変換して接続してください。
導電性布用のホックをつないでテストしてみましょう。
動作テスト
Arduino(+ESP32)の開発環境を使います。
サンプルスケッチは以下のとおりです。
#include <Wire.h>
#define ADDR 0x25
// read register
unsigned char readRegister(unsigned char addr_reg) {
byte error;
Wire.beginTransmission(ADDR);
Wire.write(addr_reg); // register to read
error = Wire.endTransmission();
// Serial.print(millis());
//Serial.print(" end transmit: ");
// Serial.println(error,HEX);
Wire.requestFrom(ADDR, 1); // read a byte
while (Wire.available()) {
return Wire.read();
}
}
// write data to register
unsigned char writeRegister(unsigned char addr_reg, unsigned char dta) {
Wire.beginTransmission(ADDR);
Wire.write(addr_reg); // register to read
Wire.write(dta);
Wire.endTransmission();
}
void setup() {
byte data;
//I2c.begin();
// pin (21 SDA ,22 SCL)
// pinMode(21, INPUT_PULLUP);
// Wire.setClock(1000000);
Wire.begin();
Serial.begin(115200);
delay(500);
// the operating mode (MODE)
data = readRegister(0x05);
Serial.print("MODE: ");
Serial.println(data,BIN);
// Set mode to Touch only
writeRegister(0x05, 0x02);
data = readRegister(0x05);
Serial.print("MODE: ");
Serial.println(data,BIN);
data = readRegister(0x20);
Serial.print("NUMBEROFXCHANNELS: ");
Serial.println(data);
data = readRegister(0x21);
Serial.print("NUMBEROFYCHANNELS: ");
Serial.println(data);
writeRegister(0x20, 0x07);
writeRegister(0x21, 0x06);
data = readRegister(0x20);
Serial.print("NUMBEROFXCHANNELS: ");
Serial.println(data);
data = readRegister(0x21);
Serial.print("NUMBEROFYCHANNELS: ");
Serial.println(data);
}
void loop() {
byte data;
/*
// TOUCHSTATE
data = readRegister(0x10);
Serial.print("TOUCHSTATE: ");
Serial.println(data,BIN);
data = readRegister(0x11);
Serial.print("TOUCHX: ");
Serial.println(data,BIN);
data = readRegister(0x12);
Serial.print("TOUCHY: ");
Serial.println(data,BIN);
// TOUCHLSB
data = readRegister(0x13);
Serial.print("TOUCHLSB: ");
Serial.println(data,BIN);
*/
// Serial.print("SENSORVALUE_RX <i>: ");
Serial.print(">");
for (byte i = 0x82; i < 0x8A; i++) {
data = readRegister(i);
//Serial.print(i, HEX);
//Serial.print(" = ");
Serial.print(data);
Serial.print(", ");
}
Serial.println();
/*
data = readRegister(0x80);
Serial.print("SENSORVALUE<RX0>: ");
Serial.println(data,BIN);
data = readRegister(0x8D);
Serial.print("SENSORVALUE<RX13>: ");
Serial.println(data,BIN);
data = readRegister(0x86);
Serial.print("SENSORVALUE<RX6>: ");
Serial.println(data,BIN);
*/
delay(100);
}
タッチセンサーICは Microchip 社の MTCH6102 です。 MTCH6102を動かすために、ライブラリとして、こちらを使いました。
https://github.com/theapi/touch_timer
このライブラリは GPLv3 のオープンソースです。
https://github.com/theapi/touch_timer/tree/master/arduino/mtch6102_proof_of_concept
こちらにある、MTCH6102.cpp と MTCH6102.h をスケッチと同じ場所に保存します。
実行します。
シリアルモニターで確認すると、数字が出てきて何かよくわかりませんが・・・
シリアルプロッタで確認すると、グラフで表示されるようになります。
最初のうちはいくつかのチャンネルが飽和してしまってますが・・・
しばらくすると落ち着きます。落ち着かない場合は布モジュールの近くに導電性のものがある場合は離してください。水分を含んでいるものなども導電性のものになります。
スワイプしたときの動作です。
クッションにつなげてみる
布モジュールを取り付けたクッションに、モジュールをつなげてみます。
写真のモジュールケースは試作品ですが、安全ピンで布に着けるようになっています。
外部マイコンモジュールにつなげてみます。ESP32 で何かアクションをするようにプログラムしておいて、
モバイルバッテリといっしょに内部に収めてしまいましょう。