2016年09月04日 | 公開。 |
前のページでTouch Shieldを組み立てる話を書いたので、次は、Touch Shieldを動かすためのソフトの話をします。
GitHubにTouch Shieldを動作させるためのサンプルスケッチがあります。ダウンロードするとTouch_shield-master.zipという.ZIPファイルがダウンロードできます。
最初、「これはTouch Shieldを動作させるためのライブラリだろう」と早合点して、Arduino IDE 1.6.11を起動し、スケッチ→ライブラリをインクルード→.ZIP形式のライブラリをインストールメニューでインストールしようとしました。そうすると、「指定されたフォルダ/zipファイルには有効なライブラリがありません」というエラーが出ました。(図1参照)
しばらく悩んだのですが、Touch ShieldのHookup GuideのCommunicating with the Shieldページをよく読むと、サンプルコードとは書いてありますが、ライブラリとはどこにも書いてありません。ダウンロードしたファイルを調べてみると、Touch_Shield_Exampleというフォルダの中に、Touch_Schield_Example.pdeというファイルと、4つのヘッダファイルがあったのでした。(図2参照)
このサンプルスケッチは、Touch Shieldのキーをタッチすると、シリアル出力にそのキーを表す文字(1のキーを押した場合は'1')を出力する物でした。
このTouch_Schield_Example.pdeのsetup関数とloop関数の部分を抜き出すと、次の様になっています。
void setup()
{
//make sure the interrupt pin is an input and pulled high
pinMode(irqpin, INPUT);
digitalWrite(irqpin, HIGH);
//configure serial out
Serial.begin(9600);
//output on ADC4 (PC4, SDA)
DDRC |= 0b00010011;
// Pull-ups on I2C Bus
PORTC = 0b00110000;
// initalize I2C bus. Wiring lib not used.
i2cInit();
delay(100);
// initialize mpr121
mpr121QuickConfig();
// Create and interrupt to trigger when a button
// is hit, the IRQ pin goes low, and the function getNumber is run.
attachInterrupt(0,getNumber,LOW);
// prints 'Ready...' when you can start hitting numbers
Serial.println("Ready...");
}
void loop()
{
//You can put additional code here. The interrupt will run in the backgound.
}
注目すべきは、loop関数で何もやっていない事です。setup関数内で、キーがタッチまたはリリースされた時に発生するINT0割り込みのサービスルーチン(getNumber関数)を登録し、どのキーがタッチされたかを読んでシリアル出力する一連の動作は、割り込みルーチン内で全部処理していたのです。
割り込み処理を行うgetNumber関数は、次の様になっていました。
void getNumber()
{
int i = 0;
int touchNumber = 0;
uint16_t touchstatus;
char digits[DIGITS];
touchstatus = mpr121Read(0x01) << 8;
touchstatus |= mpr121Read(0x00);
for (int j=0; j<12; j++) // Check how many electrodes were pressed
{
if ((touchstatus & (1<<j)))
touchNumber++;
}
if (touchNumber == 1)
{
if (touchstatus & (1<<SEVEN))
digits[i] = '7';
else if (touchstatus & (1<<FOUR))
digits[i] = '4';
else if (touchstatus & (1<<ONE))
digits[i] = '1';
else if (touchstatus & (1<<EIGHT))
digits[i] = '8';
else if (touchstatus & (1<<FIVE))
digits[i] = '5';
else if (touchstatus & (1<<TWO))
digits[i] = '2';
else if (touchstatus & (1<<NINE))
digits[i] = '9';
else if (touchstatus & (1<<SIX))
digits[i] = '6';
else if (touchstatus & (1<<THREE))
digits[i] = '3';
Serial.print(digits[i]);
i++;
}
//do nothing if more than one button is pressed
else if (touchNumber == 0)
;
else
;
}
ご覧の様にキーをデコードして、Serial.print関数で結果を出力しています。これを書き換えて、自分の好きな様にカスタマイズしろという事なのでしょうが、初心者に割り込みのプログラムをいじらせるのはちょっと酷です。それに、この関数は、digitsというchar型の配列を要素数11で宣言していますが(定数DIGITSは他の所で11と定義されています)、digits配列は、使われる場合でも、先頭の要素しか使われませんので、一体何をやりたいのかちょっと理解できません。
少しネットを検索すると、案の定、この関数をどう書き換えたら自分の求めるような動作をするのか分からないで困っている人がチラホラいました。
そこで、もっと簡単にTouch Shieldを使える、TouchShieldライブラリというのを、自力で作りました。(発売されたのが何年か前のシールドで、現在ユーザーがどの位の数いるのか不明ですし、自分の作ったシールドでもないのに、なぜ一所懸命ライブラリを開発するのか自分でも分からないのですが、どういう訳か無性に作りたくなりました)
Touch Shieldライブラリを使うと、割り込み処理は完全にユーザーから隠蔽されます。そして、次の様に3ステップで、簡単にタッチしたキーが取得できます。
TouchShield ts; // Touch Shieldを制御するためのオブジェクト変数(ts)を宣言
ts.init(); // Touch Shieldを初期化
char c=ts.read(); // Touch Shieldからキーを変数cに読み出し(キーがタッチされていなければ'\0'が読み出される)
もしこれからTouch Shieldを使ってみようという様な方がいらっしゃいましたら、ぜひTouchShieldライブラリを使ってください。
商品名 | I/Oピン一つで読める4X4キーパッドキット | |
税抜き小売価格 | 900円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X4キーパッドキットサポートページ |
商品名 | I/Oピン一つで読める4X4キーパッド(完成品) | |
税抜き小売価格 | 1380円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X4キーパッド(完成品)サポートページ |
商品名 | I/Oピン一つで読める4X5キーパッドキット | |
税抜き小売価格 | 2400円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X5キーパッドキットサポートページ |