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タッチセンサーとは?どのように動く?
モジュール上の銅パッドとボードのグラウンド(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 Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 3V3 | 3V3(OUT)(ピン36) |
| GND | GND | GND | GND(ピン38) |
| I/O(SIG) | D2 | GPIO 26 | GP15(ピン20) |
出力ピンが信号を能動的に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で簡単にモードを確認できます。
| A | B | モード | 触れたとき | 電源投入時の出力 |
|---|---|---|---|---|
| 開放 | 開放 | モーメンタリ、アクティブHIGH(工場出荷時) | 触れている間HIGH | LOW |
| ブリッジ | 開放 | モーメンタリ、アクティブLOW | 触れている間LOW | HIGH |
| 開放 | ブリッジ | トグル(ラッチ)、アクティブHIGH | 触れるたびに状態が反転 | LOW |
| ブリッジ | ブリッジ | トグル(ラッチ)、アクティブLOW | 触れるたびに状態が反転 | HIGH |
Arduinoで最初のテスト:タッチを読み取る
- モジュールのVCCピンをArduinoの5Vピンに、GNDをGNDに、I/OピンをD2につなぎます。
- 下のスケッチを書き込み、シリアルモニタを9600 baudで開きます。
- ボードが起動したら、パッドに触れずに1秒ほど待ちます。この間にチップが自分でキャリブレーションします。
- 指でパッドに触れます。Arduinoの13番ピンの内蔵LED(ほとんどのモジュールではボード自身のLEDも)が点灯し、シリアルモニタのタッチ回数が1つ増えるはずです。
- LEDは指がパッドに乗っている間ずっと点灯したままですが、カウンターは新しいタッチごとに1回しか増えません。
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を使う方法をご覧ください。
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 = 600 | 600 msより長いタッチを明るさ調整の指示とみなす |
| dimming | このタッチ中に明るさ調整が行われたら立てるフラグ。指を離したときにランプが消えないようにする |
| step | 長押しのたびに符号が変わり、1回目は暗く、次は明るくなる |
| constrain(brightness, 10, 255) | ランプが完全に暗くならない範囲に明るさを保つ |
| 指を離したときに切り替え | 判定は指を離したときに行うので、短いタッチと長押しを区別できる |
コードのどこにもdelay()がないことに注目してください。タイミングはすべてmillis()で処理しているので、ループは止まらずに回り続け、タッチを見逃しません。この手法についてはmillis()とdelay()で詳しく読めます。最後の明るさはbrightness変数に残るので、ランプを消してもう一度つけると、店で売っているタッチ式デスクライトと同じように、最後に設定した明るさで点灯します。
薄い素材越しに検出する
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とパッシブブザーで小さなタッチピアノを作ります。触れたキーの音が鳴り、指を離すと音が止まります。
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()を使う |
| 長い配線と湿度 | パッドがモジュール上にあるので安定 | 配線が長くなると値がずれ、しきい値が機能しなくなる |
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とは?から始めてください。
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で電源投入時の状態を選ぶか、コードでロジックを反転する |
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の点灯・消灯を切り替え
部屋の照明スイッチのように、ボタンを1回押すと点灯し、もう1回押すと消灯します。Arduinoはボタンが押されるたびにLEDの状態を反転させます。ボタン内部の小さな接点の振動で誤動作しないよう、短い待ち時間も設けます。1つのボタンでオン・オフを切り替える、シンプルな仕組みです。

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

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

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

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

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

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

階段・廊下のスマート照明
階段や廊下に足を踏み入れると、進む方向に沿って照明が1段ずつ点灯します。両端に距離センサーがあり、どちらの前を通っても、その端から8個のLEDが0.5秒間隔で順番に点灯し、その後、同じ方向に順番に消灯します。夜の暗がりで足元を照らす、おしゃれなホームオートメーションのアイデアです。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

