사진게시판
malheur 님의 글을 보고 만들어 보았습니다.
최종 완성하기까지 2,3달 걸렸네요...
Nulsomino-HANA(아두이노 레오나르도)
체리갈축
FC900R PBT/FC750RT 호환 키캡
매트릭스 방식이 아닌 저항방식을 사용했습니다.
아두이노의 정밀하지 못한 아날로그 포트 덕분에,,,
소스 코딩하는데에 애를 좀 많이 먹었습니다.
자세한 내용은 아래 블로그를 참고하세요.
http://electro85.blog.me/220349128138
(리플 달았었는데 수정합니다~)
블로그 잘 읽었습니다! 도움이 될까 하여 리플을 남깁니다.
ADC 오류로 고스트키가 눌리는 현상은 저도 있었습니다. 다양하게 궁리를 해봤는데요, 다음과 같은 방법으로 완전하게 해결을 하였습니다.
int AR0;
reAR0:
AR0 = analogRead(A0);
if (AR0 != analogRead(A0)) {
goto reAR0;
}
이렇게하여... if문에 analogRead(A0)를 직접 쓰지 않고 앞서서 AR0에 저장해둔 값을 읽게 하는데요, analogRead가 2회 연속으로 정확하게 동일한 값이 나올 때까지 if goto로 무한반복하도록 하였습니다. 2회 연속 정확하게 같은 값이 나오면 올바른 값으로 간주하고 저장한 다음 키 처리를 하는건데요... (아마 ADC 값이 튀는 현상은 2회 연속 동일하게 일어나지는 않는 것 같네요)
예상되는 우려(원래 analogRead 자체에 +- 10정도 편차가 있으니 무한반복에 빠지지 않을까 하는...)와 다르게 완벽하게 동작합니다. 딜레이도 한자리 수 밀리세컨드밖에 없습니다.
추가로, 아두이노로 키보드를 만들면 아주 빠른 반복입력(예 : 백스페이스 연타)시에 루프 도는 시간이 길어서 키가 씹힐 수 있는데요...
void loop() {
double timer;
timer = millis();
/* 본문 전체 */
Serial.println(millis() - timer);
}
이걸로 루프가 한 바퀴 도는 딜레이를 확인할 수 있는데, for (i=0; i<=1000; i++) temp = analogRead(A0); 만 넣고 돌려보면 100ms 근처로 analogRead는 1회에 0.1ms 밖에 안걸리는 반면 Keyboard.release(KEY_LEFT_CTRL)을 넣어보면 1000ms 근처로, Keyboard 함수가 생각보다 엄청 느리더군요... 아무 키를 안누르면 모든 키를 release 하느라 한 바퀴 도는데에 시간이 꽤 걸리죠. 그래서 checkAR0 변수를 미리 만들어놓고
if (AR0 <= 900) checkAR0 = 2;
else if (checkAR0) checkAR0--;
if (checkAR0) {
if (AR0 >= 500 && AR0 <= 600) {
/* 키 적용 */
}
/* 나머지 키 검사 */
}
하는식으로, 키 떨어짐이 연속 2회 지속되면 해당 아날로그 핀에 물린 키는 전체 스킵해버리는 구조로, 한 바퀴 루프에 걸리는 시간을 기존 90ms에서 20ms 이하로 팍 줄일 수 있었습니다.
오오 마침내 재밌는 글이 올라왔네요 잘 보도록 하겠습니다 ㅎㅎ