2017年3月3日金曜日

Raspberry Pi と Arduino で楽器作り(10) - 静電容量式タッチセンサ

アルミホイルを使って静電容量式タッチセンサを作ります。

1. 触れたことを検出する

Xiaccoでは親指で他の指をタッチして音を鳴らすようにしたいので、触ったことを検出するセンサが必要です。僕の知る限りでは
  • 圧力センサ
  • 静電容量式タッチセンサ
の二つがあると思います。圧力センサは、ロングタイプやリングタイプなどがあり、押した強さも検出できるので楽しそうです。しかし、最小のものでも指につけるにはちょっと大きいです。タッチセンサは小型で、指につけられそうなので良いのですが、市販のものは少なくとも3本はワイヤを伸ばさなくてはならなそうだし、ハンダ付けも面倒です。もっといい方法はないか探したところ、Arduino のライブラリに、アルミホイルや金属板をタッチセンサにできるものがあるようでした。

参考:Arduino 日本語リファレンス - CapSense(静電容量センサ) 

静電容量方式では、金属板と指との間でコンデンサを作り、その静電容量の変化でセンシングを行うみたいです。このライブラリでは、電流がコンデンサを通ってピンが変化するまでの時間を出力できるのかな。このあたりまだよくわかっていませんが、しっかり理解しておかないと細かい点で失敗しそうです。ただ、よくわかっていなくても動かせるのが Arduino の強みでもあると思うので、まずやってみることにしました。

2. 動作チェックから音出しまで

接続のために、秋月電子通商様でコネクタ付コードを購入。片方がアルミホイルを挟むためのクリップになっていて、もう片方が Arduino やブレッドボードにつなげるピンになっているお誂え向きのものです。
アルミホイルは小さいほうがよい
 送信ピンから 1MΩ抵抗をはさんで、受信ピンへつなぎ、その間からアルミホイルをのばす感じです……。先ほどのリファレンスの回路図がわかりやすいです。 Arduino のコードは以下。
#include <CapSense.h>

CapSense cs = CapSense(8, 9);

void setup() {
  Serial.begin(9600);
  cs.set_CS_AutocaL_Millis(0xFFFFFFFF);
  cs.reset_CS_AutoCal();  //いらないかも
}

void loop() {
  if(Serial.available() > 0) {
    char c = Serial.read(); 
    long total = cs.capSense(1000);
    Serial.println(total);
  }
}
CapSense と capSense は別物なので注意。CapSense(8, 9) で受送信ピンの設定をしています。set_CS_Autocal_Mills(0xFFFFFFFF) はキャリブレーションをしないようにする命令です。これをなくすと押されたことを検出し、押しっぱなしだと反応しないです。用途によって消したり入れたりする必要がありそう。その下は強制キャリブレーションですが、これはいらないような気がします。loop() 関数内では前回までのように要求が来てから送信を行います。 capSense() の引数はサンプリング周期のようですが、いまいちわからないので出力を見ながら都合のいいようにしました。なぜかわかりませんが、 Windows 上でやったときと Raspberry Pi 上でやったときで違うので結構やっかいです。とりあえずこれで、押しているときと押されていないときが明確に区別できるようになりました。わからないことが多いので、勉強せねばなりません。
Python 側は前とあまり変わりません。CapSense の出力は周期的で、たまに押していてもかなり小さい値を出力します。なのでその辺を無視するためにまた中央値処理をしています。前より安定した出力なので、5つの数値からとっています(この辺の数字が処理速度にかなり影響してるみたい)。どのくらいの数値以上なら音が出るかは、いちいち検証してやってみたほうがいいのかも。

3. 課題

とりあえずアルミホイルでタッチセンサが作れてよかったです。課題は結構あって、
  • 相変わらず押してから音が鳴るまで、離してから止まるまでが遅い
  • CapSense の仕組みがわかっていないのでコードをいじるのも怖い
  • 音が出る/出ないの境目は最初の数秒の平均などをとって自動設定できるのでは?
  • 2つ以上のタッチセンサからの入力は可能なのか?7ついけるか?
など。複数入力は早めに検証したいですね。

0 件のコメント:

コメントを投稿