2017年05月15日 | 公開。 |
TwiKeypadライブラリが対応するキーパッドは、I2Cアドレスが重ならない様に設定すれば、複数のキーパッドをArduinoに接続する事ができます。ここでは、その方法について説明します。
複数のキーパッドを配線する場合、図20の配線図に従って、配線してください。
Arduinoの側の電源端子を3.3Vにつなぐか5Vにつなぐかは、使用するArduinoのI/O電圧に合わせて決めてください。
図20の様な配線をすると、各信号線を、キーパッドの数だけ分配する必要があります。写真4の様に、ブレッドボードで分配したり、信号を分配するための専用線を自作するなど、工夫してください。
なおGroveを使える場合は、写真5の様に簡単に配線を分配する事ができます。
I2Cアドレスがそれぞれ08Hと09Hの2つのキーパッドを接続し、両方のキーパッドのキーを読み取って、押されたキーをシリアルモニタ上に表示するスケッチを、リスト8に示します。このスケッチは、 Arduino IDEでファイル→スケッチ例→TwiKeypad→MultiKeypadメニューを選んでも開けます。
/*
MultiKeypad.ino
This sketch describes how to use plural keypads.
*/
// include libraries
#include <Wire.h>
#include <TwiKeypad.h>
// variables
TwiKeypad keypad1,keypad2; // keypad objects
const int TwiAdr1=8, TwiAdr2=9; // keypads' TWI(I2C) Addresses
// functions
void setup()
{
Wire.begin();// initialize TWI as master.
keypad1.begin(Wire,TwiAdr1); // initialize keypad1.
keypad2.begin(Wire,TwiAdr2); // initialize keypad2.
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;
// keypad1
key=keypad1.GetKey();
if(key>=0) {
Serial.print("Keypad1-SW");
Serial.println(key+1);
} // if
// keypad2
key=keypad2.GetKey();
if(key>=0) {
Serial.print("Keypad2-SW");
Serial.println(key+1);
} // if
} // loop
キーパッドが1つの場合は、TwiKeypad型のオブジェクト変数を1つだけ作ったのですが、2つのキーパッドを使う場合は、keypad1とkeypad2という2つの変数を作ります。
TwiKeypad keypad1,keypad2; // keypad objects
そして、keypad1と、keypad2を別々のI2Cアドレスで初期化します。
keypad1.begin(Wire,TwiAdr1); // initialize keypad1.
keypad2.begin(Wire,TwiAdr2); // initialize keypad2.
この例では、keypad1をアドレスTwiAdr1(別の行で8と宣言されている定数)で、keypad2をアドレスTwiAdr2(別の行で9と宣言されている定数)で、初期化しています。これにより、アドレス08Hのキーパッドはkeypad1というオブジェクト変数で、アドレス09Hのキーパッドはkeypad2というオブジェクト変数で、それぞれ扱えるようになります。
押されたキーを読み取るには、GetKey関数かGetChar関数を使います。リスト8の例では、GetKey関数を使っています。
WaitForKey関数とWaitForChar関数はキーが押されるまで関数から帰ってこないので、複数のキーパッドを使う時は、使用できません。1つのキーパッドの状態をWaitForKey関数やWaitForChar関数で読み取ると、そのキーパッドで何かキーが押されるまで、別のキーパッドの状態を読みに行けないからです。
key=keypad1.GetKey();
if(key>=0) {
Serial.print("Keypad1-SW");
Serial.println(key+1);
} // if
上の処理で、アドレスが08HのキーパッドのキーをGetKey関数で読み取り、処理しています。キーが押されていれば、"Keypad1-"と押されたスイッチ番号を表示し、キーが押されていなければ、何も表示せずに次の処理に移ります。
key=keypad2.GetKey();
if(key>=0) {
Serial.print("Keypad2-SW");
Serial.println(key+1);
} // if
上の処理で、アドレスが09HのキーパッドのキーをGetKey関数で読み取り、処理しています。キーが押されていれば、"Keypad2-"と押されたスイッチ番号を表示し、キーが押されていなければ、何も表示せずに次の処理に移ります。
参考までに、アドレス08Hのキーパッド(Keypad1)のSW6とSW11を順に押し、次にアドレス09Hのキーパッド(Keypad2)のSW2とSW14を順に押した場合のシリアルモニタの表示を、図21に示します。
![]() |
商品名 | I2C接続4X4キーパッド |
税抜き小売価格 | 2400円 | |
販売店 | スイッチサイエンス マルツ | |
サポートページ | I2C接続4×4キーパッドサポートページ |