今朝、ちょっと思いついて10キー(3x4) キーパッドを作ってみました。ステッピングモータを使った工作に使う予定です。
手元にあった部品で作ったのでユニバーサル基板も狭い切れ端です。基板がもう少し広ければ、4x4にしたかったのですが。取り合えず3x4で間に合います。動作確認用にキーを押すと小型LCDに表示するようにしてみました。まぁ、シリアルモニタでPC側で確認してもよいのですが。
スケッチは自分で書いてみました。無保証です。
バグがあったので修正('21.07.26)
//--------------------------------------------------------------
// 21.07.24 naka
// 21.07.26 naka bug fix
// 3x4キーパッド
//--------------------------------------------------------------
#include <FaBoLCDmini_AQM0802A.h>
FaBoLCDmini_AQM0802A lcd;
// Arduino pinアサイン
#define KeyColSize 3
#define KeyRowSize 4
char pin_key_col[KeyColSize] = {8,7,6};
char pin_key_row[KeyRowSize] = {5,4,3,2};
// キーマップ
char key_map[KeyRowSize][KeyColSize] = {
'7', '8', '9',
'4', '5', '6',
'1', '2', '3',
'0', 'X', 'Y'
};
void setup() {
// I/O port設定
int i;
for (i=0;i<KeyColSize;i++) {
pinMode(pin_key_col[i], OUTPUT);
digitalWrite(pin_key_col[i],HIGH);
}
for (i=0;i<KeyRowSize;i++) {
pinMode(pin_key_row[i], INPUT);
}
// モニタLCD設定
SetupLCD();
dispLCD_msg("KeyPad ","");
delay(1000);
}
void loop() {
char key;
key = check_key();
if (key!=' ') {
disp_key(key);
while(check_key()!=' '); // キーが離されるまで待つ
}
delay(10);
}
char check_key() {
int key_row,key_col;
for (key_col=0;key_col<KeyColSize;key_col++) {
digitalWrite(pin_key_col[key_col],LOW);
for (key_row=0;key_row<KeyRowSize;key_row++) {
if (digitalRead(pin_key_row[key_row])==LOW) {
digitalWrite(pin_key_col[key_col],HIGH); // bug fix '21.07.25
return key_map[key_row][key_col];
}
}
digitalWrite(pin_key_col[key_col],HIGH);
}
return ' ';
}
void disp_key(char key) {
static char buff[9];
static int col = 0;
if (col==8) {
dispLCD_msg("","");
col = 0;
}
buff[col++] = key;
buff[col] = 0;
dispLCD_msg(buff,"");
}
void dispLCD_msg(char msg1[],char msg2[]) {
lcd.clear();
lcd.print(msg1);
lcd.setCursor(0, 1); // Col,Raw
lcd.print(msg2);
}
void SetupLCD() {
lcd.begin();
lcd.command(0x38);
lcd.command(0x39);
lcd.command(0x14);
lcd.command(0x73);
lcd.command(0x51); // 5V
// lcd.command(0x56); // 3.3V
delay(2);
lcd.command(0x6c);
delay(300);
lcd.command(0x38);
delay(1);
lcd.command(0x01);
delay(2);
lcd.command(0x0c);
delay(2);
}
土曜日ですが午前中、Aliexpressで購入したUSB Type-C のArduino Nano互換機が郵便で届きました。やはり最近中国からの郵便が早くなっていますね。
今回はType-Cでしたが、昔ながらのUSB-miniBでも安い互換機がなくなってきたようです(探し方が悪いのかも)、今回は送料込みで5個で2000円ちょっとでした。mini-Bでも大差なかった。
1個400円なら、性能の高いSeeeduino XIAO (秋月で580円)の方がよいかも知れませんが、XIAOはIOピンが少ないので、Nanoの出番はまだありそうです。