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

その1 TWELITE DIP を ESP32につないでみる

先の実験「導電布タッチセンサーモジュール nüno ver.2 を無線で使ってみる」
https://qiita.com/nanbuwks/items/fc8811baebfff0a90b04

では、無線で転送されてきた nüno ver.2 の信号を USB シリアル経由で PCで受けました。
今回はPCではなく、ESP32で受けてみます。

環境

  • ESP32モジュールとして、 WEMOS LOLIN32
  • Arduino開発環境として、ポータブル化した arduino 1.8.13 + arduino-esp32 1.0.4
  • nüno 信号受信モジュールとして、TWE-Lite-DIP-PCB
  • インターフェース基板として、nüno gateway (実験2 で使用)

シリアル信号を、arduino-esp32 の UART で受けることにして処理、別の UART で処理したデータを出力します。

ESP32 では UART がハードウェア的に U0,U1,U2 の 3 つが使えます。
arduino-esp32では、U0 が Serial オブジェクトとしてプログラムやシリアルプロッタに使われています。
U2 は Serial2 オブジェクトとして使え、デフォルトでは以下のように割り当てられています。

  • ESP32 の 17が Serial2 の TX
  • ESP32 の 16が Serial2 の RX

実験1 TWE-Lite-DIP-PCBを直に接続

配線

受信側の TWELITE DIPは親機に設定するために、GPIO10番をGNDに落とします。(写真、黄色のジャンパー)

これを含め、以下のように配線します。

信号名TWE-Lite-DIP-PCB シルク表記接続先用途
VCCVCC3.3Vに接続電源供給用
GNDGNDGNDに接続電源供給用
RXRXESP32 17(Serial2 TX)に接続ESP32からの送信用
TXTXESP32 16(Serial2 RX)に接続ESP32への受信用
M110GNDに接続親機モード設定用
AI41VCCに接続ノイズによる余計な信号発生を抑制
AI3A2VCCに接続ノイズによる余計な信号発生を抑制
AI20VCCに接続ノイズによる余計な信号発生を抑制
AI1A1VCCに接続ノイズによる余計な信号発生を抑制
IMG_20201201_042319910.jpg

プログラム

char str[100];

// for timer
hw_timer_t *timer1 = NULL; 
volatile SemaphoreHandle_t timerSemaphore;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

// timer
void IRAM_ATTR onTimer1(){

  portENTER_CRITICAL_ISR(&timerMux);
  portEXIT_CRITICAL_ISR(&timerMux);
  xSemaphoreGiveFromISR(timerSemaphore, NULL);
}

void TimerWork()
{

  Serial2.println(":7888010425800AX");
 // Serial.println("timer!");
}


int hexchartohex(char c0, char c1){
  char buf[3];
  buf[0]=c0;
  buf[1]=c1;
  buf[2]=0;
  return (strtol(buf, NULL, 16));
}

void setup() {
 Serial.begin(115200);
 Serial2.begin(115200);
 delay(1000);
 Serial2.println(":7888010125050102X");

// for timer
 timerSemaphore = xSemaphoreCreateBinary();
 timer1 = timerBegin(0, 80, true);
 timerAttachInterrupt(timer1, &onTimer1, true);
 timerAlarmWrite(timer1, 1000000, true);
 timerAlarmEnable(timer1);
}

void loop() {
  static int i=0;
  while (1){
    // for timer
    if (xSemaphoreTake(timerSemaphore, 0) == pdTRUE){
      portENTER_CRITICAL(&timerMux);
      portEXIT_CRITICAL(&timerMux);
      TimerWork();
    }
    if (Serial2.available()) {
      int inByte = Serial2.read();
//    Serial.println(inByte);  
//    Serial2.println(inByte);
      if (13 == inByte )
         continue;
      if (10 == inByte )
         break;
      str[i++] = inByte;
      if (100 == i )
         break;        
    }
    delay(1);
  }
  str[i]=0;
  i=0;
  if ( ':' == str[0] && '7' == str[1] && '8' == str[2] && '8' == str[3] && '9' == str[4] )
  {    for ( int i=0; i<10; i++)
    {
        Serial.print(hexchartohex(str[i*2+13],str[i*2+14]));
        Serial.print(",");
    }
    Serial.println();
  }
}

取得結果です。

image.png

シリアルプロッタの出力です。

image.png

実験2 nüno gateway を使って ESP32 に接続

先の TWELITE DIP の配線はめんどくさいですね。
nüno gateway を使って、配線なくても簡単に接続できるようにしました。

nüno gateway

IMG_20201126_191033624.jpg

必要な配線済みです。

IMG_20201126_191022812.jpg

Groveケーブルを使って外部に接続ができます。GROVE UART に接続してください。
https://wiki.seeedstudio.com/Grove_System/#grove-uart

IMG_20201126_191013441.jpg

TWE-LITE-DIPはこのの向きにセットします。

ESP32にこのように接続しました。

IMG_20201201_091132489.jpg
pinESP32側信号作例接続ケーブル色(SeeedStudio版)
pin1RXESP32 16(Serial2 RX)に接続
pin2TXESP32 17(Serial2 TX)に接続
pin33.3V3.3V
pin4GNDGND

ケーブル色はM5Stack用のケーブルなどでは黄色と白が逆なので注意!

これで、実験1と同じようにデータを取得できます