Arduinoと抵抗で作る自作タッチセンサ
この記事では、Arduinoと抵抗1本を使ったタッチセンサーの作り方を解説していく。今回紹介するタッチセンサーは静電容量方式となる。
静電容量式タッチセンサーの原理
A8とA9は1MΩの抵抗で繋がっている。A9からはワイヤーを伸ばし、その電極をタッチセンサーにする。
プログラムの手順としては次の通り。
- A8を出力モード、A9を入力モードに設定する。
- A8をHIGHにし、A9ではその信号を監視をする。
タッチセンサーに触れていない時では、A8がHIGHになった瞬間にA9もHIGHとなる。
しかしタッチセンサーに触れた場合では状況が変わる。
電極部分を指で触れると人の体がコンデンサの役割となって、ローパスフィルタの回路になる。するとデジタルピン出力をHIGHにした時の電圧の立ち上がりが少しだけ遅くなる。
Arduinoのデジタルピンでは約3V以上の電圧にならないとHIGHとは認識されない。つまり、A8とA9の遅延時間を監視すればタッチされたかどうかを判定できるのだ。
タッチセンサーでLチカをやってみよう!
先ほどの配線をブレッドボードに組んで、実際に指で触れてLEDを点滅させてみよう。
開発環境
項目 | バージョン |
---|---|
Arduinoデバイス | Leonardo Pro Micro |
Arduino IDE | 1.8.10 |
パソコン | macOS Big Sur 11.0.1 |
自作タッチセンサーでLチカプログラム
タッチセンサーに触れた瞬間、LEDが点灯するプログラムがこちら。
/*
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);
}
}
複数のタッチセンサーの実現
今度は複数のタッチセンサーを実現してみよう。
複数のタッチセンサーの製作
複数のタッチセンサーを作るため、銅基板をカットしてルーターやヤスリで削ってボタンの仕切りを作った。また、ブレッドボードに挿して使いたいのでピン端子を取り付けた。そして最後に、銅の腐食を防止するためラッカースプレーで塗装した。塗装してもまったく問題なくセンサーとして反応する。
複数のタッチセンサーに反応するプログラム
それでは、自作したタッチセンサーを使ってみよう。先ほどのLチカのプログラムを改良して複数のタッチに反応できるようにした。
下のプログラムではKeyboardライブラリを使ってArduinoをHIDとして認識させている。タッチセンサーに触れるとMacへショートカットキーが送信され、デスクトップが切り替わるようになっている。
/*
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);
}
}
}
しかし、これを実際に使ってみて次の2点が気になった。
- 動作が不安定で反応しないことがたまにある。
- 1つのタッチセンサーで2つのデジタルピンを使用するため、あまり多くのタッチセンサーをつけられない。
今回はここまでで良しとし、これらは今後の課題とする。
製品版のタッチセンサーを使った記事も参考に
今回使用した関連製品はこちら
16MHzの水晶付き 電源ジャンパは、外部5Vを接続します。 彼のUSBポートは、他のデバイスを接続するためのUSBケーブル(ホスト)を接続することも、単一の行ピンストリップで利用可能です。 モジュールサイズ:3.4cm x 1.8cm/1.33"X0.7" ArduinoのIDE v1.0.5デベロッパーの下でサポートされています。
AmazonATmega32u4搭載 / SRAM:2.5KB / EEPROM:1KB / Clock Speed:16MHz 動作電圧:5V デジタル入出力ピン:20本 / PWMチャンネル:7本 / アナログ入力チャンネル:12本 直流電流(1ピン当り最大):40mA / 直流電流(3.3Vピン、1ピン当り最大):50 mA Flashメモリ:32KB (ATmega32u4) 内4KBはブートローダーで使用
AmazonArduinoの参考書
本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。
Amazon
Amazonでお得に購入するなら、Amazonギフト券がオススメ!
コンビニ・ATM・ネットバンキングで¥5,000以上チャージすると、プライム会員は最大2.5%ポイント、通常会員は最大2%ポイントがもらえます!
Amazonギフト券