部品 · 読了まで14分

ArduinoでTTP223タッチセンサーを使う:モード、配線、タッチランプ

TTP223静電容量式タッチセンサーの使い方。モーメンタリ/トグルを選ぶA・Bジャンパー、Arduinoのタッチランプ、プラスチック越しの検出、ESP32とPicoのコードを解説します。

TTP223タッチセンサーは、静電容量の変化で指を検出し、機械式の押しボタンの代わりになる、安価な1キーの静電容量式タッチモジュールです。ピンは3本(VCC、GND、I/O)だけで、触れると出力がHIGHになり、指を離すとLOWに戻ります。このシンプルさのおかげで、Arduinoではボタンと同じようにdigitalRead()で読み取れます。また2〜5.5 Vで動くので、ESP32やRaspberry Pi Picoにもそのまま接続できます。可動部がないので摩耗やクリック音がなく、薄いプラスチック、ガラス、木の層の裏に隠すこともできます。

このガイドでは、TTP223の内部で何が起きているか、ボード上のAとBのはんだジャンパーでモーメンタリ/トグルモードやアクティブHIGH/アクティブLOWの出力を選ぶ方法、短く触れるとオン・オフし長押しすると明るさが変わるArduinoタッチランプの作り方、パネル越しにセンサーを動かす方法、複数のキーの使い方、ESP32の内蔵タッチピンとの比較、MicroPythonを使ったPicoでの使い方を、ステップごとに学びます。

TTP223静電容量式タッチセンサーモジュール
TTP223タッチセンサーモジュール:1キーの静電容量式センサー、3本のピン(VCC、I/O、GND)、モード選択用のAとBのはんだジャンパー。

TTP223タッチセンサーとは?どのように動く?

モジュール上の銅パッドとボードのグラウンド(GND)部分は、数ピコファラッドの小さなコンデンサを形作っています。指がパッドに近づくと、体がこのコンデンサに加わり、全体の静電容量が数ピコファラッド増えます。TTP223内部の約1 MHzのセンサー用発振器はこの増加を周波数の変化としてとらえ、内部に保持している基準値と比べて、差が十分大きければ出力を切り替えます。ここでも平行平板コンデンサの式C = ε·A/dが当てはまります。パッドの面積(A)が大きいほど、また指とパッドの間の素材(d)が薄いほど、検出は強くなります。

チップは基準値を自分で決めます。電源を入れた瞬間から約0.5秒かけて周囲を測定し、その間のタッチは無視します。その後は誰も触れていない限り、約4秒ごとに自動で再キャリブレーションするので、温度や湿度のようなゆっくりした変化は時間とともに補正されます。このため、センサーは電源投入時にパッドのまわりにあるものを「触れていない状態」として扱います。電源が入るときに指がパッドに乗っていると、その指はまったく検出されません。

特徴値
チップTTP223-BA6(6ピンのSOT-23パッケージ)
電源電圧2.0〜5.5 V
チップの消費電流(3 V、LEDなし)標準1.5 µA、最大3 µA
応答時間低消費電力モードで最大約220 ms、高速モードで約60 ms
出力形式CMOS(プッシュプル)。HIGHレベルはVCCと同じ
出力電流(3 V時)ソース約4 mA、シンク8 mA
電源投入時のキャリブレーション約0.5秒(この間は触れない)
感度調整パッドとGNDの間に0〜50 pFのコンデンサ(Cs)
動作温度-20〜+70 °C
モジュールのピンVCC、I/O(SIGまたはOUT)、GND

これらのモジュールで使われているTTP223-BA6では、一部のオプションがパッケージ内部で固定されています。チップは常に低消費電力モードで動作し、ほかのパッケージにある100秒の「最大オン時間」制限は無効になっています。低消費電力モードではチップの消費電流はわずか数マイクロアンペアですが、最初のタッチに反応するまで最大約220 msかかることがあります。いったんタッチを検出すると、約12秒間は高速モードのままになり、続くタッチにはずっと速く反応します。ランプやドアチャイムではこの遅れに気づきませんが、素早い反応が必要なゲームコントローラーを作るなら覚えておきましょう。

TTP223のピン配置と配線

TTP223のピンArduino UnoESP32Raspberry Pi Pico
VCC5V3V33V3(OUT)(ピン36)
GNDGNDGNDGND(ピン38)
I/O(SIG)D2GPIO 26GP15(ピン20)
TTP223の出力はプッシュプルなので、HIGHレベルは電源電圧と同じになります。モジュールを5 Vで動かして出力をESP32やPicoにつなぐと、3.3 Vのピンに5 Vがかかり、ピンが壊れます。3.3 Vのボードでは、必ずモジュールを3V3ピンから給電してください。また、電源投入後の最初の0.5秒はパッドに触れないでください。触れていると、センサーが指を周囲の一部とみなしてしまいます。

出力ピンが信号を能動的にHIGHとLOWに駆動するので、Arduino側でINPUT_PULLUPや外付け抵抗は必要ありません。ピンをINPUTに設定するだけで十分です。チップはタッチが安定してから出力を切り替えるため、機械式ボタンのようなチャタリングもありません。それでも、1回のタッチを1つのイベントとして数えたいなら、Arduinoに押しボタンをつなぐ方法で説明しているエッジ検出のロジックを使いましょう。

AとBのはんだジャンパーでモードを選ぶ

モジュールのチップの横には、AとBと書かれた小さなはんだパッドが2組あります。これらはチップの2つのオプションピンにつながっています。ほとんどのモジュールでは、Aが出力をアクティブHIGHにするかアクティブLOWにするか(AHLB)を、Bがセンサーをモーメンタリモードで動かすかトグルモードで動かすか(TOG)を選びます。チップ内部でこれらのピンは抵抗を通してGNDに引かれているので、パッドが開放のときオプションは「0」です。2つのパッドをはんだでブリッジすると、オプションは「1」になります。ジャンパーを変えたら、いったん電源を切って入れ直すのが最も確実です。ボードの表記が違っていても、最初のテストスケッチのLEDで簡単にモードを確認できます。

ABモード触れたとき電源投入時の出力
開放開放モーメンタリ、アクティブHIGH(工場出荷時)触れている間HIGHLOW
ブリッジ開放モーメンタリ、アクティブLOW触れている間LOWHIGH
開放ブリッジトグル(ラッチ)、アクティブHIGH触れるたびに状態が反転LOW
ブリッジブリッジトグル(ラッチ)、アクティブLOW触れるたびに状態が反転HIGH
マイコンと組み合わせるなら、工場出荷時の設定(両方のパッドが開放)のままにして、オン・オフのロジックはソフトウェアで作りましょう。そうすれば、長押しやダブルタップのような動作も追加できます。トグルモードは、間にコードを挟まずにモジュールがトランジスタやLEDを直接切り替える回路で役立ちます。アクティブLOWモードは、INPUT_PULLUPで配線したボタンをセンサーに置き換えるときに便利です。コードはもともと押されたときにLOWを想定しているので、1行も変える必要がありません。間違ってブリッジしたジャンパーを開くには、はんだ吸い取り線を使います。コツははんだ付けのやり方で紹介しています。

Arduinoで最初のテスト:タッチを読み取る

  1. モジュールのVCCピンをArduinoの5Vピンに、GNDをGNDに、I/OピンをD2につなぎます。
  2. 下のスケッチを書き込み、シリアルモニタを9600 baudで開きます。
  3. ボードが起動したら、パッドに触れずに1秒ほど待ちます。この間にチップが自分でキャリブレーションします。
  4. 指でパッドに触れます。Arduinoの13番ピンの内蔵LED(ほとんどのモジュールではボード自身のLEDも)が点灯し、シリアルモニタのタッチ回数が1つ増えるはずです。
  5. LEDは指がパッドに乗っている間ずっと点灯したままですが、カウンターは新しいタッチごとに1回しか増えません。
C++ (Arduino IDE)
1const int TOUCH_PIN = 2;    // TTP223 I/O (SIG) pini / TTP223 I/O (SIG) pin
2const int LED_PIN = 13;     // Uno'nun dahili LED'i / Uno onboard LED
3
4bool lastState = false;
5unsigned long touchCount = 0;
6
7void setup() {
8  Serial.begin(9600);
9  pinMode(TOUCH_PIN, INPUT);   // çıkış push-pull, pull-up gerekmez / push-pull output, no pull-up needed
10  pinMode(LED_PIN, OUTPUT);
11  delay(600);                  // açılış kalibrasyonu bitsin (~0,5 s) / let power-on calibration finish (~0.5 s)
12}
13
14void loop() {
15  bool state = digitalRead(TOUCH_PIN) == HIGH;   // dokunurken true / true while touched
16  digitalWrite(LED_PIN, state ? HIGH : LOW);
17
18  if (state && !lastState) {   // LOW -> HIGH: yeni dokunuş / new touch
19    touchCount++;
20    Serial.print("Dokunus / Touch: ");
21    Serial.println(touchCount);
22  }
23  lastState = state;
24}

このコードで最も重要なのはエッジ検出です。前回の読み取り値はlastState変数に保存されます。新しい値がHIGHで前回の値がLOWなら、それが新しいタッチです。このチェックがないと、指がパッドに乗っている間、ループが回るたびにカウンターが増え、1秒間に何千回も数えてしまいます。setup()の600 msの待ち時間は、Arduinoとモジュールに同時に電源が入ったときに、チップのキャリブレーションが確実に終わっているようにするためのものです。D2を選んだのは、Unoの割り込みピンの1つだからです。必要なら、attachInterrupt(digitalPinToInterrupt(2), function, RISING)を使って割り込みでタッチをとらえることもできます。

プロジェクト:Arduinoタッチランプ

では、本物のタッチランプを作りましょう。短く触れるとランプがオン・オフし、点灯中にパッドに指を置き続けると明かりがゆっくり暗くなり、次に長押しすると再び明るくなります。明るさはPWMで設定するので、ランプはUnoのPWMピンの1つであるD9につなぎます。テストには、D9にLEDと220 Ωの抵抗をつなぐだけで十分です(正しい値はLED抵抗計算ツールで求められます)。12 VのLEDテープを使う場合は、IRLZ44NのようなロジックレベルMOSFETを間に入れます。詳しくはArduinoでMOSFETを使う方法をご覧ください。

C++ (Arduino IDE)
1const int TOUCH_PIN = 2;                // TTP223 I/O (fabrika ayarı: anlık, aktif yüksek) / factory default: momentary, active high
2const int LAMP_PIN = 9;                 // PWM pini: LED ya da MOSFET kapısı / PWM pin: LED or MOSFET gate
3const unsigned long LONG_PRESS = 600;   // uzun dokunuş eşiği (ms) / long-touch threshold (ms)
4
5bool lampOn = false;
6bool lastTouch = false;
7bool dimming = false;
8int brightness = 255;                   // son parlaklık (10-255) / last brightness (10-255)
9int step = 5;                           // kısma yönü ve adımı / dimming direction and step
10unsigned long touchStart = 0;
11unsigned long lastStep = 0;
12
13void setup() {
14  pinMode(TOUCH_PIN, INPUT);
15  pinMode(LAMP_PIN, OUTPUT);
16  delay(600);                           // TTP223 kalibrasyonu bitsin / let the TTP223 finish calibrating
17}
18
19void loop() {
20  bool touch = digitalRead(TOUCH_PIN) == HIGH;
21  unsigned long now = millis();
22
23  if (touch && !lastTouch) {            // dokunuş başladı / touch started
24    touchStart = now;
25    dimming = false;
26  }
27
28  if (touch && lampOn && now - touchStart > LONG_PRESS) {   // lamba açıkken uzun dokunuş / long touch while the lamp is on
29    if (!dimming) {
30      dimming = true;
31      step = -step;                     // her uzun dokunuşta yön değişir / direction flips on every long touch
32    }
33    if (now - lastStep >= 20) {         // 20 ms'de bir adım / one step every 20 ms
34      lastStep = now;
35      brightness += step;
36      if (brightness <= 10 || brightness >= 255) {
37        brightness = constrain(brightness, 10, 255);
38        step = -step;                   // uca gelince geri dön / bounce back at the ends
39      }
40      analogWrite(LAMP_PIN, brightness);
41    }
42  }
43
44  if (!touch && lastTouch && !dimming) {   // kısa dokunuş bitti: aç/kapa / short touch ended: toggle
45    lampOn = !lampOn;
46    analogWrite(LAMP_PIN, lampOn ? brightness : 0);
47  }
48
49  lastTouch = touch;
50}
コードの部分動作
touchStartタッチが始まった時刻をmillis()で記録する
LONG_PRESS = 600600 msより長いタッチを明るさ調整の指示とみなす
dimmingこのタッチ中に明るさ調整が行われたら立てるフラグ。指を離したときにランプが消えないようにする
step長押しのたびに符号が変わり、1回目は暗く、次は明るくなる
constrain(brightness, 10, 255)ランプが完全に暗くならない範囲に明るさを保つ
指を離したときに切り替え判定は指を離したときに行うので、短いタッチと長押しを区別できる

コードのどこにもdelay()がないことに注目してください。タイミングはすべてmillis()で処理しているので、ループは止まらずに回り続け、タッチを見逃しません。この手法についてはmillis()とdelay()で詳しく読めます。最後の明るさはbrightness変数に残るので、ランプを消してもう一度つけると、店で売っているタッチ式デスクライトと同じように、最後に設定した明るさで点灯します。

同じセンサーで商用電源のランプを制御することもできますが、できるのはオン・オフだけです。リレーモジュールはPWMで調光できないので、analogWriteではなくdigitalWriteを使います。商用電源の配線は閉じたケースの中に収め、TTP223のパッドを商用電源につながった金属面に貼ることは絶対にしないでください。パッドと商用電源の間には、必ず絶縁パネルが必要です。商用電源を扱った経験がない場合は、この部分を大人と一緒に作業してください。

薄い素材越しに検出する

TTP223の最も人気のある特長は、穴のない箱の中からでも動作できることです。プラスチック、アクリル、ガラス、木、紙、布は電界を通します。パッドと指の間の素材は、コンデンサの誘電体のように働きます。素材が厚くなると式のdが大きくなり、指とパッドの間の静電容量は小さくなります。厚さが2倍になると、その静電容量はおよそ半分になります。ガラスはほとんどのプラスチックより誘電率が高いので、同じ厚さならガラスのほうがたいてい良い結果になります。実際には、1〜3 mmのプラスチック、アクリル、ガラスのパネル越しなら、モジュールはたいてい問題なく動作します。それより厚いパネルではパッドを大きくする必要があり、必ず自分の素材でテストしてください。

  • 空気の隙間を作らない:空気の誘電率は1で、1 mmの隙間でも感度は大きく下がります。モジュールはパッド側をパネルに向け、薄い両面テープか接着剤でしっかり貼り付けてください。
  • パッドを大きくする:タッチ面を広くするには、銅テープやアルミホイルで電極を切り出し、パッドの角の保護膜を軽く削って、ごく短い線で電極をはんだ付けします。線が長いほど静電容量が加わり、センサーは不安定になります。
  • 金属を避ける:金属のパネル、金属を含む素材、メタリック塗料は電界を自分に集めてしまいます。その結果、センサーは何も検出しないか、勝手に反応します。
  • 感度が高すぎるなら下げる:指が近づく前にセンサーが反応する場合は、パッドとGNDの間に5〜20 pFの小さなセラミックコンデンサ(Cs)を追加します。値が大きいほど感度は下がり、上限は50 pFです。コンデンサの表記(例:100 = 10 pF、220 = 22 pF)は、コンデンサの表記ツールで読み解けます。
  • 先に取り付けてから電源を入れる:チップは電源投入時の周囲を基準にするので、パネルとふたを取り付けてから電源を入れてください。電源が入ったままパネルを取り付けると、チップがそれを触れっぱなしの状態とみなすことがあります。その場合は、いったん電源を切って入れ直すだけで直ります。

複数のタッチキーを使う

TTP223はそれぞれ自分のパッドを独立して監視します。キーを4つにしたいなら、4つのモジュールを4本の別々のデジタルピンにつなぎ、VCCとGNDは共通にします。キー同士がとても近いと、指が隣のパッドにも影響することがあります。パッドの間は少なくとも1〜2 cm空け、モジュールはモーターやリレーの配線から離してください。下のスケッチは、4つのTTP223とパッシブブザーで小さなタッチピアノを作ります。触れたキーの音が鳴り、指を離すと音が止まります。

C++ (Arduino IDE)
1const int TOUCH_PINS[] = {2, 3, 4, 5};          // dört TTP223 I/O pini / four TTP223 I/O pins
2const int NOTES[]      = {262, 294, 330, 349};  // Do, Re, Mi, Fa (Hz) / C4, D4, E4, F4 (Hz)
3const int KEY_COUNT    = 4;
4const int BUZZER_PIN   = 8;                     // pasif buzzer / passive buzzer
5
6int currentNote = 0;
7
8void setup() {
9  for (int i = 0; i < KEY_COUNT; i++) {
10    pinMode(TOUCH_PINS[i], INPUT);
11  }
12  pinMode(BUZZER_PIN, OUTPUT);
13  delay(600);                                   // sensörlerin kalibrasyonu / sensor calibration
14}
15
16void loop() {
17  int note = 0;
18  for (int i = 0; i < KEY_COUNT; i++) {
19    if (digitalRead(TOUCH_PINS[i]) == HIGH) {   // ilk dokunulan tuş çalar / the first touched key plays
20      note = NOTES[i];
21      break;
22    }
23  }
24  if (note != currentNote) {                    // yalnızca nota değişince güncelle / update only when the note changes
25    currentNote = note;
26    if (note > 0) tone(BUZZER_PIN, note);
27    else noTone(BUZZER_PIN);
28  }
29}

tone()は一度に1つの音しか鳴らせないので、コードは最初に触れられたキーを選び、音が変わったときだけ更新して、音がプツプツと途切れないようにしています。Unoではtone()がTimer2を使うため、ブザーが鳴っている間は3番と11番ピンでanalogWriteが使えません。ここではピアノがD3を入力としてしか使っていないので問題ありません。キーの数が増えてきたら、キーごとに1つのモジュールを使うより、マルチチャンネルのチップに切り替えるほうがすっきりします。TTP224は4つのキーと4つの独立した出力を持ち、TTP229は2線式のシリアルインターフェースで8キーまたは16キーを読み取り、MPR121はI2Cで12個の電極を監視します。

ESP32:TTP223と内蔵タッチピン、どちらを使う?

無印のESP32には静電容量式タッチセンサーが内蔵されていて、10本のピン(T0〜T9)をモジュールなしでタッチキーとして使えます。順にGPIO 4、0、2、15、13、12、14、27、33、32です。touchRead()関数は生の数値を返します。無印ESP32ではピンに触れるとこの数値が下がり、ESP32-S2とS3では上がります。ESP32-C3にはタッチセンサーがまったくありません。内蔵ピンについて詳しくはESP32のタッチピンをご覧ください。下の表で2つの方法を比べます。

特徴TTP223モジュールESP32の内蔵タッチ
追加部品必要(1モジュールにつき1キー)不要。ピンに線か銅パッドをつなぐだけでよい
出力デジタルのHIGH/LOWがそのまま得られる生の数値。しきい値は自分で決める
キャリブレーションチップが自動で行うコードで測定してしきい値を設定する
対応ボードすべて(Uno、Nano、ESP、Pico)ESP32、ESP32-S2、ESP32-S3のみ
キーの数モジュールの数だけESP32で10、S2とS3で14
ディープスリープからの復帰RTC GPIOでext0/ext1を使うtouchSleepWakeUpEnable()を使う
長い配線と湿度パッドがモジュール上にあるので安定配線が長くなると値がずれ、しきい値が機能しなくなる
C++ (Arduino IDE)
1const int TTP223_PIN = 26;   // TTP223 I/O, modül 3,3 V ile beslenir / module powered from 3.3 V
2const int TOUCH_GPIO = 4;    // dahili dokunmatik T0 / built-in touch pad T0
3const int LED_PIN = 2;       // çoğu DevKit'te dahili LED / onboard LED on most DevKits
4int threshold = 0;
5
6void setup() {
7  Serial.begin(115200);
8  pinMode(TTP223_PIN, INPUT);
9  pinMode(LED_PIN, OUTPUT);
10  delay(600);                                  // dokunmadan bekle / wait without touching
11  threshold = touchRead(TOUCH_GPIO) * 0.7;     // dokunulmamış değerin %70'i / 70% of the untouched value
12}
13
14void loop() {
15  int raw = touchRead(TOUCH_GPIO);             // klasik ESP32'de dokununca düşer / drops when touched on the classic ESP32
16  bool builtIn = raw < threshold;
17  bool module = digitalRead(TTP223_PIN) == HIGH;
18  digitalWrite(LED_PIN, (builtIn || module) ? HIGH : LOW);
19  Serial.printf("ham/raw: %d  esik/threshold: %d  T0: %d  TTP223: %d\n", raw, threshold, builtIn, module);
20  delay(100);
21}

このスケッチは起動時に触れていない状態のT0の値を測り、その70%をしきい値にします。シリアルモニタ(115200 baud)で生の値を見ながら、自分の配線に合わせて比率を調整してください。ESP32-S3を使う場合は触れると値が上がるので、比較を逆にします(たとえばthreshold = 測定値 × 1.3、raw > threshold)。TTP223をGPIO 26につないだもう1つの理由は、それがRTC GPIOだからです。esp_sleep_enable_ext0_wakeup(GPIO_NUM_26, 1)を使えば、ESP32をディープスリープにしてタッチで起こせます。TTP223の消費電流は数マイクロアンペアだけなので、この2つは電池駆動のプロジェクトにぴったりの組み合わせです。詳しくはESP32のディープスリープをご覧ください。

Raspberry Pi PicoでTTP223を使う(MicroPython)

PicoのRP2040チップにはタッチセンサーがないので、TTP223はPicoにタッチキーを追加する最も簡単な方法です。モジュールは3V3(OUT)ピン(物理ピン36)から給電し、I/OピンをGP15(物理ピン20)につなぎます。下のMicroPythonコードは、タッチするたびにボードの内蔵LEDを切り替えます。割り込み(IRQ)でタッチをとらえるので、メインループがほかの処理で忙しいときでもタッチを見逃しません。PicoへのMicroPythonのインストール方法をまだ知らない場合は、Raspberry Pi Picoとは?から始めてください。

MicroPython
1from machine import Pin
2import time
3
4touch = Pin(15, Pin.IN)            # TTP223 I/O -> GP15 (fiziksel pin 20) / physical pin 20
5led = Pin("LED", Pin.OUT)          # dahili LED (Pico ve Pico W) / onboard LED (Pico and Pico W)
6last = 0
7
8def on_touch(pin):
9    global last
10    now = time.ticks_ms()
11    if time.ticks_diff(now, last) > 250:   # bir dokunuşu bir kez say / count each touch once
12        led.toggle()
13        last = now
14
15time.sleep_ms(600)                 # TTP223 açılış kalibrasyonu / TTP223 power-on calibration
16touch.irq(trigger=Pin.IRQ_RISING, handler=on_touch)
17
18while True:
19    print("Dokunma / Touch:", touch.value(), " LED:", led.value())
20    time.sleep(1)

現在のMicroPythonでは、Pin("LED")という名前でPicoでもPico Wでも内蔵LEDを選べます。ジャンパーBをブリッジしてモジュールをトグルモードにした場合は、割り込みすら必要ありません。ループでled.value(touch.value())と書くだけで十分です。オン・オフの状態はチップ自身が保持するようになるからです。チップの出力はチャタリングしませんが、コードの250 msのロックアウトは、長い配線に乗る短いノイズパルスでLEDが2回切り替わるのを防ぎます。

TTP223を使ったプロジェクトのアイデア

  • タッチ式ナイトライト:LDRを追加して、暗いときだけランプがタッチに反応するようにします。
  • 色が変わるランプ:タッチするたびにWS2812B NeoPixelリングの色を変え、長押しで明るさを設定します。
  • 隠し暗証ロック:アクリルパネルの裏に4つのTTP223を配置し、正しい順番でキーに触れるとサーボモーターがロックを開けます。
  • 穴のないドアチャイム:プラスチックの箱の内側にセンサーを貼り、タッチするとDFPlayer Miniがチャイムを鳴らします。
  • タッチ式コンセントスイッチ:リレーモジュールでデスクライトや扇風機をオン・オフします。
  • 電池駆動のリモコン:ESP32をディープスリープにしておき、TTP223に触れると起動してESP-NOWでコマンドを送ります。

よくある間違いと対処法

症状考えられる原因対処法
タッチに反応しない電源投入時に指がパッドに乗っていた、またはパネルが厚すぎる手を離して電源を入れ直す。薄いパネルか大きなパッドを使う
勝手に反応する感度が高すぎる、パッドの近くに金属がある、電源アダプターのノイズパッドとGNDの間に5〜20 pFを追加し、金属を遠ざけ、VCC–GND間に100 nFを入れる
ずっと触れているような状態になる電源が入ったままパネルやふたを取り付けた先に取り付けてから電源を入れる
1回のタッチでカウンターが何度も増えるコードがエッジではなくレベルを読んでいる前回の状態を保存し、LOW→HIGHの変化のときだけ数える
最初のタッチの検出が遅れるチップが低消費電力モード(約220 ms)になっている正常な動作。2回目以降のタッチは速く検出される
ESP32やPicoのピンが壊れたモジュールを5 Vで給電した必ずモジュールを3V3ピンから給電する
トグルモードで電源投入時にランプが点灯した状態で始まるジャンパーAでアクティブLOWが選ばれているジャンパーAで電源投入時の状態を選ぶか、コードでロジックを反転する
タッチセンサーは電源のリップルに敏感で、チップのメーカーも電源を安定させることを特に強調しています。安価なスマートフォン充電器、モーター、リレーはノイズを出します。モジュールのVCCとGNDピンの間に100 nFのセラミックコンデンサをはんだ付けし、モーターの配線をセンサーから離し、パッドまでの線を短くすれば、誤動作のほとんどは解決します。

TTP223は、とても安いモジュールでプロジェクトにモダンなタッチ操作を加える最も簡単な方法です。機械式ボタンの代わりになり、穴のないパネルの裏でも動作し、どのマイコンとも相性がよいのが特長です。まずは工場出荷時の設定で読み取りを試し、次にランプとピアノの例でエッジ検出と長押しのロジックを練習しましょう。BlueGraysアプリには、ボタンでLEDを点灯する、オン・オフを切り替えるトグルLED、ESP32とPicoのボタンプロジェクト、商用電源の電球の切り替えといったプロジェクトの回路図とコードがステップごとにまとめられています。ボタンの代わりにTTP223を取り付ければ、どれもタッチ式のプロジェクトにできます。

よくある質問

TTP223は何Vで動きますか?

TTP223チップは2.0〜5.5 Vで動作します。Arduino Unoでは5 V、ESP32やRaspberry Pi Picoでは3.3 Vで給電します。出力のHIGHレベルは電源電圧と同じなので、モジュールは必ず接続先ボードのロジック電圧で給電してください。

TTP223のAとBのパッドは何のためのものですか?

AとBは、はんだでつないで使うオプションジャンパーです。ほとんどのモジュールでは、ジャンパーAで出力がアクティブLOW(触れるとLOW)になり、ジャンパーBでセンサーがトグルモードになります。トグルモードでは、触れるたびに出力が反転してその状態を保ちます。両方が開放のときはモーメンタリモードで、触れている間だけHIGHを出力します。

TTP223はガラスやプラスチック越しでも動きますか?

はい。金属を含まなければ、プラスチック、アクリル、ガラス、木、紙越しでも動作します。実際には厚さ1〜3 mmのパネルならたいてい問題ありません。それより厚いパネルでは、銅テープでパッドを大きくする必要があります。モジュールは空気の隙間を作らずにパネルに貼り付けることを忘れないでください。

TTP223が勝手に反応するのはなぜですか?

よくある原因は、感度が高すぎること、パッドの近くの金属部品、長い電極の配線、ノイズの多い電源です。パッドとGNDの間に5〜20 pFのコンデンサを追加すると感度が下がります。VCCとGNDの間に100 nFのコンデンサを入れ、品質のよいアダプターを使うことでも、たいてい問題は解決します。

TTP223で商用電源のランプを切り替えるには?

TTP223の出力は数ミリアンペアしか流せないので、ランプやリレーのコイルを直接駆動することはできません。センサーをArduinoにつなぎ、Arduinoでリレーモジュールを駆動します。リレーができるのはオン・オフだけで、調光はできません。商用電源の配線は閉じたケースに収め、商用電源につながった面にパッドを貼ることは絶対にしないでください。

ESP32でタッチを使うのにTTP223は必要ですか?

いいえ。無印ESP32の10本のタッチピンは、touchRead()でそのまま使えます。ただし、しきい値をソフトウェアで設定する必要があり、配線が長いと値がずれます。すぐに使える安定したデジタル出力がほしい場合や、ESP32-C3のようにタッチピンのないボードを使う場合は、TTP223のほうが実用的です。

全プロジェクトを見る
ボタンでLEDの点灯・消灯を切り替え
#10初級

ボタンでLEDの点灯・消灯を切り替え

部屋の照明スイッチのように、ボタンを1回押すと点灯し、もう1回押すと消灯します。Arduinoはボタンが押されるたびにLEDの状態を反転させます。ボタン内部の小さな接点の振動で誤動作しないよう、短い待ち時間も設けます。1つのボタンでオン・オフを切り替える、シンプルな仕組みです。

4.8(100)
167
ボタンでLEDを点灯(押している間のみ)
#9初級

ボタンでLEDを点灯(押している間のみ)

呼び鈴のように、押している間は点灯し、離すと消灯します。Arduinoはボタンの状態を常に読み取り、押されている間はLEDを点灯させ、指を離した瞬間に消灯させます。このシンプルな回路で、ボードが外部からの操作を検知する仕組みを学べます。

4.8(113)
229
ESP32でボタンによるLED制御(トグル)
#105初級

ESP32でボタンによるLED制御(トグル)

ボタンを押すたびにLEDの状態が切り替わり、点灯中なら消灯し、消灯中なら点灯します。基本的なトグル動作です。チャタリング対策でボタンの機械的なノイズを除去し、1回の操作で1回だけ切り替わるようにします。

4.6(39)
57
Raspberry Pi PicoでボタンによるLEDの点灯・消灯切り替え
#156初級

Raspberry Pi PicoでボタンによるLEDの点灯・消灯切り替え

ボタンとLEDを使って、さらに一歩進みます!基本のボタンプロジェクトと違い、ボタンを押し続ける必要はありません。1回押して離すとLEDが点灯し、もう1回押して離すと消灯します(トグル動作)。回路は同じ(LEDはGP14、ボタンはGP2)ですが、コードは大きく変わります。エッジ検出(1→0に変わる瞬間の検出)、状態の記録、チャタリング対策(機械的な接点の振動を除去)を学びます。MicroPythonのled.toggle()なら1行で状態を切り替えられます。モード切り替え、IRQ、ダブルクリックなど、ボタン操作を使うあらゆるプロジェクトの基礎になります。

0.0(0)
9
ボタンを押すたびに220V電球の点灯・消灯を切り替え
#20上級
プレミアム

ボタンを押すたびに220V電球の点灯・消灯を切り替え

小さなボタンで、家庭の電球を点灯・消灯してみませんか?ボタンを押すとArduinoがリレーを切り替えて電球を点灯させ、もう一度押すと消灯させます。リレーは、ボードの弱い信号で家庭用電源を安全に切り替える仲介役です。220ボルトを扱う際は、必ず大人に手伝ってもらってください。

4.5(33)
44
ブザーとボタンで作る簡単なピアノ
#26上級
プレミアム

ブザーとボタンで作る簡単なピアノ

8個のボタンで小さなピアノを作ります。各ボタンには、低い音から順にド、レ、ミ、ファ、ソ、ラ、シ、高いドが割り当てられています。ボタンを押している間はブザーから音が鳴り、離すと止まります。簡単な曲を弾きながら、音符の正体が音の振動であることを実感できます。

4.9(66)
88
ESP32のPWMでLEDをフェード
#110初級

ESP32のPWMでLEDをフェード

LEDの明るさを0から最大へ、最大から0へと滑らかに変化させます。Arduinoと同じようにanalogWrite()でPWMを制御します。ESP32 Arduino Core 3.0+では同じ構文がそのまま使えます。ピンの定義とpinMode、analogWriteだけで実現できます。

4.8(36)
54
階段・廊下のスマート照明
#82中級
プレミアム

階段・廊下のスマート照明

階段や廊下に足を踏み入れると、進む方向に沿って照明が1段ずつ点灯します。両端に距離センサーがあり、どちらの前を通っても、その端から8個のLEDが0.5秒間隔で順番に点灯し、その後、同じ方向に順番に消灯します。夜の暗がりで足元を照らす、おしゃれなホームオートメーションのアイデアです。

5.0(35)
51