押しボタン式からタッチセンサーへ
現在、方言を話すおしゃべり猫型ロボット「ミーア」を開発中。
ミーアは、今はタクトスイッチによる押しボタン式だが、今回はこれをタッチ式に切り替えてみようと思う。
アプリ側で性格別・方言別にミーアちゃんが話をするフレーズを選択することができ、選択したフレーズのmp3ファイルを再生できる。そのフレーズを、ボタンを押すことで、ランダムに切り替えることが現在はできる。同時に目の表情(LCDディスプレイ)も変化する。
当初は、タクトスイッチに、3Dプリンターで作成したボタンを被せて、押しやすい大きいボタン式にして、猫の頭に設置しようかと思ったが、猫ちゃんなので、ボタン式よりタッチ式で頭を撫でると目の表情とフレーズが切り替わる方が自然かなとも思い、検証することにした。
タッチセンサーモジュールTTP223
タッチセンサーモジュールを調べたところ、専用のドライバICを搭載した、静電容量式のタッチセンサー基板のTTP223に行き着いた。 指によるタッチ入力状態を1ビットのON/OFF信号として取得できるとのこと。
Amazonでこちらの6個入りを購入。翌日に届いた。
届いたセンサー基盤は、想像以上に小さかった(縦1.5cm×横1cmくらい)。これだと、猫の頭を撫でるというよりは、人差し指で触れるという感じか。タクトスイッチと比較しても大きさそんなに変わらない。
■製品仕様
入力電圧 : 2.5V-5.5V
出力チャンネル: 1チャンネル (タッチ状態を示すデジタル信号)
消費電力 : 0.1mW
動作温度 : -20℃〜70℃
本体寸法 : 10.5×14.5×2mm(約)(突起部含まず)
静電容量方式タッチセンサーの仕組み(自己容量方式)
- タッチ動作(検出電極に対する指などの接近)を静電容量の変化として検出する方式
- 人間の体は水分を含んでいるため、導電性を持っている。タッチセンサーの電極に指(導体)が近づくと、電極と指の間で静電容量が発生し、見かけ上の静電容量が大きくなる(Cs+Cf)。
- 指が離れている時の基準値から一定の値を加算した値を閾値として設定しておき、閾値を超えたらスイッチON、以下の時をスイッチOFFとする
TTP223の詳細
データシートはこちら
TTP223の回路図は下記。
TTP223のピン
- AHLB(Active High/Low Bistable):「Active High」はタッチされているときに高い電圧出力を、「Active Low」は低い電圧出力を提供
- TOG(Toggle):タッチするたびにON・OFFが切り替わる。いわゆるトグルスイッチ
- Q:センサーの結果を出力するピン。マイコンのGPIOに繋ぐ。
基盤の真ん中にA, Bという2つの文字と、それぞれ左に2つのハンダがあるが、これをショートするか否かによって、下記2×2=4パターンの動作タイプを作り出すことができる。
Type | AHLB(A) | TOG(B) | 動作・機能 |
---|---|---|---|
1 | 0 | 0 | Direct Mode タッチされたらHIGHを出力(これがデフォルト)。 触れているときだけON(常態OFF) |
2 | 1 | 0 | Direct Mode Aのみ短絡(short)させる タッチされたらLOWを出力。触れているときだけOFF(常態ON) |
3 | 0 | 1 | Toggle Mode Bのみ短絡(short)させる 触れるたびにON/OFFが切り替わる(通電時OFF) |
4 | 1 | 1 | Toggle Mode ABどちらも短絡(short)させる 触れるたびにON/OFFが切り替わる(通電時ON) |
今回に関してはタイプ1のデフォルトを使用するので、正直、上記知識は関係ないのだが、気になったので調べてみた。
ちなみに、A,Bを短絡させようと試みたが、全然ハンダが載らなくて調べてみたら、似たように困っている人の記事を発見。ランドが小さいためはんだの表面張力が利かず、はんだでブリッジするのがめちゃくちゃ難しいとのこと。
ESP32とTTP223を配線
余談だが、ESP32は静電容量式のタッチセンサーを10個内蔵しているので、GPIOピンを触れたり、GPIOピンをジャンパー線で繋いで、リード線を触れるだけでタッチを検知することができる。
ただ、今回は、TTP223を使用。
3つのピンがあるので、まずはリード線をはんだ付けする
- GND:ESP32のGNDに接続
- I/O:ESP32のGPIOピンに接続。今回はGPIO27に接続する
- VCC:ESP32の3.3Vに接続。2.5V-5.5Vまで入力可能
最初はL字ピンヘッダーでハンダを考えたが、タッチセンサーの表面はフラットなままにしたかったので、ワイヤー線に変更。
GNDとVCCの線の色を逆で配線してしまったorz。ハンダ下手くそなのと、ワイヤー線短すぎたかなと反省。タッチセンサーの表面はフラットを維持できたのは良かった。
とりあえず、センサーのGNDとVCCをESP32のGNDと3.3Vに繋いで、電源が供給されたら、指をタッチセンサーにかざすと、touch sensor indicationであるLEDライトが点灯するか否かを確認
センサー範囲5mmまでと記載あったけど、間に3DプリンターのFDMフィラメント入れても反応したの感動した。
ESP32コード
今回は、コードを変更せずにそのまま動作させることができた。
もし、タッチ検出をシリアルコードに出力させるようなコードを書く場合は、下記のようになるだろう。
// Include the required libraries
#include <Arduino.h>
// Define the pin connected to the TTP223 module
const int touchPin = 14; // Replace with the actual GPIO pin number
void setup() {
// Initialize Serial communication for debugging
Serial.begin(115200);
// Set the touchPin as an input
pinMode(touchPin, INPUT);
}
void loop() {
// Read the state of the touch sensor
int touchState = digitalRead(touchPin);
// Check if the touch sensor is touched
if (touchState == HIGH) {
Serial.println("Touch detected!");
// Do something when the sensor is touched
}
// Add a small delay to avoid rapid readings
delay(100);
}
pinModeはINPUTのみで良いのか?
TTP223に切り替える前はタクトスイッチで検証していたので、EP32の内部プルアップ機能を使って、pinModeをINPUT_PULLUPにしていた。pinModeをINPUTにしていると、スイッチが押されたいない状態では、ESP32の入力ピンに何もつながってないフローティング(浮いている)状態となる。
ESP32の入力端子は内部抵抗が高いために、浮いている状態では電位が不安定となる=Input端子のHIGH・LOWが決まらず、ノイズなどによりHIGHになったり、LOWになったりして、スイッチ押していないのに動作が不安定になってしまう。
最初、何も考えずにTTP223の場合でも、piModeをINPUT_PULLUPにすれば良いだろうと思い、コード変更しなかったところ、タッチセンサーがこちらが期待する動作(タッチするとLOW、タッチしない状態でHIGH)と逆(タッチするとHIGH、タッチしない状態でLOW)になっていた。
pinModeをINPUTに変更しても同じ結果に。
ここで、タッチセンサーはタクトスイッチと電子回路が異なるから、プルアップ抵抗でのactive LOW HIGH制御ではなく、代わりにA短絡で制御なのか?と思うように。
結果としては、タッチセンサーはタクトスイッチの物理センサーとは全く異なる方式・電子回路で動いているので、フローティング状態を考慮する必要なく、pinModeをINPUTにして、ON/OFFを安定的に切り替えられることがわかった。というわけで、元のタクトスイッチでのコードをpinmode INPUTに合わせるように変更してタッチセンサーで試してみたら、正常動作になった。
3Dプリンターでタッチセンサーを被せてみて検証
次に検証すべきは、このタッチセンサーを下図のように、猫ちゃんの頭に持っていき、上を同じ3Dプリンターではめこんで外観を作成して、タッチセンサーを起動できるか(起動はできると思うが、UXとして自然かどうか)
そして、下記のようにタッチセンサーを格納する小箱を用意して、猫ちゃんの頭も被せて実験してみた。少しわかりにくいが、3Dプリンターの上から押しても、しっかり反応してLEDが赤く点灯した。
LEDを光らせなくすることはできるのか?
これで、タッチセンサーが正常動作することは確認できたが、タッチ時にLEDの赤色光が、特に白色筐体の場合は、筐体から透けて見えてしまい、ロボット感が出てしまうので、タッチ感知はしつつもLEDは光らないようにしたい。
ソフトウェアによる制御ができれば一番なのだが、タッチ検出後にPlatformIOのプログラムを使用して、タッチが検出された際に何をするかをプログラムすることは可能だが、ただし、LED自体のオン/オフを制御する直接的な方法は提供されていないため、このアプローチは適用できなさそう。
というわけで、ハードウェアによる制御をするしかなさそう。具体的には
・LED を物理的にモジュールから取り除く
・LEDの電源線をカットする
・LEDを光っているのが外側から見えないように覆う。
など。
もう一度、回路図を見てみる。LEDは単なる出力状態の視覚的表示であるため、LEDを取り除いてもTTP223のタッチ検出機能には影響を与えない。
というわけで、ものは試しということで、ニッパーでLED部分を取り外してみた。
取り外した結果が下図右。LEDは基板右下の白色の部分で、左図では見えているが、右図では取り外されている。
このタッチセンサーをESP32の自作基盤に装着。
この場合も、タッチセンサーに触れると、無事目のディスプレイが変化し、音声が再生された。
実際の運用では、TTP223を基板に取り付けるためにピンヘッダーとのハンダも必要なので、その時に合わせてLED部分を取り外すというやり方で良さそう。
めでたしめでたし♪
タッチセンサーを活かして、頭を何回か連続で撫でると、最初はデレデレだったのが段階的に嫌がって最後は反応しなくなるという、生き物っぽいプログラムを組んだ記事はこちら。
コメント