2017年05月10日 | 公開。 |
既に紹介したbegin関数とWaitForKey関数を除く、TwiKeypadライブラリの主な関数を紹介します。
WaitForChar関数は、引数がなく、char型の返り値を返す関数です。
WaitForChar関数は、キーを読み取り、もしキーが押されていなければ、押されるまで待つという点ではWaitForKey関数と同じですが、返り値が違います。WaitForKey関数はキーのSW番号-1を返しましたが、WaitForChar関数は、キーに割り当てられている文字を返します。
I2C接続4×4キーパッドの場合、各スイッチに表1の様にキーが割り当てられています。また参考までに、I2C接続4×4キーパッドのキー部分の写真を写真3に示します。(他のキーパッドを使用する場合は、それぞれのマニュアルやサポートページにキー割り当てが書いてあります)
SW番号 | 割り当てられた文字 |
---|---|
SW1 |
* |
SW2 | 0 |
SW3 | # |
SW4 | D |
SW5 | 7 |
SW6 | 8 |
SW7 | 9 |
SW8 | C |
SW9 | 4 |
SW10 | 5 |
SW11 | 6 |
SW12 | B |
SW13 | 1 |
SW14 | 2 |
SW15 | 3 |
SW16 | A |
WaitForKey関数の場合、SW1(*のキー)を押すと0が返りましたが、WaitForCharの場合は'*'が返ります。
アドレスを08Hに設定したキーパッドから押されたキーを読み取り、そのキーに割り当てられた文字をシリアルモニタに表示するスケッチを、リスト3に示します。このスケッチは、Arduino IDE上からファイル→スケッチ例→TwiKeypad→WaitForCharメニューを選択する事でも開けます。
/*
WaitForChar.ino
This sketch demonstrates how WaitForChar 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()
{
Serial.print(keypad.WaitForChar());
} // loop
リスト3をArduinoに書き込んだ状態で、1、2、3、Aの順でキーを押すと、シリアルモニタの表示は図17の様になります。
GetKey関数は、引数がなく、int8_t型(符号付8ビット整数)の返り値を返す関数です。
GetKey関数は、WaitForKey関数と同様、キーを読み取り、SW番号-1を返します。(例えばSW5が押されていたら4を返します) ただしGetKey関数は、キーが押されていない時に呼ぶと、キーが押されるまで待たずに、負の数を返します。
リスト1と同様、アドレスが08Hのキーパッドから押されたキーを読み取って、そのSW番号をシリアルモニタ上に表示するスケッチを、GetKey関数を使って作った物をリスト4に示します。このスケッチは、Arduino IDE上からファイル→スケッチ例→TwiKeypad→GetKeyメニューを選択する事でも開けます。
リスト4はGetKey関数を使っているため、返り値が0以上かどうかをチェックしている点に注目してください。
/*
GetKey.ino
This sketch demonstrates how GetKey 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.GetKey();
if(key>=0) {
Serial.print("SW");
Serial.println(key+1);
} // if
} // loop
GetChar関数は、引数がなく、char型の返り値を返す関数です。
GetChar関数は、WaitForChar関数と同様、押されたキーを読み取り、そのキーに割り当てられた文字を返します。ただしGetChar関数は、キーが押されていない時に呼ぶと、キーが押されるまで待たずに、'\0'(NULL文字)を返します。
リスト3と同様、アドレスが08Hのキーパッドからキーを読み取り、読み取ったキーに割り当てられた文字をシリアルモニタ上に表示するスケッチを、GetChar関数を使って作った物を、リスト5に示します。このスケッチは、Arduino IDE上からファイル→スケッチ例→TwiKeypad→GetCharメニューを選択する事でも開けます。
リスト5はGetChar関数を使っているため、返り値が'\0'かどうかをチェックしている点に注目してください。
/*
GetChar.ino
This sketch demonstrates how GetChar 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()
{
char c=keypad.GetChar();
if(c!='\0') {
Serial.print(c);
} // if
} // loop
GetKeyNum関数は、引数がなく、int8_t(8ビット符号付整数)の返り値を返す関数です。
GetKeyNum関数は、キーパッドに付いているキーの数を返します。例えばキーが16個付いているI2C接続4×4キーパッドを使っている場合は、必ず16を返します。
GetKeyState関数は、引数がなく、uint32_t型(32ビット符号なし整数)の返り値を返す関数です。
GetKeyState関数は、各キーが、関数呼び出し時点でONになっている(押されている)のか、OFFになっている(押されていない)のかの状態を取得します。
GetKey関数やGetChar関数が、キーが押された瞬間を判定するに対し、GetKeyState関数は、関数が呼ばれた時点でスイッチがONになっているかOFFになっているかを判定します。そのため、GetKeyState関数はキーバッファと無関係に動作し、例えば過去にキーが押されて、キーバッファにその情報が残っている状態でGetKeyState関数を呼びだしても、呼び出し時点でスイッチがOFFになっていれば、キーが押されていないと判定します。
GetKeyState関数は、複数のキーが同時に押されていても、それらを正しく判定できるため、ゲームのキャラクターをキーパッドで動かす様な場合に便利です。
GetKeyState関数の返り値には、各キーの状態が、返り値の各ビットに割り当てられた状態で返ってきます。SW1の情報は第0ビット(最下位ビット)、SW2の情報は第1ビット、SW3の情報は第2ビット…という具合に、割り当てられ、スイッチがON(押されている)ならば該当ビットが1に、OFF(押されていない)なら該当ビットは0になります。
例として、SW2とSW4とSW7が同時に押されている状態でGetKey関数を呼ぶと、1になるビットは第1ビットと第3ビットと第6ビットなので、返り値は0000000001001010B(004AH)になります。
GetKeyState関数により、アドレス08Hのキーパッドの全キーの状態を読み出し、その結果を画面に表示するスケッチをリスト6に示します。このスケッチは、Arduino IDE上からファイル→スケッチ例→TwiKeypad→GetKeyStateメニューを選択する事でも開けます。
スケッチを実行し、SW2とSW4とSW7を押した場合のシリアルモニターの表示を図18に示します。0または1の数字が1行に16個、4桁区切りで表示されていますが、左から順にSW1、SW2、SW3、…、SW16の状態を表しています。0が表示されている場合は、そのスイッチが押されていない事を、1が表示されている場合はそのスイッチが押されている事を表わしています。
図18を見ると、ちゃんと左から2番目、4番目および7番目の数字が1になっており、残りの数字は0になっている事が分かります。
/*
GetKeyState.ino
This sketch demonstrates how GetKeyState 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()
{
int kn=keypad.GetKeyNum(); // get number of keys on the keypad.
uint32_t ks=keypad.GetKeyState(); // get states of keys
// print state of each key
for(int i=0; i<kn; i++) {
if(i>0 && i%4==0) Serial.print(' ');
Serial.print((ks>>i)&1);
} // for i
Serial.println();
} // loop
SetRepeat関数はuint8_t型(8ビット符号なし整数)の引数2つを取り、int8_t型(8ビット符号付整数)の返り値を返す関数です。
SetRepeat関数は、キーリピート(同じキーをしばらく押していると、そのキーを連打したのと同様になる機能)の設定を行います。第1引数がキーリピートが始まるまでの時間を、第2引数がキーリピートの間隔を示します。時間の単位は0.04秒です。
例えば
keypad.SetRepeat(25,2);
とすれば、キーを押してから25×0.04=1秒後にキーリピートが始まり、キーリピートの間隔が2×0.04=0.08秒になります。
二つの引数の内、少なくとも一方に0を指定すると、キーリピート機能が無効になります。
なお、Arduinoのリセット直後は、キーリピート機能はOFFになっていますので、キーリピート機能を使いたい場合は、begin関数でキーパッドを初期化した後に、SetRepeat関数でキーリピート機能を有効にする必要があります。
また、キーリピート機能はキーが押された情報をキーバッファに格納する際に働くため、キーバッファに無関係に動作するGetKeyState関数の結果には影響を与えません。
リスト7は、リスト3と同様、アドレスを08Hに設定したキーパッドから、WaitForChar関数でキーを読み取り、それをシリアルモニタ上に表示するスケッチですが、setup関数内でSetRepeat関数を呼び出し、キーリピート機能を有効にしている点が異なります。このスケッチは、Arduino IDE上からファイル→スケッチ例→TwiKeypad→KeyRepeatメニューを選択する事でも開けます。
リスト7を実行し、3のキーを押し続けた場合のシリアルモニタの表示を図19に示します。
/*
KeyRepeat.ino
This sketch explains how to enable key repeat.
*/
// 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.
keypad.SetRepeat(25,2); // enable key repeat.
Serial.begin(9600); // initialize serial port at 9600bps.
while(!Serial); // wait for serial port to connect.
Serial.println("Press keys.");
} // setup
void loop()
{
Serial.print(keypad.WaitForChar());
} // loop
次のページでは、複数のキーパッドをArduinoに接続して使う方法について説明します。
![]() |
商品名 | I2C接続4X4キーパッド |
税抜き小売価格 | 2400円 | |
販売店 | スイッチサイエンス マルツ | |
サポートページ | I2C接続4×4キーパッドサポートページ |