つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション18 ~ キーパッド入力

1. キーパッドによる入力

 今回はキーパッド入力について取り上げてみようと思う。キーパッドはセキュリティがかかっているドアなどでよくみかけると思う。

2. キーパッドの接続

 Tinkercadからキーパッド(4x4)を選択する。キーパッドの行1~行4をArduinoの9~6ピン、列1~列4を5~2ピンに接続する。

キーパッドとの接続
キーパッドとの接続
列(Row)と行(col)の関係を示す。(通常の行列の関係と逆に見える)ボタンが押されると、押されたボタンの列・行の配線の信号応答が生ずる。Arduinoを用いてテンキーパッドを使ってみる | 物を作る者

3. スケッチ

 押されたキーパッドのキーをシリアルモニタに表示するためのスケッチを以下に示す。キーパッドを動作させるために#include <Keypad.h>としてライブラリをロードする。キーパッドのボタン配列を定義するために2次元配列char keys[ROWS][COLS]を用いてボタンの種類と位置を記述する。ROW/COLが接続しているピンを指定するため、それぞれ1次元配列を用いて rowPins[ROWS], colPins[COLS]を用いる。最後に Keypad keypad=Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS);としてキー配列を初期化する。loop関数内でkey=keypad.getkey();とすることでキーパッドが押されたときのキーを返すことができる。

#include <Keypad.h>
const byte ROWS = 4; //列数
const byte COLS = 4; //行数
 
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
}; //キーパッドの配列

byte rowPins[ROWS] = {9,8,7,6}; // ROWが接続しているピン
byte colPins[COLS] = {5,4,3,2}; // COLが接続しているピン

Keypad keypad=Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS); //上記に基づいてキー配列を初期化

void setup()
{
  Serial.begin(9600);
}

void loop()
{
 char key = keypad.getKey(); //押されたキーを返す
 
  if (key != NO_KEY){
    Serial.println(key);
  }
}

3. セキュリティ入力

 上のキーパッド入力を応用して、暗証番号4桁のセキュリティ入力する例を示す。(Arduino with Keypad Tutorial - ElectroSchematics.comを少し改変) 重複はあるが、前半部もそのまま掲載する。下のスケッチではchar KEY[4] = {'1','2','3','4'};を解除コードとして、キーパッドに入力されたキーの配列attempt[4];と比較して正しければシリアルモニタ上に"KEY ACCEPTED..."誤っている場合は"KEY REJECTED!"と表示するようになっている。入力方法は最初に*を押してスタートして4桁入力して終わったら#を押す。関数void checkKEY()で入力キーの比較、シリアルモニタの表示、比較後のattempt[]の初期化を行う。また関数void readKeypad()では*が押された場合、z=0;としてattempt[z]の先頭アドレスを指定し、#が押された場合はcheckKEY()を呼び出す。それ以外はattempt[z]=key;としてattempt[z]に押されたキーを格納して、zをインクリメントして次の桁が入力できるようにする。loop関数内で readKeypad()を呼び出して実行する。

#include <Keypad.h>
const byte ROWS = 4; 
const byte COLS = 4; 
 
char keys[COLS][ROWS] = {

  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {9,8,7,6}; 
byte colPins[COLS] = {5,4,3,2}; 

Keypad keypad=Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS);

char KEY[4] = {'1','2','3','4'}; 
char attempt[4] = {0,0,0,0};
int z=0;

void setup()
{
  Serial.begin(9600);

}

void checkKEY()
{
   int correct=0;
   int i;
   for ( i = 0; i < 4 ; i++ )
   {
      if (attempt[i]==KEY[i])
      {
         correct++;
      }
   }
   if (correct==4)
   {
      Serial.println(" KEY ACCEPTED...");
   }
   else
   {
      Serial.println("KEY REJECTED!");
   }
   for (int zz=0; zz<4; zz++) // attemptを1桁づつ初期化(0)
   {
      attempt[zz]=0;
   }
}
void readKeypad()
{
   char key = keypad.getKey();
   if (key != NO_KEY)
   {
      switch(key)
      {
      case '*':
         z=0;
         break;
      case '#':
         delay(100);
        checkKEY();
         break;
      default:
         attempt[z]=key;
         z++;
      }
   }
}
void loop()
{
   readKeypad();
}

4. まとめ

 今回はキーパッド入力の方法とそれを応用した4桁のセキュリティ入力について取り上げた。