ESP32-WROOM-32Eのホールセンサーとタッチセンサーの使い方

組み込みエンジニア

こんにちは、ENGかぴです。

ESP32-WROOM-32Eは磁気に反応するホールセンサーと指で触れた時に反応するタッチセンサーが搭載されています。ESP32のライブラリに組み込まれているためAPIによる関数を呼び出すとセンサー値を取得することができます。ホールセンサーとタッチセンサーの使い方をまとめました。

ESP32-WROOM-32Eの開発環境はArduino IDEを使用しています。またESP32-WROOM-32E開発ボード(秋月電子)を使用しています。

ホールセンサーとタッチセンサーの情報を取得する

ESP32-WROOM-32Eに搭載されているホールセンサーとタッチセンサーについて原理と使い方について説明します。

ホールセンサーの使い方

ホールセンサーは磁界の流れと電流の向きによって起電力が発生するホール効果による電圧の変化を検出するセンサーです。EPS32-WROOM-32Eの金属モールドに磁石を当てるだけでセンサーとして動作します。

#define HALL_SENSOR_S 100
#define HALL_SENSOR_N -100

int16_t HallSns;

void loop() {

  HallSns = hallRead(); //ホールセンサーの値を取得

  if( HallSns >= HALL_SENSOR_S ){
    //S極が近づいて閾値以上となった時の処理 
  }
  else if( HallSns <= HALL_SENSOR_N ){
    //N極が近づいて閾値以下となった時の処理    
  }
  else{
    //上記以外の処理
  }
}

ホールセンサーは特にライブラリをインクルードする必要はありません。hallRead()を使用するとホールセンサーの値を取得することができます。

S極が近づくとプラス方向に大きくなりN極が近づくとマイナス方向に大きくなります。

冒頭の写真の磁石を直に接触させた場合のホールセンサーの最大値はS極で+140付近となりN極で-110でした。閾値は任意ですが磁石の大きさや金属モールドへの当て方によって値が変わるため閾値を+100及び-100にしています。

タッチセンサーの使い方

ESP32-WROOM-32Eは静電容量式のタッチセンサーの機能があります。静電容量式のタッチセンサーは人間のを導体とみなしたとき人間の手が触れた時の静電容量の変化を検出するものです。

人間はインピーダンスをもつ導体とみなすことができるため指で触れた時の僅かな静電容量を検出することができます。

人間が触れた時の静電容量の変化を検出するため手に汗をかいていた場合などで感度が変化してしまいます。静電容量は電気を貯める能力なのでゴム製の手袋やプラスチックなど電気を通さないものは検出できません。

GPIOの一部のピンがタッチセンサーに対応しています。タッチセンサーは全部で10つ実装されています。

タッチセンサーの種別GPIOの番号
T04
T10
T22
T315
T413
T512
T614
T727
T833
T932
タッチセンサーのとGPIOのピンの関係

GPIOピンとして使用しない場合はGPIOポートがオープンとなりタッチセンサー機能となります。

#define TOUCH_SENSOR 20

int16_t TouchSns;

void loop() {
  TouchSns = touchRead(T2); //T2の値をリードする
  if( TouchSns <= TOUCH_SENSOR ){
    //タッチセンサーがONしたときの処理
  }
  else{
    //タッチセンサーがOFFしたときの処理 
  }
}

タッチセンサーは特にライブラリをインクルードする必要はありません。touchRead()を使用するとタッチセンサーの値を取得することができます。引数にT0~T9を指定します。

タッチセンサーは対象物に触れると0に近づいていくことから閾値以下の値となった時タッチセンサーがONしたと判断して使用します。

ジャンパーワイヤーをT2ピンに挿入した状態でオープンの状態の時タッチセンサーが50付近の値であり指で一秒ほど触れた時の値が20付近であったため例では閾値を20にしています。

動作確認

ホールセンサー/タッチセンサーの動作確認の回路図
ホールセンサー/タッチセンサーの動作確認の回路図

ESP32-WROOM-32EとSHT35-DISの配線例を示しています。回路図の番号はESP32-WROOM-32Eの左上を1ピンとした時反時計回りにピンを数えた場合の番号としています。ピン番号横の()内の番号はシルク印刷されているピンの名称です。

ホールセンサーは2色マルチカラーLEDで色の切り替えで動作確認を行います。S極を近づけると緑色が点灯、N極を近づけると赤色が点灯するようにします。磁石を近づけて閾値を超えるとLED1が点灯し閾値が下回るとLED1を消灯します。

タッチセンサーは指で触れて閾値以下になった時にLED2を点灯します。閾値を上回るとLED2を消灯します。

動作結果(ホールセンサー)
動作結果(ホールセンサー)

ホールセンサーの値をシリアルモニタで確認しました。S極を近づけて金属モールドに接触されると140付近の値となっています。またN極を近づけて金属モールドに接触されると-110付近の値になっていました。同時にLED1がS極を接触された場合に緑色となりN極を接触させた場合に赤色になることを確認しています。

動作結果(タッチセンサー)
動作結果(タッチセンサー)

タッチセンサーの値をシリアルモニタで確認しました。指で配線に触れると10以下の値になりLED2が点灯することを確認しました。試しにプラスチックを配線に触れさせましたがタッチセンサーが反応しませんでした。

ソースコード全体

以下のソースコードはコンパイルして動作確認をしております。チェックはしておりますがコメントなど細かな部分で間違っている可能性があります。参考としてお使いいただければと思います。

#define TIME_UP 0
#define TIME_OFF -1
#define BASE_CNT 10 //ベースタイマカウント値
#define HALL_MAX 20
#define PIN_DO_LED_RED 19
#define PIN_DO_LED_GRN 18
#define PIN_DO_LED_YEL 32
#define HALL_SENSOR_S 100
#define HALL_SENSOR_N -100
#define TOUCH_SENSOR 20
/* 変数宣言 */
uint32_t beforetimCnt = millis();
int16_t HallSns;
int16_t TouchSns;
int16_t timSns = TIME_OFF;
/* プロトタイプ宣言 */
void mainTimer(void);

void setup() {

  Serial.begin(115200);
  pinMode(PIN_DO_LED_RED,OUTPUT);
  pinMode(PIN_DO_LED_GRN,OUTPUT);
  pinMode(PIN_DO_LED_YEL,OUTPUT);
  timSns = TIME_UP;
}

void loop() {

  mainTimer();

  if( timSns == TIME_UP){
    timSns = HALL_MAX;
    HallSns = hallRead(); //ホールセンサーの値を取得
    TouchSns = touchRead(T2);

    if( HallSns >= HALL_SENSOR_S ){
      digitalWrite(PIN_DO_LED_GRN,HIGH);
      digitalWrite(PIN_DO_LED_RED,LOW);
    }
    else if( HallSns <= HALL_SENSOR_N ){
      digitalWrite(PIN_DO_LED_GRN,LOW);
      digitalWrite(PIN_DO_LED_RED,HIGH);      
    }
    else{
      digitalWrite(PIN_DO_LED_GRN,LOW);
      digitalWrite(PIN_DO_LED_RED,LOW);   
    }

    if( TouchSns <= TOUCH_SENSOR ){
      digitalWrite(PIN_DO_LED_YEL,HIGH);
    }
    else{
      digitalWrite(PIN_DO_LED_YEL,LOW);
    }

    Serial.print("Hall Sensor Value: ");
    Serial.print(HallSns);
    Serial.print(" ");
    Serial.print("Touch Sensor Value: ");
    Serial.print(TouchSns);
    Serial.println();
  }
}
/* タイマ管理 */
void mainTimer(void){

  if ( millis() - beforetimCnt > BASE_CNT ){
    beforetimCnt = millis();
    if( timSns > TIME_UP){
      --timSns;
    }
  }
}

関連リンク

Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。

Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方

Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方

ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方

テックジム-将来のためにプログラミングを学ぶ

最後まで、読んでいただきありがとうございました。

タイトルとURLをコピーしました