2016年09月02日 | Ver. 1.00公開。 |
SparkFunのTouch Shieldは、タッチセンス式の3×3の9個のキーがあるキーパッドのシールドです。
このシールドを使う場合、ソフトをどうやって作るかが問題になります。GitHubでサンプルスケッチは公開されているのですが、このサンプルスケッチは、ライブラリの形にまとまっていませんし、また、スケッチを自分のプロジェクトに合うように書き換えようと思っても、割り込みルーチン(ISR)を書き換えなければならないなど、初心者が簡単に書き換えられる様にはなっていません。(ここら辺の話は、SparkFunのTouch Shield(タッチシールド)を使ってみた(2)に詳しく書きました)
そこで今回、Arduino UnoでTouch Shieldが簡単に使える様に、TouchShieldライブラリを作成しました。
LGPLライセンスで配布しますので、個人的な使用・商用にかかわらず無料でご利用いただけますが、再配布の際には著作者の表示に注意してください。
また、このライブラリを作るにあたって、SparkFunがGithubで配布しているサンプルスケッチの一部を利用させていただきました。
なお、このライブラリは、SparkFunとは関係なく開発した非公認のライブラリなので、万一動作に不良などがあっても、SparkFunには問い合わせないでください。
TouchShieldは、以下のリンクよりダウンロードできます。
このライブラリは、Arduino Unoに対応しています。動作検証はArduino IDE 1.0.6、1.6.11、および1.7.8で行っています。
注:TouchShieldライブラリはArduino IDE 1.7.10ではうまく動作しませんが、現在原因を調査中です。
ライブラリのインストールの方法を、Arduino IDE 1.6.11を例に説明します。
注:他のバージョンのArduino IDEではメニュー構成などが異なる事があります。
まずArduino IDEを起動し、スケッチ→ライブラリをインクルード→.ZIP形式のライブラリをインストール...メニューを選択します。(図1参照)
その時に開くウィンドウで、ダウンロードした.ZIPファイルを選択し、開くボタンをクリックします。(図2参照)
「ライブラリが追加されました。」というメッセージが表示されれば、ライブラリがインストールされています。
TouchShieldライブラリには、サンプルスケッチが付属します。そのサンプルスケッチの使い方を中心に、TouchShieldライブラリの使い方を説明します。
まず、Touch Shieldを装着したArduino Unoを、USBケーブルでパソコンに接続してください。
次にArduino IDEを起動し、ファイル→スケッチの例→TouchShield→sampleメニューを選択します。(図4参照)
そうすると、リスト1の様なサンプルスケッチが開きます。
#include <Wire.h>
#include <TouchShield.h>
TouchShield ts; // when you want to enter numbers
//TouchShield ts('A','B','C','D','E','F','G','H','I'); // when you want to enter alphabets
void setup() {
ts.init();
Serial.begin(9600);
Serial.println("Ready.");
}
void loop() {
char c=ts.read();
if(c) {
Serial.print(c);
} // if
// delay(1000); // to test key buffer functionality
}
このスケッチをArduinoに書き込んで、シリアルモニタを起動すると、"Ready."と表示されます。(図5参照)
この状態でTouch Shieldのキーをタッチすると、それが画面に表示されます。例えば、1、2、3のキーを順にタッチすると、図6の様になります。
リスト1のスケッチの説明をします。
TouchShieldスケッチを使うには、次の様に、Wire.hとTouchShield.hをインクルードする必要があります。Wire.hをインクルードするのは、Touch ShieldとI2C(TWI)で通信するのにWireライブラリを使用するからです。
#include <Wire.h>
#include <TouchShield.h>
次にTouchShield型のオブジェクト変数を宣言します。ここではtsという変数名にしていますが、変数名は何でもかまいません。以後、Touch Shieldの制御は、このオブジェクト変数のメンバ関数を呼び出すことにより行います。
TouchShield ts; // when you want to enter numbers
キーパッドを使う前に、initというメンバ関数を呼び出し、Touch Shieldを初期化します。
ts.init();
キーを読み出す時には、readというメンバ関数を呼び出します。
char c=ts.read();
read関数は、タッチされたキーを表す文字を返します。例えば1のキーを押すと、'1'が返ります。何もキーが押されていない場合は、'\0'(NULLキャラクタ)が返ります。
上の例では、char型の変数cに、タッチされたキーを表す文字が代入されます。
デフォルトでは、read関数は'1'から'9'までの文字を返しますが、キーの割り当てを変更する事もできます。
キー割り当てを変更する場合は、次の様にTouchShield型のオブジェクト変数を宣言する際に、割り当てたい文字をコンストラクタの引数にします。(割り当てる文字をカンマで区切り、全体を括弧でくくります)
TouchShield ts('A','B','C','D','E','F','G','H','I'); // when you want to enter alphabets
この場合は、1のキーには'A'、2のキーには'B'…といった具合に、大文字のアルファベットが割り当てられます。
TouchShieldライブラリは、16文字のキーバッファを備えています。キーをタッチしてからすぐにread関数で読めなくても、読み出すまでキーバッファにタッチしたキーの情報を記録しておきます。そのため、他の処理に時間がかかって、しばらくread関数が呼び出せない状態でも、キーの取りこぼしがありません。
キーバッファの働きを調べるには、サンプルスケッチのloop関数内のdelay関数に付いているダブルスラッシュ(//)を取ってください。
void loop() {
char c=ts.read();
if(c) {
Serial.print(c);
} // if
delay(1000); // to test key buffer functionality
}
このdelay関数により、1秒間隔でしかread関数を呼び出せなくなりますが、キーバッファがあふれない範囲なら、連続でキーをタッチしても、取りこぼしは発生しません。
実際に試してみると、キーを連続でタッチした後に、遅れて1秒間隔で文字がシリアルモニタに表示されるのが分かると思います。
当方では動作確認までしてはいませんが、TouchShieldライブラリを使う場合、他のI2C(TWI)接続の周辺デバイスは、同時に使用できないと思います。
これは、キーがタッチされた瞬間にかかる割り込みにより、I2C経由でキーの情報を取得する仕組みになっているからです。I2Cで他のデバイスと通信している最中にキーをタッチすると、通信がぶつかってしまいます。
実際に試してはいませんが、他のデバイスとI2Cで通信している間は、Touch Shieldで使用しているINT0割り込みをマスクすると、デバイスの共存ができる可能性があります。その際、INT0割り込みをマスクする時間が長いと、キーの取りこぼしが発生するので注意が必要です。
商品名 | I/Oピン一つで読める4X4キーパッドキット | |
税抜き小売価格 | 900円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X4キーパッドキットサポートページ |
商品名 | I/Oピン一つで読める4X5キーパッドキット | |
税抜き小売価格 | 2400円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X5キーパッドキットサポートページ |
商品名 | I/Oピン一つで読める4X4キーパッド(完成品) | |
税抜き小売価格 | 1380円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X4キーパッド(完成品)サポートページ |