1602A 게임, 아두이노 인터럽트
LCD 디스플레이로 문자를 인쇄하기도 했고, 커스텀 글꼴을 등록하여 한글도 출력해 보았다.
같은 방법으로 방해물이 쌓여 있는 하늘을 나는 로켓을 만들어 보려고 한다.
게임 전체를 이해하고 만드는 것은 조금 더 지식을 쌓고 만들어야 할 것이고, 일단은 방해물을 피해서 날아가는 로켓의 모습까지만 이라도 만들어 보려고 한다.
게임을 동작하는 모습을 보고 구현 방법을 생각해 보자.
기본 회로는 처음 LCD 디스플레이를 연결하는 것과 동일하고, 2번 핀과 3번 핀에 버튼을 INPUT_PULLUP 형태로 연결하였다.
게임의 구성은 아주 단순하다.
방해물이 날아오는 것을 피해 로켓이 날아가는 것을 시뮬레이션한 것이다.
두 개의 버튼이 각각 로켓을 좌 우로 움직이게 한다.
설사 실패하여도 이 게임은 계속 진행된다.
실패에 따른 코드를 포함하지 않았기 때문이다.
여러분들의 상상력을 동원하여 더 완성된 게임으로 발전시키길 바란다.
인터럽트 (Interrrupt)
게임이 버튼의 신호를 받아서 진행되던 작업의 중간에 다른 코드를 실행하기 위하여 한 가지 중요한 이론을 배워야 한다.
컴퓨터 프로그램의 "인터럽트"라는 것이다.
인터럽트(Interrupt)의 사전적 의미가 중단 또는 방해 등의 의미인 것처럼, 컴퓨터 프로그램에서의 인터럽트는 진행되고 있는 프로그램의 중간에 불쑥 끼어드는 코드의 형태를 가진다.
아두이노 우노는 기본적으로 2번 핀과 3번 핀에서 들어오는 신호를 이용하여 진행되는 프로그램의 중간에 원하는 변화를 만들어 넣을 수 있다.
인터럽트용 핀에 들어오는 신호가 HIGH에서 LOW, LOW에서 HIGH로 변하는 순간, 또는 두 가지 모두에서 진행하는 코드를 중단시키고 원하는 코드를 실행시킬 수 있다.
실제로 사용해 보면 하드웨어를 직접 건드리는 코드가 있을 경우 에러가 발생하는 경우도 많지만, 프로그램을 하다 보면 이러한 에러를 피해 가는 경우도 하나씩 깨우치게 된다.
코드를 살펴보자.
Line 74 까지는 커스텀 글자를 등록하고, 방해물을 어떻게 배치할까를 정하는 부분이므로 실제 코드는 전체의 절반 정도를 차지한다.
커스컴 글꼴의 등록과 관련된 부분은 앞의 강좌에서 한글 출력 편을 참조하면 된다.
코드 중 배우지 않았던 부분은
Line 80, 81의 다음 부분이다.
attachInterrupt(0, toLeft, FALLING);
attachInterrupt(1, toRight, FALLING);
해당 함수는 이렇게 사용한다.
아두이노 우노의 경우 0번은 2번 핀의 변화에 따른 인터럽트, 1번은 3번 핀의 변화에 따른 인터럽트를 처리하기 위한 번호이다.
따라서 80번 줄은 2번 핀에 연결된 스위치가 눌리면 toLeft라는 함수를 실행하라는 것이다.
나는 아래의 코드에서 rgt가 0이면 로켓이 왼쪽에 놓이고, rgt가 1이면 로켓이 오른쪽에 놓이도록 코드를 만들었다.
코드를 보면 2번 핀에 연결된 스위치가 눌리면 rgt가 0이 되고, 3번 핀에 연결된 스위치가 눌리면 rgt가 1이 된다.
인터럽트 함수는 최대한 단순화하고 delay와 같은 명령을 사용하지 않도록 하여야 한다.
그러한 규칙에 맞도록 1줄짜리 코드를 만들었다.
기타의 코드들 역시 모두 미리 배웠던 코드이므로 참조하여 이해하도록 하고, 그 코드에 추가하여 방해물이 날아오는 속도를 변경하거나 방해물에 로켓이 부딪힐 경우 어떤 효과를 줄지를 만들어 보면 많은 공부가 될 것이다.