2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

導電布タッチセンサーモジュール nüno ver.2 を有線で使ってみる

Posted at

導電布タッチセンサーモジュールnüno ver.2

image.png

nüno とは

オープンソースの導電布タッチセンサーモジュールです。

image.png
2018 年にリリースした Ver.1 は、GROVE 端子で様々な電子工作につながって使用することができました。

nüno ver.2

2020年に nüno ver.2 をリリースしました。
IMG_20201113_184111402.jpg
本体基板比較 左側:Ver.1 右側:Ver.2
(写真は双方共試作バージョンの基板です)

ver.1 はタッチセンサーコントローラーのみ搭載していて、外部からのマイコンなどで受信や制御などをすることが必要でした。
それに対し、Ver.2 は無線マイコンとして TWELITE を搭載し、タッチセンサー情報を無線で送信することができます。

IMG_20201113_135129565.jpg

また、ボタン電池で駆動することができます。ボタン電池で駆動するファームウェアは未完成ですが、駆動時間として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 モジュールにはんだづけします。その場合、電池面が上になります。有線で接続する場合は電池は使用しません。

IMG_20201113_135152465.jpg

I2C コネクタは2箇所ありますが、こちらに取り付けます。

IMG_20201113_135402535.jpg

次に、モジュール搭載の無線マイコンの機能を停止するために、リセット信号をONにします。ピンをこの位置にはんだづけします。

IMG_20201113_190647051.jpg

ジャンパーブロックでショートすると、無線マイコンが停止します。

IMG_20201113_190710628.jpg

外部マイコンに接続

GROVEコネクタにケーブルをつなげ、外部のマイコンの I2C バスに接続します。

IMG_20201113_194606406.jpg

今回は ESP32 の GND/3.3V/21/22 に直接接続しました。
21/22 は ESP32 の標準の I2C の SDA と SCLになります。

作例ではESP32 モジュールとして WEMOS LOLIN32 を使っています。

I2C バスは 3.3V で動かす必要があります。Arduino UNO などの 5V 系のマイコンに接続する場合は、レベル変換して接続してください。

導電性布用のホックをつないでテストしてみましょう。

IMG_20201113_193938122.jpg

動作テスト

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 をスケッチと同じ場所に保存します。

実行します。

シリアルモニターで確認すると、数字が出てきて何かよくわかりませんが・・・

image.png

シリアルプロッタで確認すると、グラフで表示されるようになります。

image.png

最初のうちはいくつかのチャンネルが飽和してしまってますが・・・

image.png

しばらくすると落ち着きます。落ち着かない場合は布モジュールの近くに導電性のものがある場合は離してください。水分を含んでいるものなども導電性のものになります。

image.png

スワイプしたときの動作です。

クッションにつなげてみる

布モジュールを取り付けたクッションに、モジュールをつなげてみます。

image.png

写真のモジュールケースは試作品ですが、安全ピンで布に着けるようになっています。

IMG_20201113_153813584.jpg

外部マイコンモジュールにつなげてみます。ESP32 で何かアクションをするようにプログラムしておいて、

IMG_20201113_153914868.jpg

モバイルバッテリといっしょに内部に収めてしまいましょう。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?