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

 

こんなこと、やります。

  • Arduinoを使って、たった1本の抵抗で作れるタッチセンサーの作り方の紹介
  • 静電容量方式のタッチセンサーパネルを自作する
  • 自作タッチセンサでショートカットキーを送信、Pro MicroでHIDをつくる

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

つかうもの

本記事でつかうものをご紹介します。

Arduino

お好きなArduinoでかまいませんが、ArduinoをキーボードなどのHIDデバイスにするためには、LeonardoのようなATmega32U4チップを搭載されたものが必要です。本記事では、こちらのPro Microの互換品を使用します。

Pro Microの使い方は、Pro MicroでArduinoをはじめよう!をご覧ください。

タッチセンサ

タッチセンサにするため、プリント基板を利用しました。電気を通すものであれば何でもかまいません。じつは、リンゴなどの食べ物もタッチセンサになります。

抵抗

1MΩの固定抵抗を使いますので、あわせて用意しておいてください。カーボン抵抗または金属皮膜抵抗のどちらでもかまいません。

ブレッドボードやジャンプワイヤをお持ちでない方は揃えておいてください。

開発環境

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

静電容量式タッチセンサ

静電容量式タッチセンサについて解説します。

Arduinoと抵抗1本でタッチセンサをつくる

次の図のように、Arduinoと抵抗1本を配線して、タッチセンサをつくります。

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

図では、A8とA9は1MΩの抵抗(ハイインピーダンス)を介してつながっています。A9からワイヤー(金属)を伸ばし、それをタッチセンサにしてみます。

プログラム手順

Arduinoに書き込むプログラムの主な内容は次の通りです。

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

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

なぜこれでタッチセンサができるのか原理を説明します。

まず、タッチセンサーに触れていない時は、A8がHIGHになったと同時にA9もHIGHになります(図中の「通常」の波形)。

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

しかし、タッチセンサーに触れた場合、A9地点を観察すると図中の下のように波形が変わってしまいます(さわった時の波形)。

なんで波形が変わるの?

ワイヤーや抵抗を指で触れていると、人の体がコンデンサの役割となってRCローパスフィルタ回路が生成されるのです。すると、LOWからHIGHの電圧の立ち上がりが少し遅くなるのです。

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

遅延の観察

この遅延時間をArduinoで観察すれば、タッチしたかどうかの判定ができるというわけです。

都合の良いことに、Arduinoのデジタルピンにはしきい値というものがあって、2.7V程度以上の電圧になるまでは、入力信号がHIGHと判断されません。よって、遅延時間を測定するのもカンタンです。

これが静電容量式タッチセンサの仕組みとなります。

ローパスフィルタのマニアックな話

ローパスフィルタについて詳しく知りたい方は、数学的な話になりますがこちらの記事をご覧ください。

タッチセンサをつくってみよう

それでは実際に、Arduinoを使ってタッチセンサをつくって、Lチカをやってみましょう。

配線図

こちらの配線をブレッドボードで組んでください。

抵抗に触れるとLチカする配線図
抵抗に触れると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が点灯します。

自作タッチセンサーでLチカチカ
自作タッチセンサーでLチカチカ

発展:自作タッチセンサで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キーボードを、しばらく実用してみました。そして、次の点に不満を感じました。

  1. 動作が不安定でたまに反応しない
  2. タッチセンサーの数がArduinoのピンに制限される

今回の実験はこれで良しとしますが、これらは次の課題となります。

後日談

その後、製品のタッチセンサーTTP223を使うことになりました。

TTP223も静電容量方式のタッチセンサーですが、ICが良くできていて誤動作なく反応がすばらしいです。また、モーメンタリ・オルタネイトの切り替えができますので便利です。

TTP223の使い方は、静電容量式タッチセンサTTP223をArduinoで使うをご覧になってください。

記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事