2021年7月24日土曜日

タクトスイッチで3x4キーパッド試作

今朝、ちょっと思いついて10キー(3x4) キーパッドを作ってみました。ステッピングモータを使った工作に使う予定です。

手元にあった部品で作ったのでユニバーサル基板も狭い切れ端です。基板がもう少し広ければ、4x4にしたかったのですが。取り合えず3x4で間に合います。動作確認用にキーを押すと小型LCDに表示するようにしてみました。まぁ、シリアルモニタでPC側で確認してもよいのですが。

回路は 秋月電子の4x3キーパッド とほぼ同じです。組立説明書 に回路図が載っています。350円なので部品を自分で揃えるならこのキットを買った方が楽です。

スケッチは自分で書いてみました。無保証です。
バグがあったので修正('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の出番はまだありそうです。

0 件のコメント:

コメントを投稿