brunch

You can make anything
by writing

C.S.Lewis

by Cylogic Aug 16. 2020

13. 두 번째 장난감 : 선 따라가기(손 떨지 마요)

LED를 이용한 두 번째 장난감

첫 번째 장난감과 마찬가지로 장난감에 대한 정의를 미리 해 보자.


장난감 제목 :

구불구불 선 따라가기 (손 떨면 안 돼)


장난감 정의 :

1. 철사 하나가 구부러진 형태로 장치되어 있고, 그 주위를 감싸는 링이 하나 있다.

2. 이 링을 구부러진 철사의 시작부터 끝까지 움직일 때 링과 철사가 닿지 않도록 하여야 한다.

3. 철사와 링이 닿게 되면 그때마다 LED가 하나씩 켜지고 4번 이상 닿으면 게임이 끝나게 된다. 이때 마지막 LED 2개가 켜진다.

4. 끝까지 잘 도착하면 6개의 LED가 켜지며 성공을 알린다.

5. 게임을 새로 시작하려면 버튼을 눌러 모든 LED를 끄고 시작을 알리면 된다.


장난감 재료:

1. 아두이노 보드

2. 브레드 보드

3. LED 6개

4. 저항 220 오옴 6개

5. 버튼스위치

6. 철사 / 금속 링

7. 연결을 위한 전선들


구조 :

1. 5개의 LED를 8번부터 13번 핀에 연결한다.

2. 철사를 2번 핀에 연결한다.

3. 리셋용 버튼스위치를 3번 핀과 연결한다.

4. 끝까지 통과한 후 성공했을 때 터치할 전선을 4번에 연결한다.

5. 링을 GND와 연결한다.


새롭게 배우는 프로그램 요소 :

변수의 다양한 사용법, 

스위치의 다양한 형태,

코딩에서 함수의 사용법


실제로 철사와 링을 연결하는 부분을 화면 상에 버튼으로 대체하면 아래와 같은 회로를 꾸밀 수 있다.


버튼 중 2번 핀에 연결된 것은 링에 연결된 것이고, 4번 핀에 연결된 것은 성공했을 때 터치하는 전선으로 생각하면 된다.

실제 게임을 위해 연결하여 작동하는 모습은 다음의 동영상과 같다.

링을 통화하는 중 4번 이상 닿아서 실패하는 모습

전체 코드를 살펴보면서 기능 구현 방법을 배워 보자.

원래 제작했던 게임에서는 훨씬 다양한 효과를 만들었지만, 처음 배우는 분들을 위해 단순하게 코드를 변경하였다.


추가로 지정할 함수 부분은 뒤로 두고 전체 구조만을 확인해 보면 아래와 같다.

setup 앞의 #define에는 2,3,4,8,9번에 대한 정의가 되어 있고,

두 개의 변수가 지정되어 있다. stage는 과연 몇 번이나 실수했는가를 카운트하는 변수이고

succeed는 목표지점까지 다 달아서 성공했는지에 대한 여부를 알려주는 변수이다.


setup 함수를 보면


일단 8번부터 13번까지의 핀에 LED를 저항을 포함하여 연결하고,

2번 핀은 철사에, 3번 핀은 리셋 스위치에

4번 핀은 최종 목표지점에 연결한다.

그리고 2,3,4번 모두 input_pullup으로 지정하여 입력되는 신호 값을 받도록 한다.

8번부터 13번 핀은 모두 출력 핀으로 지정한다.


loop 함수를 보면


2, 3, 4번 핀이 눌리거나 터치되는 각 경우에 동작하는 내용을 별도의 함수로 분리한 것을 볼 수 있다.

제일 먼저 전체 LED를 끄고 게임을 새로 시작하기 위한 rBtn이 눌려져서 실행되는 reset_game 함수이다.


1. reset_game() 함수

8번부터 13번까지 연결된 모든 LED에 LOW값을 출력하여 불을 끄고, stage와 succeed를 모두 0으로 리셋한다.


2. miss() 함수

철사를 따라 링을 움직이다 링과 철사가 닿는 경우이다.

만일 이미 succeed가 1이면 목표 지점에 다다른 것이므로 더 이상 진행할 것이 없으므로 return이라는 명령어를 사용하여 함수를 빠져나온다.

그렇지 않다면 stage에 1을 더하여 실패한 횟수를 증가시킨다.

만일 stage가 5보다 작다면 아직 게임이 가능하다. 그러므로 실패한 횟수만큼 불을 켠다.

만일 5보다 크거나 같다면 처음 4개 불을 끄고 마지막 두 번의 불을 켜서 이 게임이 실패했음을 보여준다.


3. goal() 함수

링이 철사의 끝에 도달하여 목표 지점과 터치했을 경우이다.


만일 stage가 4보다 크면 성공해도 소용이 없다.

그렇지 않다면 succeed를 1로 표시하여 목표지점 도달에 성공했음을 알리고 모든 불을 HIGH 즉 켜면 된다.


전체 코드를 보면 아래와 같다.


성공이나 실패 시에 좀 더 화려한 결과를 원한다면 불을 깜빡거리거나 부저를 달아서 팡파르를 울리는 등의 효과를 낼 수 있을 것이다. 

차후에 좀 더 배우고 이를 구현한 장난감을 만들어 보자.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari