2016年1月28日木曜日

Arduinoで4×4のキーパッドの読み取り

aitendoで買った薄膜キーパット(4x4) をびんぼうでいいのでテスト。


キーパッドの配線は4×4のマトリックスになっている。


RowとColumnをそれぞれOutputとInputにしてスキャンしてやればどのキーが押されてるか判別できるが、びんぼうでいいののInput/Outputを直結すると判定がうまくいかない。誤判定される。

AVRのInputはハイ・インピーダンスなので(だと思う)、OutputのLがGNDに落ちてないのかな?

ブレッドボード図

10kΩのRでPullDownしたら、まあまあちゃんと読めるようになった。

Arduinoのスケッチ

static char keypadChar [] = {
  '1', '4', '7', '*',
  '2', '5', '8', '0',
  '3', '6', '9', '#',
  'A', 'B', 'C', 'D',  
};

void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}

int keyScan() {
  int i, j;
  for (i = 0; i < 4; i++) {
    digitalWrite(i + 6, HIGH);
    for (j = 0; j < 4; j++) {
      if (digitalRead(j + 2) == HIGH) {
        digitalWrite(i + 6, LOW);
        return i * 4 + j;
      }
    }
    digitalWrite(i + 6, LOW);
  }
  return -1;
}

void loop() {
  int v;
  v = keyScan();
  if (v != -1) {
    Serial.println(keypadChar[v]);
  }
  delay(100);
}


100msのインターバルを入れているが連続入力されてしまう。チャタリングというか「押して離して」をちゃんと判定しないとダメかな?