Arduinoと抵抗で作る自作タッチセンサ

抵抗で作る!Arduinoのタッチセンサーの作り方

この記事では、Arduinoと抵抗1本を使ったタッチセンサーの作り方を解説していく。今回紹介するタッチセンサーは静電容量方式となる。

静電容量式タッチセンサーの原理

抵抗に触れるとLチカする配線図
抵抗に触れるとLチカする配線図

A8とA9は1MΩの抵抗で繋がっている。A9からはワイヤーを伸ばし、その電極をタッチセンサーにする。

プログラムの手順としては次の通り。

  1. A8を出力モード、A9を入力モードに設定する。
  2. A8をHIGHにし、A9ではその信号を監視をする。

タッチセンサーに触れていない時では、A8がHIGHになった瞬間にA9もHIGHとなる。

タッチセンサーによる波形の変化
タッチセンサーによる波形の変化

しかしタッチセンサーに触れた場合では状況が変わる。

電極部分を指で触れると人の体がコンデンサの役割となって、ローパスフィルタの回路になる。するとデジタルピン出力をHIGHにした時の電圧の立ち上がりが少しだけ遅くなる。

Arduinoのデジタルピンでは約3V以上の電圧にならないとHIGHとは認識されない。つまり、A8とA9の遅延時間を監視すればタッチされたかどうかを判定できるのだ。

人の体がキャパシタの役割をする
人の体がキャパシタの役割をする

タッチセンサーでLチカをやってみよう!

先ほどの配線をブレッドボードに組んで、実際に指で触れてLEDを点滅させてみよう。

開発環境

項目バージョン
ArduinoデバイスLeonardo Pro Micro
Arduino IDE1.8.10
パソコンmacOS Big Sur 11.0.1

自作タッチセンサーでLチカプログラム

自作タッチセンサーでLチカチカ
自作タッチセンサーで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. 1つのタッチセンサーで2つのデジタルピンを使用するため、あまり多くのタッチセンサーをつけられない。

今回はここまでで良しとし、これらは今後の課題とする。

製品版のタッチセンサーを使った記事も参考に

今回使用した関連製品はこちら

KKHMF 2個 Leonardo Pro Micro ATmega32U4 5V/16MHz ブートローダ マイクロ USB Pro Mini 開発ボード Arduinoに対応
KKHMF 2個 Leonardo Pro Micro ATmega32U4 5V/16MHz ブートローダ マイクロ USB Pro Mini 開発ボード Arduinoに対応

16MHzの水晶付き 電源ジャンパは、外部5Vを接続します。 彼のUSBポートは、他のデバイスを接続するためのUSBケーブル(ホスト)を接続することも、単一の行ピンストリップで利用可能です。 モジュールサイズ:3.4cm x 1.8cm/1.33"X0.7" ArduinoのIDE v1.0.5デベロッパーの下でサポートされています。

Amazon
Arduino Micro
Arduino Micro

ATmega32u4搭載 / SRAM:2.5KB / EEPROM:1KB / Clock Speed:16MHz 動作電圧:5V デジタル入出力ピン:20本 / PWMチャンネル:7本 / アナログ入力チャンネル:12本 直流電流(1ピン当り最大):40mA / 直流電流(3.3Vピン、1ピン当り最大):50 mA Flashメモリ:32KB (ATmega32u4) 内4KBはブートローダーで使用

Amazon

Arduinoの参考書

電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版

電子パーツを自由自在に組み合わせて電子工作ができるように、Arduinoによる電子部品ごとの制御方法を詳しく解説。初心者や電子工作に躓いた人でも安心して取り組めるよう、豊富な図・写真で徹底解説。2018年発刊の「Arduino 電子工作 実践講座」の改訂版です。

KindleAmazon
Arduinoをはじめよう 第3版 (Make:PROJECTS)
Arduinoをはじめよう 第3版 (Make:PROJECTS)

本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。

Amazon

最後まで読んでいただきありがとうございました。

「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。

今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓

あなたにおすすめ