キーパッドの配線は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のインターバルを入れているが連続入力されてしまう。チャタリングというか「押して離して」をちゃんと判定しないとダメかな?
0 件のコメント:
コメントを投稿