導電性フィラメントで非接触式静電容量式センサを作ってLED調光をやってみました。
参考にしたのはこちらのサイト。Arduino Tutorial: Capacitive Touch Sensors
つなげる抵抗によっていろいろ変わってくると書いてあります。サイトによると1MΩでタッチ検出可。10MΩだと4~6inch離れたところからでも検出でき、40MΩだと12~24inch離れていても検出してくれるそうです。今回はとりあえず10MΩの抵抗で試してみることにしました。送信ピンと受信ピンの間に10MΩの抵抗をつけて、その先に電極をつけます。10MΩ抵抗、電極とも導電性フィラメントで作りました。
まず10MΩ抵抗。単純には抵抗を買ってくればいいのですが、今回は自作しました。高抵抗にするためにはとても薄く長く造形する必要があります。そのままだととてもハンドリングしにくい形状になってしまうので、今回は0.7mmの厚紙の上に造形しました。造形の厚みは0.2mm。線が何本かあります。1本がだいたい1MΩです。手持ちのテスターでは2MΩまでしか測れません。1MΩが10本で、見込みで10MΩとしました。
抵抗にケーブルを接続する必要があります。ハンダは高温になるので使えません。ここで導電性パテが活躍します。ケーブルを動かないようにテープで固定し、導電性フィラメントをアセトンで溶かしたパテを盛りつけて接続。数時間風乾すると硬化します。これで接続はOK。
次に電極。形状は何でもいいのですが、ある程度静電容量の変化を感知しやすくするために大きめの形状にしました。φ70のドーム状です。ケーブルを止めるためにM3のネジを取り付けました。
Arduinoのプログラム。ライブラリは下記のものを使用させてもらいました。
arduino-libraries / CapacitiveSensor
あまりプログラムはうまくないのですが、何とか書いてみました。10,8番ピンを10MΩ抵抗に接続し、5,6番ピンにLEDを差します。センサの値を変数valに取り込んで10回平均。valがある数値(この場合は550)を超えたらpwmという変数に値を入れてLEDにアナログ出力、という形です。
#include <CapacitiveSensor.h>
CapacitiveSensor touchPad = CapacitiveSensor(10, 8);
void setup() {
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
touchPad.set_CS_AutocaL_Millis(0xFFFFFFFF);
Serial.begin(115200);
}
void loop() {
static boolean touch_state = false;
static boolean last_touch_state = false;
long val;
int i;
int pwm;
// get value
for (i = 0; i < 10; i++){
val = val + touchPad.capacitiveSensor(100);
}
val = val / 10;
// hysteresis comparator
if (val > 550) {
touch_state = true;
} else {
touch_state = false;
}
pwm = (val - 200) * 2;
if (pwm < 30) {
pwm = 0;
}
if (pwm > 255) {
pwm = 240;
}
analogWrite(6, 0);
analogWrite(5, pwm);
Serial.println(pwm);
}
いざ確認!手をかざしていない状態だとLEDは消えています。
手を電極にかざすとLEDが点灯し、電極に近づけると次第に明るくなっていきます。
これが出力しているPWMの数値です。手をかざしていないときにゼロを出力、手をかざしているときに数値が出力されてはじめ、電極に近くなると値が大きくなっていきます。LEDの調光ができていることがわかります。
10MΩ抵抗&非接触でモーターを動かせた😃 pic.twitter.com/5twJZsynnI
— Nature3D (@nature3d_) August 16, 2020
モータードライバーをつないでモーターをPWMで動かすこともできました。わりといろんなことに使えそうです。