
Aitendoの「I2Cキーバッドきっと」
I2Cキーバッドとは
I2Cで入力キーを取得できる4×4キーバッドです。これまで、アナログ電圧値式の3x4キーパッドを使っていましたが、下記の点が気になっていたので、調査のため購入してみました。
16キーだと電圧幅が少なくて誤認識しそう(特に3.3vの場合)
2キー以上の同時押しが取得できない
ハードウェアの所見
基板サイズが微妙に半端
切りのよい寸法でも良さそうですが、微妙に半端です。キートップは別に購入が必要
キーベースは付属しますICはソケットなしの直付けハンダのほうが良いかも
結構、高さを取るので、3Dプリンタ―でケースを作る場合、干渉しそうです。ピンアサイン
Groveと同じだとよかったのですが、まぁ順当なピンアサインです。
使用ライブラリ
Keypad
キーパッド用の基本ライブラリです。下記のKeypad_I2Cから呼び出されますので、インストールが必要です。Keypad_I2C
I2Cインターフェイスキーパッドのライブラリです。使われるエキスパンダICによって複数あります。このキットだと、Keypad_I2Cで良さそうです。
M5StackとGrove
ESP32だとWireの規定値、G21(sda),G22(scl)につなげば、サンプルは動くはずです。Groveで使う場合は
TwoWire *jwire = &Wire1;
…
jwire->begin(26,32); // M5Atom
のように、ピン番号を指定する必要があります。M5Stackは、機種によってGroveで使用するGPIOが違いますので、調べてくだい。
キー認識と、同時押し検知
電圧式は抵抗分圧により押したキーを判別しますが、抵抗の精度のためか、1台ずづキャリブレーションをしないと、まともに使えませんでした。
このエキスパンダICを使った方式だと、そういうことがないので、安心感があります。
対応ライブラリには、getKeys関数があるので、2つ以上のキーの同時押しも検知できました。チャタリング対処もしてあるので、そのまま使えます。
ライブラリで気になった点
デフォルトコンストラクタがないので、改造しないと使いにくいかもしれません。
物理キーとソフトキーの関係が分かりにくいです。とりあえず4x4=16キーの判別ができればよいので、その設定を下記に示します。
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'0','1','2','3'},
{'4','5','6','7'},
{'8','9','A','B'},
{'C','D','E','F'}
};
// Digitran keypad, bit numbers of PCF8574 i/o port
byte rowPins[ROWS] = { 4, 5, 6, 7 }; //connect to the row pinouts of the keypad
byte colPins[COLS] = { 0, 1, 2, 3 }; //connect to the column pinouts of the keypad
90度や180度回転させて使う場合でも、パラメータ値をいじれば、なんとかなりそうです。