묻고 답하고
http://www.kbdmania.net/xe/tipandtech/8794285
제가 본 글입니다.
malheur 님의 매트릭스 이용 키보드 만들기입니다.
글에 이런 코드가 나와있습니다.
void loop() {
char* keys[5][14] {
{"96", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "45", "61", "KEY_BACKSPACE"},
{"KEY_TAB", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "91", "93", "92"},
{"KEY_CAPSLOCK", "A", "S", "D", "F", "G", "H", "J", "K", "L", "59", "39", "KEY_RETURN", "0"},
{"KEY_LEFT_SHIFT", "Z", "X", "C", "V", "B", "N", "M", "44", "46", "47", "KEY_RIGHT_SHIFT", "0", "0"},
{"KEY_LEFT_CTRL", "KEY_LEFT_ALT", "KEY_LEFT_GUI", "32", "KEY_RIGHT_GUI", "KEY_RIGHT_ALT", "KEY_RIGHT_CTRL", "0", "0", "0", "0", "0", "0", "0"}
}
for (i=0, i<=4, i++) {
for (j=0, j<=13, j++ {
digitalWrite(j, LOW);
if (digitalRead(i)) Keyboard.release(keys[i][j]);
else Keyboard.press(keys[i][j]);
digitalWrite(j, HIGH);
}
}
}
음 그러니까, 제가 제대로 이해한것인지 모르겠는데,
디지털핀을 LOW 로 설정하고, 키를 감지해서 감지가 되면 release,
감지가 안되면 press 를 하는건데,
이걸 꼭 이렇게 해야하는건가요?
HIGH 를 넣고 감지되면 press, 감지 안되면 release 로 해도 똑같이 작동하는게 맞겠죠?
그리고 디지털핀을 너무 여러개 쓰면 오류가 나는 경우가 있나요?
제가 저 글 참고해서 키보드를 만들고있는데
오류가 나는데 코드가 대체 뭐가 문제인지를 모르겠어서...
작성된지 6개월이 지난 글에는 새 코멘트를 달 수 없습니다.
매트릭스는 일단 젖혀두고, 디지털 인풋 하나만 쓰는 걸로 단순하게 생각해봅시다. 키 하나의 입력만 보죠 우선.
컴퓨터 키보드의 스위치는 구조상 오픈-클로즈만 지원합니다. 추가 회로를 구성하지 않는한 PULLUP 입력방식이 강제되어 있고 이러면 로직이 뒤집어집니다. 즉, 0일때가 릴리즈, 1일때가 오픈으로 판정하는 방식을 쓸수밖에 없습니다. (여기서 풀업은 단자가 오픈일때 하이 임피던스 상태로 대충 놔두지 않고 내부 풀업저항을 사용하여 High신호로 읽겠다는 의미입니다. 더 이상의 자세한 설명은 생략)
자 보죠, 말씀하신대로 스위치단 입력을 high로 놓고 스위치를 눌렀을때 high가 들어오면 감지로 쳐보겠습니다.
스위치 눌렀을때 - 눌렀으니까 입력전압이 그대로 전달되어 high
스위치 안눌렀을때 - 안눌렀으니까 pullup이 작동하여 high (???)
결국 이 방식으로는 입력감지를 할 수 없다는 의미입니다.
이걸 뒤집어서, 스위치단 입력을 LOW(0)로 해봅시다.
스위치 눌렀을때 - 눌렀으니까 입력전압이 그대로 전달되어 0
스위치 안눌렀을때 - 안눌렀으니까 pullup이 작동하여 1
이제 제대로 작동하는군요. 이게 "왜 귀찮게 로직을 전부 뒤집어놨느냐"에 대한 대답입니다. 풀다운 모드가 있다면 해결할 수 있겠지만 찾아보니 아두이노에는 그런게 없군요. 둘 중 하나만 지원하면 대개 충분하기도 해서요.
저라면 로직도 배울 겸 그냥 아웃풋한개, 풀업모드 인풋 한개만 써서 일단 스위치 동작이 되는지부터 확인하고, 그뒤 한 컬럼에 해당하는 키(5~6개쯤이겠죠?)만 연결해서 이게 동작하는지 확인하고.. 그다음에 풀 매트릭스 스캔이 잘 되는지 확인하고 이렇게 연습해볼 것 같네요.
오류는 무슨 오류인지 말씀을 안해주셔서 바로 위에 언급한 코드 문제 이외에는 모르겠습니다. 어떤 오류가 발생하는지요.