press, release 함수에 사용할 수 있는 특수키의 목록은 아두이노 홈페이지에서 찾을 수 있다.(Link)
특수키의 이름이나 16진수 코드, 10진수 코드를 입력하여 사용 가능하다. (글쓴이는 코드의 가독성을 높이기 위해 이름을 사용했다.)
주의해야 할 것이 키보드 라이브러리의 함수를 반복문에 잘못 사용했다가는 컴퓨터 사용을 방해할 수가 있다. 따라서 스위치가 눌렸을 때에만 함수가 동작하도록 하는 등의 형태로 사용해야 한다. 아두이노 웹사이트에도 경고가 되어 있으니 특별히 주의하자.
여기서는 begin, press, release 함수만 사용한다.
잘 생각해야 될 것이 스위치가 눌려 있으면 눌린 상태로 눌려있지 않으면 눌려있지 않은 상태로 유지되어야 한다.
그리고 loop함수가 반복될 때마다 press나 release가 계속해서 호출되지 않도록 해야 한다. 그래서 press나 release의 반복적인 호출을 막기 위해 이전 루프에서의 스위치 상태와 현재의 스위치 상태를 비교해서 상태가 다르다면 press나 release를 호출한다.
예를 들어 val1과 val1_old라는 변수가 있다고 가정하자.
각각 현재, 바로 전 루프에서의 스위치 상태를 1(눌리면)과 0(눌리지 않으면)으로 저장할 수 있다.
만약 val1이 1, val1_old가 1이면 이전과 현재의 상태가 같기 때문에 별다른 함수 호출이 필요 없다.
val1이 0, val1_old가 1이면 스위치가 눌려졌다는 것을 알 수 있으니 press를 호출한다. 반대의 경우에는 release.
레버를 움직여 보거나 스위치를 눌러 보면 알겠지만 한 번 눌렀는데 커서가 두세 칸씩 이동하는 경우가 많다. 스위치를 누를 때 신호가 튀는 이른바 디바운스를 제거하지 않아서 그런 듯 하다. 디바운스를 제거하는 소스 코드를 추가한다면 금상첨화일듯.
아직 고등학생이라 전공자가 아니다 보니 코드를 효율적으로 짜지 못한 듯 하다. 크기를 많이 줄일 수 있지 않을까 싶다.
배선이 완전 엉망이다. 어떻게 하면 전선을 효율적으로 사용하고 예쁘게 배선할 수 있을 지 고민해 봐야 겠다.
스타트 버튼으로 쓸 다른 작은 버튼이 있으면 좋겠다.
6. 가능성
아두이노의 키보드 라이브러리를 이용하여 아두이노가 방향키와 다른 알파벳을 입력할 수 있도록 해 보았다.
레버를 없애고 다양한 스위치를 한 손으로 조작할 수 있게 만들고, 여러 키를 입력할 수 있게 한다면 전문 용도로 사용하는 프로그램들(영상편집, 그래픽)의 특정한 기능 키로 이용, 용이한 작업을 할 수 있도록 할 수 있을 것 같다. 마우스로 작업하다가 툴을 바꾸기 위해 마우스 커서를 움직이는 것은 솔직히 귀찮다.
단순한 스위치처럼 동작하는 레버가 아닌 사용자의 선형적인 동작을 인식할 수 있는 조이스틱을 이용한다면 Flight Simulator와 같은 정밀한 조작을 요구하는 게임에 사용하거나 트랙볼과 비슷하게 사용할 수 있을 것 같다.
적당한 비용 수준이 가능하다면 학교의 학생들에게 게임을 미끼로(?) 전자 공작을 가르칠 기회를 만들 수도 있을 것 같다.
keyboard 라이브러리를 사용할 수 있는 레오나르도 등의 아두이노여야 한다.(UNO는 사용할 수 없음.) [본문으로]
글쓴이가 어떻게 해야 할 지 다 알려주고 재료 구입, 제작만 하기로 했었다. 그러나 학교에서 납땜을 하지 못해 실패해서 글쓴이가 집에서 다시.... [본문으로]
setup구문 내에서 pinMode 함수를 호출할때 pinMode([pin], INPUT_PULLUP); 과 같은 형태로 사용할 수 있다.
http://www.arduino.cc/en/Reference/PinMode [본문으로]