아두이노 핀 절약: 4x3 키패드를 단 3개 연결으로 사용하기
부품 및 소모품
| 저항 330옴 |
1개 |
| 저항 1k옴 |
3개 |
| 저항 3k옴 |
1개 |
| 4x3 매트릭스 12키 키패드 |
1개 |
| 아두이노 우노 (Arduino UNO) |
1개 |
필수 도구 및 기계
앱 및 온라인 서비스
프로젝트 소개
소개
이 프로젝트의 목적은 숫자 키패드에 필요한 핀 수를 크게 줄이는 것입니다. 아두이노 우노나 나노 보드에서 사용 가능한 I/O 핀보다 더 많은 핀이 필요할 때가 많기 때문입니다.
일반적인 숫자 키패드는 매트릭스 구조입니다. 4x3 키패드는 4+3=7개 아두이노 디지털 핀이 필요합니다. 이를 위한 수많은 라이브러리가 온라인에 있습니다.
제 해결책
제안하는 해결책은 아날로그 입력 3개만 사용하는 회로로 훨씬 효율적입니다 (다음 그림 참조).
각 열마다 4개 키에 해당하는 4개 전압 값과 키 미누름 시 0V가 나옵니다. 등가 회로 (b)에서 R1e는 네 저항 R1-R4 중 하나, R2e는 세 저항 R5-R7 중 하나를 나타냅니다.
가장 넓은 4개 구간을 만드는 방법을 봅시다. 우선 R2e = R5 = R6 = R7로 동일하게 만들고, R1 = 0으로 설정해 첫 번째 줄 출력을 5V로 만듭니다.
R2=330옴, R3=1k옴, R4=3k옴, R5=R6=R7=1k옴으로 설정하면 각 출력에서 다음 구간을 얻습니다:
구간 표 이미지 참조
세 출력 모두에서 가능한 가장 큰 구간을 얻었으며 ±5% 공차의 표준 저항 6개로 구현 가능합니다. 아날로그 입력과 저항 하나를 추가하면 4x4 키보드도 가능합니다. 다음 그림은 아두이노 연결 예시입니다.
회로도에서 저항 R1은 2번 라인에 연결되어 있습니다. 1번 라인 저항은 와이어로 대체돼 저항 번호가 하나씩 밀렸습니다. 핀 할당은 아날로그 설정 가능 핀이면 필요에 따라 수정 가능.
아두이노가 3.3V로 구동돼도 ADC 컨버터가 기본적으로 공급 전압을 기준 전압으로 쓰므로 ADC 값은 변하지 않습니다.
프로그램 테스트를 위해 이런 키패드가 없어 재활용 키로 직접 만들었습니다. 아래 사진이 프로토타입입니다. 오른쪽 5핀 커넥터로 아두이노와 연결.
코드
Analog4x3Keybf.ino
KeyPad() 함수 테스트용 간단 프로그램
/* program Analog4x3Keybf
* 3개 아날로그 아웃으로 4x3 키 키보드 테스트
* G. Carrera - 19/11/2018
*/
// 키보드 출력 값 한계:
const int NADCm100[4] = {923, 669, 412, 156};
const int NADCp100[4] = {1123, 869, 612, 356};
const char key[13] = {'1','4','7','C','2','5','8','0','3','6','9','E'};
int keyval[3];
int i, colp, val;
void setup() {
Serial.begin(9600); // 시리얼 모니터용
}
void loop() {
char k;
k = KeyPad(); // 키패드 읽기
if (k != 'N') { // 키가 눌림
Serial.print("key = ");
Serial.println(k);
delay(500);
}
}
/******** 프로그램에서 사용하는 함수들 ********/
char KeyPad() {
// 키패드 읽고 키 문자 반환, 키 없으면 'N'
KeyScan(); // 아날로그 키보드 읽기
if (keyval[0] + keyval[1] + keyval[2] < 40) {
return 'N';
} else { // 키가 눌림
delay(10); // 디바운스
KeyScan(); // 아날로그 키보드 다시 읽기
for (i = 0; i < 3; i++) { // 어느 열인지 식별
if (keyval[i] > 40) {
colp = i;
val = keyval[i]; // 해당 열의 값
for (int j = 0; j < 4; j++) { // 열에서 어떤 키 눌렸는지 식별
if (val >= NADCm100[j] && val <= NADCp100[j]) {
return key[colp * 4 + j];
break;
}
}
}
}
}
}
void KeyScan() {
// 아날로그 키보드 읽기
keyval[0] = analogRead(A0);
delay(1);
keyval[1] = analogRead(A1);
delay(1);
keyval[2] = analogRead(A2);
delay(1);
}
회로도
회로도 이미지 참조