Teensyでタッチセンサ

 

購入、セットアップときたので今回はTeensyの機能の1つであるタッチセンサについて、Teensyすごいんだぞ!と紹介も兼ねつつ書いていこうかと思います。

 

なお、TeensyのバージョンはLC及び3.x(3.5を除く)になります。それ以外ではできないので注意してください。

 

 

 

はじめに

はじめになりますが、参考にさせていただいた記事を載せておきます。

little-scale.blogspot.jp

 

正直言っちゃえば、英語を読める方ならこの記事を読んでいただければ大体それだけで事足りてしまいます

 

なのでこの記事ではというか、補完になるようなところも書いていけたらなと思ってます。(つまりパクりではないという言い訳ができる!)

 

 

タッチセンサとは

 タッチセンサとはその名の通り触ったかどうか判定できるセンサです。実装する方式は色々あるんですけど、今回は『静電容量方式』になります。

 

僕も詳しい理解をしてないので雑ですが、「人体にもちょっとだけ静電容量があるから、回路の途中に挟んだらそうしてないときと比べて充電時間がかかるよね」っていう考えに基づいた方式です。

 

ネットには様々なタッチセンサを自作してみたという記事が転がっていますが、そのほとんどが静電容量方式のものです。多分。その理由は実装が簡単であること。Arduinoと抵抗1本さえあれば作れてしまいます。

 

 

Arduinoと比べて何が違うの?

Arduinoの場合

「じゃあArduinoで実装すればいいじゃん。なに言ってんの?」

そんな声が聴こえてきます。絶対に聴こえます。僕もそう思ってました。

 

しかし、実際にArduinoで作ってみて痛感したのですが、

簡単に作れてもセンサの値を簡単には使うことができない

んです。

 

ここで僕が作ってみたセンサを見てみましょう。

 

 

f:id:tsukinka:20180128012620j:plain

 

非常に単純なものです。丸をつけた部分(ただの導線)を触るとセンサの値が変化します。スケッチ内容としてはOutputピンをHIGHにしてからINPUTピンがHIGHになるまでの時間を計測しそれを出力するというもの。しきい値によってLEDを光らせることも可能です。

 

ですがこのセンサ、このままでは非常に値のバラつきがあって細かいコントロールに使おうとする場合には更なる環境の構成がとても重要になってきます。1つ挙げるとすればグランド、GNDですね。しっかりとしたグランドを用意しない場合、フィルタをかけてもなかなかどうしようもないレベルで値が乱れます。

専用のライブラリもありますが、恐らくこれでも値は整わないように思えます。(未検証)

 

恥ずかしながら普通に知識不足な僕でして、そういう上手な環境構築法を知らないんですよね。そんなわけで、Arduinoでの自作タッチセンサは簡単にできても簡単にできない、という結論にたどり着きました。

 

 

Teensyの場合

次にTeensyならどうなの?って話です。まず僕が実装したものを見てみましょう。

なお、動作検証であるので0番ピンのみはんだ付けしてます。中途半端で気持ち悪いと思いますがそこは大目に見てください。ではどうぞ ↓

 

 

f:id:tsukinka:20180128012654j:plain

 

……え?これだけ?って感じですがこれだけです。丸をつけた部分を触るとセンサの値が変化するのはArduinoと同様です。

 

スケッチの内容は後々書きますが、Teensyの場合は線1本でタッチセンサを実装することが可能です。Arduinoより簡単にできます。

 

Teensyにはタッチセンサに使うことのできるピンが何本か用意されています。(3.6には11本) このピンは内部的にタッチセンサ用の回路が用意されています。そのため特別なライブラリを使うことなく、Teensyduinoから値を読むスケッチを書くことが可能になっています!

 

しかもセンサの値も少しいじる程度で扱える範囲のバラつきです。

 

 

Teensyで静電容量センサ実装

値を読む

センサの値を読む方法ですが、『touchRead()』によって実装できます。touchピンとして使えるピンは公式の配置表を確認してください。

Teensy and Teensy++ Pinouts, for C language and Arduino Software

 

 ソースコードを示します。

void setup() {
  Serial.begin(9600);
}

void loop() {
 Serial.println(touchRead(0));
 delay(100);
}

 

これだけです。簡単!これを前回の記事のようにTeensyへ書き込むだけでそれなりのタッチセンサができます。

 

シリアルモニタへ出力される値としては、

触ってないときは ↓

 

f:id:tsukinka:20180128011714p:plain

 

触っているときは ↓

 

f:id:tsukinka:20180128011755p:plain

 

 

このように、触った触ってないによって値が明らかに変化していることがわかります。

 

はい!タッチセンサ完成です!おめでとうございます!

 

 

値をすこしいじる

以上でタッチセンサは実装できましたが、delay()をかなり小さくするとさすがにブレた値が出ることがあります。触っていないのに触ったと判定されたり、触っているのに離したと判定されたりしてしまいます。

その場合、フィルタリングや値の調整をすることでブレを消す必要が出てきます。

 

ここではスケッチ自体は書きませんが、僕がどう調整したのかについて軽く記述をします。参考程度に見てみてください。

 

しきい値

まずしきい値の設定ですが、setup()内で100回程度touchRead()をして、その中で最大の値をしきい値として用いました。そのまま用いるのではなくて、さらに1.5倍ほどしたものをしきい値に設定しています。

何倍するかは各自で値を見てから設定するとよいと思います。

 

ブレ対策

次にブレた値への対策ですが、しきい値を超えてからの継続時間によって判定を行うようにしてみました。流れを記述しますが、

 

しきい値以上の値ならそのときの時間を計測

② 一定時間しきい値以上が続いたらタッチ状態とする

③ タッチ状態でしきい値以下ならそのときの時間を計測

④ ③から一定時間しきい値未満ならタッチ状態を解除

 

以上のような流れを取ってみました。なお時間計測にはmillis()関数を使用。継続時間の設定を長くすればするほど正確にはなりますが反応が鈍ってしまうのでちょうどいいところを探しましょう。

 

 

上記のような手法で値を使えるようにしてみました。試してみましたがそこそこ安定して判定が行えました。

 

しかし、これはあくまで僕の使ってみた手法であって正解ではないです。これより良い方法が世界には無数に存在してると思うので色々調べてみるのが良いかと。

 

 

総括

今回はTeensyの機能の1つであるタッチセンサについて書きました。

 

 本当に簡単にできてしまうので、タッチセンサを使いたいなと思っている人はこの機会にTeensyを使ってみるのはどうでしょうか!?

余計な部品も必要ないので省スペース化までできます。

 

 

というわけで今回の記事も終わりです。

今までTeensyの回し者かってくらいそれ関係の記事しか書いてないですけど、それは他に書くことが無いからです。というのも現状それくらいしかしたことがないのです。

 

そしてついに今回で書くネタのストックが尽きました……

これからはなんか実装したときに随時書くことになるかと思います。

 

それではここまで。またね。