2017年05月09日 | 公開。 |
キーパッドからキーを読み取ってシリアルモニタに表示するスケッチをリスト1に示します。このスケッチは、Arduino IDEのファイル→スケッチ例→TwiKeypad→WaitForKeyメニューを選択する事でも開く事ができます。(図12参照)
/*
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
なお、Arduino M0など、Serial変数ではシリアルモニタに情報を出力できず、SerialUSB変数を使う必要がある機種では、リスト1の中のSerialを全てSerialUSBに書き換える必要があります。この連載で出てくる他のリストにおいても、この書き換えは必要です。
キーパッドのI2Cアドレスを08Hに設定して(写真1)Arduinoと接続し(写真2)、ArduinoとパソコンをUSBケーブルで接続し、ツール→シリアルポートメニュー(Arduino IDEのバージョンによってはツール→ポートメニュー)でシリアルポートの設定を行ってください。(図13参照)
I2C接続4×4キーパッドの場合は、J1とJ2にジャンパ線を付けない事で、I2Cアドレスが08Hになります。他のキーパッドの場合は、それぞれのマニュアルをご覧ください。
注:この例ではCOM10を選んでいますが、実際にはご自分の環境にあった設定にしてください。
マイコンボードの設定を行い、スケッチをArduinoに書き込んでから、ツール→シリアルモニタメニューでシリアルモニタを起動してください。(図14参照) シリアルモニタが起動すると、図15の様に"Press keys."というメッセージが表示されるはずです。
注:うまくメッセージが表示されない場合は、シリアルモニタ右下の選択欄で、通信速度が9600bpsになっている事を確認してください。
この状態でキーパッドのキーを押せば、押したスイッチの番号がシリアルモニタに表示されます。例えば、SW3、SW5、SW12の順にキーを押すと、図16の様な表示になります。
それでは、リスト1の解説をします。
TwiKeypadライブラリを使うスケッチは、冒頭部分でWire.hとTwiKeypad.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.
次にオブジェクト変数keypadのbegin関数を使って、キーパッドの初期化を行なっています。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のスケッチは動作しています。
TwiKeypadライブラリに対応したキーパッドは、内部にキーバッファ(押されたキーの情報を記憶するFIFOメモリ)を持っています。例えばI2C接続4×4キーパッドの場合、15文字分のキーバッファを持っています。キーを押すと、その情報は、まずキーバッファに記録されます。
注:ただし、キーバッファがいっぱいの場合はキーを押してもその情報は廃棄されます。
WaitForKey関数は、キーパッド内のキーバッファを調べ、キーバッファにボタンを押した記録があれば、最初の記録を取得します。そしてその記録にあるスイッチ番号を返り値として返します。
もしキーバッファが空の状態でWaitForKey関数を呼ぶと(キーがなにも押されていない状態でWaitForKey関数を呼ぶと)、WaitForKey関数は、何かキーが押されてキーバッファに情報が書き込まれるまで待機します。そして、書き込まれた記録を取得し、返り値として返します。
このキーバッファがあるおかげで、Arduinoが何らかの処理に忙しく、しばらくWaitForKey関数を呼び出せない事があっても、その間に押されたキーを読みこぼす事がありません。
キーバッファの働きを確かめるには、delay関数を使って、WaitForKey関数を呼び出す頻度を落としてみれば分かります。
リスト1のloop関数を、リスト2の様に書き換えてください。
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ライブラリの主な関数について説明します。
商品名 | I2C接続4X4キーパッド | |
税抜き小売価格 | 2400円 | |
販売店 | スイッチサイエンス マルツ | |
サポートページ | I2C接続4×4キーパッドサポートページ |