Arduinoで4×4キーパッドを使う方法

知識勉強

本記事を読むと、Arduinoキーパッドを使えるようになります。使ってみたい方の手助けになれば幸いです。

キーパッドの使いどころ

キーパッドを使いたいなと思っている方は、押しボタンや、切り替えスイッチで動作するものを作ったことあるのではないでしょうか。なくても大丈夫です。

Aruduinoで作るものに、動作の変化をいっぱい与えようとすると、一個のボタンでON/OFFを判断するだけでは限界があります。工夫で、長押し判定や、短押し、2回押しなど、変化は付けれますが、操作が分かりにくくなります。

その点、キーパッドはボタンがいっぱいあるので、数値の入力もできるし、キーの表面にシールで「起動」とか動作をラベルしてあげれば、操作しやすくなります。

キーパッドの仕組み(理解して使いたい人向け)

とりあえず、動かしたい方は、次のセクションへGO!

キーパッドの構造(表面上

キーパッドは、物理的な押しボタンが、いっぱい並んでいるだけです。ただ並び方が少し変わっています。いろんな製品があります。今回使用する薄いやつや、キーボードみたいなスイッチのもの。押しボタンが配置されているものまで。

出典:Google画像検索

解説に、下記の製品のデータシートを引用させていただきます。


下記が、ボタンと端子の繋がり方
端子の1番から4番までが縦方向(COLS)の4列につながっています。
1番は縦ABCDに。2番は369#に。といったようにです。

端子の5番から8番は、横方向(ROWS)の4列につながっています。
5番は横*0#D。6番は789C。といったようにです。

キーパッドの中身

下記は実物の中身。
横と縦の線は、物理的につながっていません。途切れているのが見て取れます
表面のボタンを押すことで、をボタン裏面についてる導体を押し付けて、横と縦の線を導通させます。

たとえば、
左側の画像では
ボタンの4を押すと横側7番と縦側4番が導通します。放すと接続が切れます。
右側の画像では、
ボタンの9を押すと横側6番と縦側2番が導通します。

テスターお持ちの方は、
抵抗測定で、押すと0オーム、放すと抵抗無限大で測定不可であるとことを確認してみてください。

抵抗値の変化は、Arduinoでは検出が難しい

ボタンを押すことで、抵抗値が変化することは分かってもらえたでしょうか。
ただ、Arduinoは、抵抗値の変化を測定する機能はありません。

抵抗値の変化を、電圧値に置き換えて測定します。
たとえば、ボタンの4を検出するには、片方(例では端子7番)に+電圧を繋ぎ、片方(例では端子4番)の電圧を測定します。
ボタンが押されてないときは、繋がってないので、4番は0Vです。
ボタンが押されると、つながるので、+電圧が測定できます。

Arduinoが持つ機能で、
ピンから+電圧や0Vの電圧を出力したり、ピンに入力される+電圧や0Vの判断ができるので、それをプログラムで実現します。

余談ですが、Arduinoの入力ピンと設定したら、0Vも+電圧も、何も繋がっていない状態とするのは、入力がパラパラする原因になります。
今回、解説してるこの形状のものは、基本的に一番安いタイプ。接点以外は何もないです。

価格が高いものは、より安定して、簡単に使えるように、抵抗が入っていたり、ダイオードが入っていたりとします。

(参考、秋月電子

Arudino側で入力ピンの内部抵抗を有効にしているものと推測します。
(後述のadafruitさんのコードは、高度過ぎてよくわかりませんw)

プログラムで使うには

一から、プログラムを書いていては大変なので、英知の結集であるライブラリを使いましょう。

ライブラリマネージャーで、「keypad」と検索。
Keypad by Mark Stanley, Alexander Brevig。画像の左列。
こちらの方が、執筆時点では一番上で目に入ります。この表示順はダウンロード数順なのでしょうか?
もう一個は、私がよくお世話になる「 Adafruit」のもの。画像の右列。

下記コードがAdafruit_Keypadオリジナルのコード。
このままで使えます。ボタンを押しこんだ、離したが、判断できます。

#include "Adafruit_Keypad.h"

const byte ROWS = 4; // rows
const byte COLS = 4; // columns
//define the symbols on the buttons of the keypads
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {11, 10, 9, 8}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Adafruit_Keypad customKeypad = Adafruit_Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

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

}

void loop() {
  // put your main code here, to run repeatedly:
  customKeypad.tick();

  while(customKeypad.available()){
    keypadEvent e = customKeypad.read();
    Serial.print((char)e.bit.KEY);
    if(e.bit.EVENT == KEY_JUST_PRESSED) Serial.println(" pressed");
    else if(e.bit.EVENT == KEY_JUST_RELEASED) Serial.println(" released");
  }

  delay(10);
}

キーについて
■キーの横縦の数
3行目のROWSが横の数
4行目のCOLSが縦の数

■ボタンの配置
6行目から下にあるキーの並び。

■KeypadとArduinoをつなぐ端子
12、13行目は、Arduinoの端子番号が記載されてます。自分のつなぎたいところに変えて大丈夫。

下図の通りつなぐなら

ROWSは横側、Keypadの端子の8番から5番を、順番にArduinoのデジタル出力ピン5,4,3,2。
COLSは縦側、Keypadの端子の4番から1番を、順番にArduinoのデジタル出力ピン11,10,9,8。

keypadの端子番号と、Arudinoのポート番号を間違えないように。

最後に

昔に買ってずっと眠らせてたものなんですが、最初に試したときは、すべてのキーが反応しませんでした。一番右に並んでいるABCDの4キーしか反応せず。

調査のため、めくってみた結果が、記事に貼り付けた写真。
おかげで良い素材が撮れましたw

結局、原因は分からず、導通チェックして、断線?していそうな箇所は見つかりました。
下の画像の位置。

不明ですが、指で押さえると、問題なくスイッチが反応するようになりました。
同じ人いるのかな?

持っている顕微鏡で観察してみました。
確かに割れているようなところが、画像中央付近に見て取れます

この記事を書いた人
ユカタキ

私、気になります!
自分でやってみたくなる性格の私は、電子工作、プログラム、3Dプリンター関連の事などの情報を発信しています。
社会人から電子工作を始め14年、電験3種一発合格、2021年から3DプリンタをDIYに活用。
そんな私が、まだまだ調べながらではありますが、ほかのDIYユーザー皆さんのためになるようなことを心がけています

ユカタキをフォローする
知識勉強
ユカタキをフォローする

コメント