SparkFunのTouch Shield(タッチシールド)を使ってみた(2)

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
目次へ  前のページへ (1) (2) 次のページへ
2016年09月04日 公開。

4.Touch Shieldを動かすためのサンプルスケッチ

前のページでTouch Shieldを組み立てる話を書いたので、次は、Touch Shieldを動かすためのソフトの話をします。

GitHubにTouch Shieldを動作させるためのサンプルスケッチがあります。ダウンロードするとTouch_shield-master.zipという.ZIPファイルがダウンロードできます。

最初、「これはTouch Shieldを動作させるためのライブラリだろう」と早合点して、Arduino IDE 1.6.11を起動し、スケッチ→ライブラリをインクルード→.ZIP形式のライブラリをインストールメニューでインストールしようとしました。そうすると、「指定されたフォルダ/zipファイルには有効なライブラリがありません」というエラーが出ました。(図1参照)

図1、サンプルスケッチをインストールしようとして出たエラー
図1、サンプルスケッチをインストールしようとして出たエラー

しばらく悩んだのですが、Touch ShieldのHookup GuideのCommunicating with the Shieldページをよく読むと、サンプルコードとは書いてありますが、ライブラリとはどこにも書いてありません。ダウンロードしたファイルを調べてみると、Touch_Shield_Exampleというフォルダの中に、Touch_Schield_Example.pdeというファイルと、4つのヘッダファイルがあったのでした。(図2参照)

図2、Touch_Shield_Exampleフォルダの中身
図2、Touch_Shield_Exampleフォルダの中身

このサンプルスケッチは、Touch Shieldのキーをタッチすると、シリアル出力にそのキーを表す文字(1のキーを押した場合は'1')を出力する物でした。

このTouch_Schield_Example.pdesetup関数とloop関数の部分を抜き出すと、次の様になっています。

リスト1、Touch_Schield_Example.pdeのsetup関数とloop関数を抜き出した物COPY
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関数は、次の様になっていました。

リスト2、getNumber関数COPY
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配列は、使われる場合でも、先頭の要素しか使われませんので、一体何をやりたいのかちょっと理解できません。

少しネットを検索すると、案の定、この関数をどう書き換えたら自分の求めるような動作をするのか分からないで困っている人がチラホラいました。

5.TouchShieldライブラリの紹介

そこで、もっと簡単に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ライブラリを使ってください。

目次へ  前のページへ (1) (2) 次のページへ

このページで使われている用語の解説

関連ページ

関連製品

I/Oピン一つで読める4X4キーパッドキット 商品名 I/Oピン一つで読める4X4キーパッドキット
税抜き小売価格 900円
販売店 スイッチサイエンス
サポートページ
I/Oピン一つで読める4X4キーパッド(完成品) 商品名 I/Oピン一つで読める4X4キーパッド(完成品)
税抜き小売価格 1380円
販売店 スイッチサイエンス
サポートページ
I/Oピン一つで読める4X5キーパッドキット 商品名 I/Oピン一つで読める4X5キーパッドキット
税抜き小売価格 2400円
販売店 スイッチサイエンス
サポートページ
Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。