Arduinoと抵抗で作る自作タッチセンサ〜Pro Micro編
こんなこと、やります。
- Arduinoを使って、たった1本の抵抗で作れるタッチセンサの作り方の紹介
- 静電容量方式のタッチセンサパネルを自作する
- 自作タッチセンサでショートカットキーを送信、Pro MicroでHIDをつくる
▼ はんだ付けをしたことない方や電子工作初心者の方は、タッチセンサを自作するよりも、製品のタッチセンサを使うほうがおすすめです。詳しくはこちらの記事をご覧ください。
つかうもの
本記事でつかうものをご紹介します。
Arduino
お好きなArduinoでかまいませんが、ArduinoをキーボードなどのHIDデバイスにするためには、LeonardoのようなATmega32U4チップを搭載されたものが必要です。
Pro Microの使い方は、 Pro MicroでArduinoをはじめよう!〜Lチカするまで をご覧ください。
▼ ATmega32U4搭載ボード
タッチセンサ
タッチセンサにするため、プリント基板を利用しました。電気を通すものであれば何でもかまいません。じつは、リンゴなどの食べ物もタッチセンサになります。
その他
1MΩの固定抵抗を使いますので、あわせて用意してください。カーボン抵抗または金属皮膜抵抗のどちらでもかまいません。
ブレッドボードやジャンプワイヤをお持ちでない方は揃えてください。
開発環境
項目 | バージョン |
---|---|
Arduinoデバイス | Leonardo Pro Micro |
Arduino IDE | 1.8.10 |
パソコン | macOS Big Sur 11.0.1 |
静電容量式タッチセンサ
静電容量式タッチセンサについて解説します。
Arduinoと抵抗1本でタッチセンサをつくる
次の図のように、Arduinoと抵抗1本を配線して、タッチセンサをつくります。
図では、A8とA9は1MΩの抵抗(ハイインピーダンス)を介してつながってます。A9からワイヤー(金属)を伸ばし、それをタッチセンサにしてみます。
プログラム手順
Arduinoに書き込むプログラムの主な内容は次の通りです。
- A8を出力モード、A9を入力モードに設定する。
- A8をHIGHにし、A9ではその信号を監視をする。
静電容量式タッチセンサの原理
なぜこれでタッチセンサができるのか原理を説明します。
まず、タッチセンサに触れていない時は、A8がHIGHになったと同時にA9もHIGHになります(図中の「通常」の波形)。
しかし、タッチセンサに触れた場合、A9地点を観察すると図中の下のように波形が変わってしまいます(さわった時の波形)。
なんで波形が変わるの?
ワイヤーや抵抗を指で触れていると、人の体がコンデンサの役割となってRCローパスフィルタ回路が生成されるのです。すると、LOWからHIGHの電圧の立ち上がりが少し遅くなるのです。
遅延の観察
この遅延時間をArduinoで観察すれば、タッチしたかどうかの判定ができるというわけです。 都合の良いことに、Arduinoのデジタルピンにはしきい値というものがあって、2.7V程度以上の電圧になるまでは、入力信号がHIGHと判断されません。よって、遅延時間を測定するのも簡単です。 これが静電容量式タッチセンサの仕組みとなります。
ローパスフィルタのマニアックな話
ローパスフィルタについて詳しく知りたい方は、数学的な話になりますがこちらの記事をご覧ください。
タッチセンサをつくってみよう
それでは実際に、Arduinoを使ってタッチセンサをつくって、Lチカをやってみましょう。
配線図
こちらの配線をブレッドボードで組んでください。
ソースコード
/*
Created by Toshihiko Arai.
https://101010.fun/iot/arduino-diy-touch-sensor.html
*/
const int SENSOR_1_OUT = 8;
const int SENSOR_1_IN = 9;
const int LED_PIN = 10;
const int threshold = 5;
void setup() {
pinMode(SENSOR_1_OUT, OUTPUT);
pinMode(SENSOR_1_IN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int counter = 0;
digitalWrite(SENSOR_1_OUT, HIGH);
while (digitalRead(SENSOR_1_IN)!=HIGH) counter++;
digitalWrite(SENSOR_1_OUT, LOW);
delay(1);
if (counter > threshold) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
スケッチをArduinoへアップロードし、タッチセンサにふれると、このようにLEDが点灯します。
発展:自作タッチセンサでHIDキーボード
さらに発展させて、複数のタッチセンサを作り、HIDキーボードにしてみました。HIDとは「ヒューマン・インタフェース・デバイス」のことで、ようするにマウスやキーボードなどパソコンを操作するための道具のことです。 最初にも説明しましたが、ArduinoをHIDとして認識させるには「Leonardo」のようにATmega32U4チップ搭載機でないとできませんのでご注意ください。
Leonardoを使えば、プログラム可能なオリジナルキーボードを簡単につくることができます。
カット基板でタッチセンサの製作
複数のタッチセンサを作るため、カット基板を使いました。基板を適度な大きさにカットし、ルーターやヤスリで境目を作ってそれぞれのボタンとします。ブレッドボードに挿して使えるように、ピン端子をはんだ付けしました。 さいごに、銅の腐食を防止するため、ラッカークリアを塗装します。塗装しても問題なくタッチセンサとして反応することが確認できました。
HIDキーボードの製作
自作したタッチセンサを使ったHIDキーボードをご紹介します。
HIDとしてパソコンに認識させるには、Keyboardライブラリ使うと便利です。
ソースコード
ソースコードはこちら。タッチセンサに触れると、macOSのデスクトップが一発で切り替わるよう「ショートカットキー(ctrl+数字)」を送信させます。 プログラム中のthresholdでは、タッチの感度を調整できます。
/*
Created by Toshihiko Arai.
https://101010.fun/iot/arduino-diy-touch-sensor.html
*/
#include "Keyboard.h"
const int btnCount = 6;
const int btnPairs[btnCount][2] = {{1, 0}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 16}};
const int threshold = 5;
const char numberKeys[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
void setup() {
Serial.begin(9600);
Keyboard.begin();
for (int i = 0; i < btnCount; i++) {
pinMode(btnPairs[i][0], OUTPUT);
pinMode(btnPairs[i][1], INPUT);
Serial.println(btnPairs[i][0]);
}
}
int checkTimeLag(int a, int b) {
int counter = 0;
digitalWrite(a, HIGH);
while (digitalRead(b)!=HIGH) counter++;
digitalWrite(a, LOW);
delay(1);
return counter;
}
int sendKeyboard(int number) {
Serial.println(number);
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(numberKeys[number]);
delay(100);
Keyboard.releaseAll();
}
void loop() {
for (int i = 0; i < btnCount; i++) {
int counter = checkTimeLag(btnPairs[i][0], btnPairs[i][1]);
if (counter > threshold) {
sendKeyboard(i);
}
}
}
課題
実際に自作タッチセンサで作ったHIDキーボードを、しばらく実用してみました。そして、次の点に不満を感じました。
- 動作が不安定でたまに反応しない
- タッチセンサの数がArduinoのピンに制限される
今回の実験はこれで良しとしますが、これらは次の課題となります。
後日談
その後、製品のタッチセンサTTP223を使うことになりました。 TTP223も静電容量方式のタッチセンサですが、ICが良くできていて誤動作なく反応がすばらしいです。また、モーメンタリ・オルタネイトの切り替えができますので便利です。
TTP223の使い方は、 Pro Microと静電容量式タッチセンサ(TTP223)【Arduino】 をご覧ください。