Arduinoと抵抗で作る自作タッチセンサ〜Pro Micro編

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

こんなこと、やります。

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

▼ はんだ付けをしたことない方や電子工作初心者の方は、タッチセンサを自作するよりも、製品のタッチセンサを使うほうがおすすめです。詳しくはこちらの記事をご覧ください。

つかうもの

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

Arduino

お好きなArduinoでかまいませんが、ArduinoをキーボードなどのHIDデバイスにするためには、LeonardoのようなATmega32U4チップを搭載されたものが必要です。

Pro Microの使い方は、 Pro MicroでArduinoをはじめよう!〜Lチカするまで をご覧ください。

▼ ATmega32U4搭載ボード

タッチセンサ

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

その他

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チカする配線図

ソースコード

cpp
/*
  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では、タッチの感度を調整できます。

cpp
/*
  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の使い方は、 Pro Microと静電容量式タッチセンサ(TTP223)【Arduino】 をご覧ください。

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

人気のArduino互換機
Arduinoで人気の周辺パーツ
あると便利な道具
Arduinoのオススメ参考書

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

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

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

関連記事