知覚のひとつとして「触感」を搭載しました。触感を検出することより外部から操作を行うことができます。
◀ この記事の前に: 複数のMCUをつなぐ
▶ この記事の次に:
センサの概要
タッチセンサは、ESP32の静電容量式タッチ検出を使用しています。ESP32の対応するピン(ポート)の用途を「タッチ検出」にすることにより、他の外部部品を必要としないでタッチセンサを追加することができます。
タッチセンサの特徴
タッチセンサの特徴は以下のとおりです。
- 高感度: 非接触や軽い接触でも反応するため、タッチや近接入力として利用可能
- しきい値を設定可能: タッチ入力とみなす静電容量の変化量(しきい値)を自由に設定可能
- 自動校正機能: 環境条件(湿度や温度)の変化に合わせて、自動的にベースラインを調整可能
- 組み込みサポート: ファームウェアレベルで直接サポートされており、簡単に使用可能
注意点は以下のとおりです。
- ノイズの影響: 電源ノイズや環境ノイズによって誤検出が発生する場合がある
- 周囲条件の変化: 湿度や温度によって静電容量が変化するため、定期的な校正が必要
- 電極の設計: 電極サイズや形状が検出感度に影響( 大きい電極は感度が高くなり、小さい電極は局所的な検出が可能 )
ポートの割り当て
タッチセンサは ESP32( Peripheral MCU )の以下のピンに設定しています。
- TOUCH1: IO2( P-BOOT / ESP2の起動モード選択と兼用 )
- TOUCH2: IO0( WAKEUP-B / Body MCUのウエイクアップ信号と兼用 )
IO2は ESP32の起動時に動作モードを決定するピンのひとつです。タッチセンサは起動後に使用するため共用することができます。IO0は省電力制御のひとつである、Body MCUのスリープからの復帰(ウエイクアップ)を行う信号線です。動作目的により使い分けます。( タッチセンサ使用時は入力、ウエイクアップ信号線として使用時は出力になります。 )
使用例( プログラム )
タッチセンサに関するコードは以下のとおりです。
基本的な設定(Arduino IDEの場合)
void setup() {
Serial.begin(115200);
// タッチセンサーのしきい値を設定
// test
/* test*/
touchAttachInterrupt(T0, onTouch, 40); // T0(GPIO4)のタッチ検出
}
void loop() {
// メインループは不要
}
// タッチイベントが検出されたときに呼ばれる関数
void onTouch() {
Serial.println("Touch detected!");
}
ESP-IDFの場合
#include "driver/touch_pad.h"
#include "esp_log.h"
#define TOUCH_THRESH_NO_USE (0) // タッチなしのしきい値
void app_main() {
touch_pad_init(); // タッチパッド初期化
touch_pad_config(TOUCH_PAD_NUM0, TOUCH_THRESH_NO_USE); // T0(GPIO4)を設定
while (1) {
uint16_t touch_value;
touch_pad_read(TOUCH_PAD_NUM0, &touch_value);
printf("Touch value: %d\n", touch_value);
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
Design Considerations タッチセンサの使用例
タッチセンサは2系統ありますので左右の判別に使用することができます。右肩と左肩にセンサを設置することにより、Qumcum Lab.の肩に触れることにより左右に旋回(歩行)させたり、右手や左手を上げたりすることができます。高度な使用例としては学習の結果入力(目的関数のフィードバック)にすることができます。
参考情報
参考になる情報は以下のとおりです。
このホームページ内
- 複数のMCUをつなぐ: このロボットには複数の MCUが搭載されています。その MCU間の接続の概要です。
他のWebサイト
- SN74LVC1G3157 SPDT アナログスイッチ Datasheet