TwiKeypadライブラリユーザーマニュアル(2)

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

4.キーを読み取るスケッチを動かしてみる

キーパッドからキーを読み取ってシリアルモニタに表示するスケッチをリスト1に示します。このスケッチは、Arduino IDEファイル→スケッチ例→TwiKeypad→WaitForKeyメニューを選択する事でも開く事ができます。(図12参照)

リスト1、WaitForKeyスケッチ(読み取ったキーをシリアルモニタに表示するスケッチ)COPY
/*
  WaitFortKey.ino
  
  This sketch demonstrates how WaitForKey function works.
*/

// include libraries
#include <Wire.h>
#include <TwiKeypad.h>

// variables
TwiKeypad keypad; // keypad object
const int TwiAdr=8; // keypad's TWI(I2C) Address

// functions
void setup()
{
  Wire.begin();// initialize TWI as master.
  keypad.begin(Wire,TwiAdr); // initialize keypad.
  Serial.begin(9600); // initialize serial port at 9600bps.
  while(!Serial); // wait for serial port to connect.
  Serial.println("Press keys.");
} // setup

void loop()
{
  int8_t key=keypad.WaitForKey();
  Serial.print("SW");
  Serial.println(key+1);
} // loop
図12、WaitForKeyスケッチを開く
図12、WaitForKeyスケッチを開く

なお、Arduino M0など、Serial変数ではシリアルモニタに情報を出力できず、SerialUSB変数を使う必要がある機種では、リスト1の中のSerialを全てSerialUSBに書き換える必要があります。この連載で出てくる他のリストにおいても、この書き換えは必要です。

キーパッドのI2Cアドレスを08Hに設定して(写真1)Arduinoと接続し(写真2)、ArduinoとパソコンをUSBケーブルで接続し、ツール→シリアルポートメニュー(Arduino IDEのバージョンによってはツール→ポートメニュー)でシリアルポートの設定を行ってください。(図13参照)

写真1、I2Cアドレスを08Hに設定する(I2C接続4×4キーパッドの場合)
↑ 画像をクリックすると拡大
写真1、I2Cアドレスを08Hに設定する(I2C接続4×4キーパッドの場合)

I2C接続4×4キーパッドの場合は、J1とJ2にジャンパ線を付けない事で、I2Cアドレスが08Hになります。他のキーパッドの場合は、それぞれのマニュアルをご覧ください。

写真2、キーパッドとArduinoの接続
↑ 画像をクリックすると拡大
写真2、キーパッドとArduinoの接続

この例では、I2C接続4×4キーパッドとArduino Leonardoを接続しています。

図13、シリアルポートの設定
図13、シリアルポートの設定

注:この例ではCOM10を選んでいますが、実際にはご自分の環境にあった設定にしてください。

マイコンボードの設定を行い、スケッチをArduinoに書き込んでから、ツール→シリアルモニタメニューでシリアルモニタを起動してください。(図14参照) シリアルモニタが起動すると、図15の様に"Press keys."というメッセージが表示されるはずです。

注:うまくメッセージが表示されない場合は、シリアルモニタ右下の選択欄で、通信速度が9600bpsになっている事を確認してください。

図14、シリアルモニタの起動
図14、シリアルモニタの起動
図15、シリアルモニタ起動直後の表示
図15、シリアルモニタ起動直後の表示

この状態でキーパッドのキーを押せば、押したスイッチの番号がシリアルモニタに表示されます。例えば、SW3、SW5、SW12の順にキーを押すと、図16の様な表示になります。

図16、SW3、SW5、SW12の順にキーを押した時の表示
図16、SW3、SW5、SW12の順にキーを押した時の表示
広告

5.キーを読み取るスケッチの解説

それでは、リスト1の解説をします。

TwiKeypadライブラリを使うスケッチは、冒頭部分でWire.hTwiKeypad.hの2つのヘッダをインクルードする必要があります。リスト1では次の様にインクルードしています。

#include <Wire.h>
#include <TwiKeypad.h>

Wire.hはI2Cインターフェースを使う時に必要となるヘッダファイルです。

TwiKeypadライブラリを使う時は、必ずTwiKeypad型のオブジェクト変数を宣言する必要があります。変数名はなんでもいいですが、慣例としてkeypadを使います。リスト1では次の様にkeypad変数を宣言しています。

TwiKeypad keypad; // keypad object

以後、このkeypadという名のオブジェクト変数を通じて、キーパッドの制御を行います。

リスト1では、次にキーパッドのI2Cアドレスを定義しています。アドレス8を使うので、次の様になっています。

const int TwiAdr=8; // keypad's TWI(I2C) Address

上の行を書き換えれば、別のI2Cアドレスに設定したキーパッドが使えるようになります。

setup関数の中では、まず次の様にして、I2Cインターフェースをマスターモードで初期化しています。

  Wire.begin();// initialize TWI as master.

次にオブジェクト変数keypadbegin関数を使って、キーパッドの初期化を行なっています。begin関数の第1引数には使用するWireライブラリのオブジェクト変数(Wire)を、第2引数には使用するキーパッドのI2Cアドレスを指定します。

  keypad.begin(Wire,TwiAdr); // initialize keypad.

次にシリアルポートを9600bpsで初期化しています。

  Serial.begin(9600); // initialize serial port at 9600bps.
  while(!Serial); // wait for serial port to connect.

次に、シリアルポートに"Press keys."というメッセージを送信しています。

  Serial.println("Press keys.");

これでsetup関数は終わりです。

loop関数の冒頭では、keypad変数のWaitForKey関数を呼び出して、キーを読み取っています。読み取った結果は、int8_t型(8ビット符号付整数)の変数keyに代入されます。なお、このWaitForKey関数は、何かキーが押されるまで、処理を戻しません。(ブロッキングI/O)

  int8_t key=keypad.WaitForKey();

上の行の実行が終わるのは、必ず何かのキーが押された直後です。変数keyには押されたSW番号−1が入ります。例えば、SW1が押されればkeyは0、SW8が押されればkeyは7となります。

最後に、変数keyの内容を基に、押されたキーのSW番号を表示しています。

  Serial.print("SW");
  Serial.println(key+1);

以上の様な仕組みで、リスト1のスケッチは動作しています。

6.キーバッファについて

6-1.キーバッファの働き

TwiKeypadライブラリに対応したキーパッドは、内部にキーバッファ(押されたキーの情報を記憶するFIFOメモリ)を持っています。例えばI2C接続4×4キーパッドの場合、15文字分のキーバッファを持っています。キーを押すと、その情報は、まずキーバッファに記録されます。

注:ただし、キーバッファがいっぱいの場合はキーを押してもその情報は廃棄されます。

WaitForKey関数は、キーパッド内のキーバッファを調べ、キーバッファにボタンを押した記録があれば、最初の記録を取得します。そしてその記録にあるスイッチ番号を返り値として返します。

もしキーバッファが空の状態でWaitForKey関数を呼ぶと(キーがなにも押されていない状態でWaitForKey関数を呼ぶと)、WaitForKey関数は、何かキーが押されてキーバッファに情報が書き込まれるまで待機します。そして、書き込まれた記録を取得し、返り値として返します。

このキーバッファがあるおかげで、Arduinoが何らかの処理に忙しく、しばらくWaitForKey関数を呼び出せない事があっても、その間に押されたキーを読みこぼす事がありません。

6-2.キーバッファの動作の確認

キーバッファの働きを確かめるには、delay関数を使って、WaitForKey関数を呼び出す頻度を落としてみれば分かります。

リスト1のloop関数を、リスト2の様に書き換えてください。

リスト2、キーバッファの働きを確認するスケッチ(リスト1と違う部分のみを示す)COPY
void loop()
{
  delay(1000); // wait for 1s.
  int8_t key=keypad.WaitForKey();
  Serial.print("SW");
  Serial.println(key+1);
} // loop

delay(1000);が入ったことで、WaitForKey関数は1秒に1回の頻度でしか呼び出されなくなってしまいました。この状態でキーパッドのキーをいくつか立て続けに押すと、表示が遅れるものの、押したキーはすべて表示される事が分かると思います。これがキーバッファの働きです。

次のページでは、TwiKeypadライブラリの主な関数について説明します。

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

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

関連製品

I2C接続4X4キーパッド 商品名 I2C接続4X4キーパッド
税抜き小売価格 2400円
販売店 スイッチサイエンス マルツ
サポートページ
Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。