4. 프로젝트 학습 1 - micro:bit로 소리나는 신호등 만들기
이 활동은 앞서 배운 내용을 기반으로 다양한 프로젝트 학습을 하는 것에 목표를 둔다. 마이크로비트를 활용하여 다른 교과와 연계된 활동을 하기 위한 활동 차시로 파이선을 활용한 코딩을 통해 실생활에서 활용할 수 있는 다양한 활동을 만드는 첫걸음이다.
· 신호등은 어떻게 작동할까?
· micro:bit로 소리 나는 신호등 만들기
· 라디오 통신을 활용한 교통 신호 체계 만들기
【활동목표】
1. 신호등 작동을 위한 알고리즘을 구성할 수 있다.
2. micro:bit를 활용하여 소리로 신호등을 만들 수 있다.
3. micro:bit의 라디오 통신을 통해 신호 체계를 구현할 수 있다.
- micro:bit 2 set(1set는 마이크로비트 본체 1개, micro USB(5핀) to USB 선 1개로 구성)
- 악어 클립 전선 4개
- 이어폰 혹은 피에조 버저 2개
1미션: 신호등을 소리로 구현하고 신호체계를 만들어 보자
신호등은 어떤 것일까? 설명해 보자. 신호등에 대해 알아보기 위해 인터넷 포털사이트에서 “신호등”을 찾아보면 “안전한 교통질서를 위하여 색으로 교통조건을 나타내는 기구를 신호기라고 하며, 신호등은 신호기의 한 종류에 속한다.”
-네이버 두산백과-
즉, 신호등은 교통의 조건을 색으로 표현하여 신호를 주고받는 신호기이다. 그렇다면 색으로 교통 조건을 나타내는 기구라고 하는 신호등을 소리로 표현하도록 만들 순 없을까?
지금까지 학습한 micro:bit를 활용하여 소리로 교통 조건을 나타내는 신호등과 신호체계를 만들어 보자.
2신호등의 구조 살펴보기
미션인 신호체계를 구현하기 위해 두 가지 삼음 신호등을 사용하여 자동차와 보행자가 사용할 수 있는 신호 체계를 만들어 보자. 먼저, 삼음 신호등은 세 가지 신호 건너기, 멈추기, 신속히 건너기로 구성되어 있다. 차량 신호등과 보행 신호등을 각각 다른 음으로 표현하여 작동하도록 한다.
3보행 신호등 구현하기
신호는 약속이기 때문에 이번 미션에서는 세 가지 소리로 신호인 약속을 정해 보겠다. 우선 멈추기 신호는 micro:bit에서 구현할 수 있는 소리 중 F음으로, 건너기 신호는 ENTERTAINER 음악으로 표현하고, 신속히 건너기 신호는 C음이 일정한 간격으로 소리를 내도록 표현하는 것으로 약속하도록 한다.
※ 소리의 표현은 본 교재에서 약속한 것이므로 다른 소리로 표현하는 것은 문제가 되지 않는다.
보행 신호등의 작동 순서는 ENTERTAINER(건너기) → C음 점멸(신속히 건너기) → C음(멈추기) 순으로 표현하도록 한다.
from microbit import * # python에서 microbit 라이브러리를 사용
import music # music 라이브러리 사용
red=["F:512"] # red 변수에 멈추기를 표현하는 F음과 길이를 512(7박자) 입력
green2=["C"] # green2 변수에 신속히 건너기 표현을 위해 C음 입력
music.play(music.ENTERTAINER) # 건너기 표현 음악 ENTERTAINER 연주
for i in range(1,10): # 신속히 건너기 표현을 위해 for 문을 사용하여 C음 10회 반복 연주
music.play(green2)
music.play(red) # 멈추기 신호 표현을 위해 F음 7박자 연주
같은 방법으로 차량 신호등도 구현해 보자.
4차량 신호등 구현하기
차량 삼색등의 구현을 위해서는 보행 신호등과 다른 micro:bit에 명령어를 입력한다. 단, 보행 신호와 구분하기 위해 F, C, ENTERTAINER와는 다른 음을 사용하여 표현하도록 한다. 우선 건너기 신호는 music의 FUNK 음악을 2번 반복 사용하고 신속히 건너기 신호는 WAWAWAWAA 음을 3번 반복하고 멈추기 신호는 D음을 512박자로 표현한다.
from microbit import * # python에서 microbit 라이브러리를 사용
import music # music 라이브러리 사용
red2=["D:512"] # red2 변수에 D음을 512비트로 연주를 대입
for i in range(0, 1): # 건너기 FUNK 음악을 2번 반복하기 위해 range를 0~1로 설정
music.play(music.FUNK)
for i in range(1, 3): # 신속히 건너기 WAWAWAWAA 음악을 3회 반복하기 위해 range를 1~3으로 설정
music.play(music.WAWAWAWAA)
music.play(red2) # red2를 연주
5Radio 통신 활용으로 신호체계 구현하기
지금까지 보행 신호등과 차량 신호등을 구현해 보았다. 이 두 신호등으로 라디오 통신을 통해 교통신호 체계를 만들어보자. 가장 간단한 차량-보행 신호등의 신호체계는 차량 신호등 2개와 보행 신호등 2개 총 4개가 1조로 움직인다. 따라서 4인 1조 혹은 2인 1조로 구성하여 신호체계를 구현해 보자.
4인 1조의 경우 두 사람은 차량 신호등을 다른 두 사람은 보행 신호등을 만들어 서로 통신하여 신호체계가 작동 되도록 한다. 신호 체계는 간단하게 보행 신호등의 신호가 모두 끝나면 차량 신호등의 신호가 작동하고, 차량 신호등의 신호가 모두 끝나면 보행 신호등이 작동하도록 radio 통신으로 신호 체계를 구성한다.
from microbit import * # python에서 microbit 라이브러리를 사용
import music # music 라이브러리 사용
import radio # radio 라이브러리 사용
radio.on() # radio 통신 사용을 위해 radio 켜기
radio.config(group=10) # radio 통신을 위해 그룹을 10으로 통일(각 조마다 다른 그룹번호 선택 필요)
red=["F:512"] # red 변수 선언 후 멈추기 음 ["F:512"] 대입
green2=["C"] # green2 변수 선언 하고 신속히 건너기 음 ["C"] 대입
start="" # 시작과 반복을 위해 start변수 선언하고 문자열 "" 대입
while True: # 신호체계 반복을 위해 무한루프 실행
if button_a.is_pressed(): # hex 파일 업로드시 보행신호와 차량신호가 동시에 작동할 수 있기 때문에 시작 시점을 정하기 위해 버튼 A로 명령어 입력
radio.send('go') # A버튼을 누르면 라디오 통신을 통해 보행 신호등에 'go'문자 전달
start='stop' # 보행 신호등 작동 시 차량 신호등을 정지 하기 위해 start 변수에 'stop' 문자 대입
incoming=radio.receive() # incoming 변수를 선언하고 전달되는 data를 해당 변수에 대입
if incoming=='go2': # 만약 incoming변수에 대입된 data 값이 'go2'와 같을 경우
start='go2' # start 변수에 'go2'를 대입하여 건너기 신호를 출력할 수 있도록 준비
if start=='stop': # start 변수에 대입되어 있는 data에 따라 다른 작동
display.scroll('wait') # start 변수에 'stop' 문자가 대입되어 있는 경우 소리 작동 없이 wait 문자 출력
elif start=='go2': # start 변수에 'go2'가 대입되어 있다면 실행
music.play(music.ENTERTAINER) # 건너기 신호인 ENTERTAINER 연주
for i in range(1, 10): # 건너기신호 후 신속히 건너기 신호를 위해 range 함수를 사용하여 'green2' 10번 반복
music.play(green2)
music.play(red) # 신속히 건너기 신호 후 멈추기 신호 'red' 연주
radio.send('go') # 차량신호 종료 후 보행신호가 작동하도록 라디오 통신으로 'go' 문자 전송
start='stop' # 차량신호 정지를 위해 start함수에 'stop' 문자 대입
from microbit import * # python에서 microbit 라이브러리를 사용
import music # music 라이브러리 사용
import radio # radio 라이브러리 사용
radio.on() # radio 통신 사용을 위해 radio 켜기
radio.config(group=10) # radio 통신을 위해 그룹을 10으로 통일(각 조마다 다른 그룹번호 선택 필요)
red2=["D:512"] # red2 변수 선언 후 멈추기 음 ["D:512"] 대입
s1="" # 시작과 반복을 위해 s1변수 선언하고 문자열 "" 대입
while True: # 신호체계 반복을 위해 무한루프 실행
if button_a.is_pressed(): # hex 파일 업로드시 보행신호와 차량신호가 동시에 작동할 수 있기 때문에 시작 시점을 정하기 위해 버튼 A로 명령어 입력
radio.send('go2') # A버튼을 누르면 라디오 통신을 통해 보행 신호등에 'go2'문자 전달
s1='stop' # 차량 신호등 작동 시 보행 신호등을 정지 하기 위해 start 변수에 'stop' 문자 대입
incoming=radio.receive() # incoming 변수를 선언하고 전달되는 data를 해당 변수에 대입
if incoming=='go': # 만약 incoming 변수에 대입된 data 값이 'go'와 같을 경우
s1='go' # start 변수에 'go'를 대입하여 건너기 신호를 출력할 수 있도록 준비
if s1=='stop': # s1 변수에 대입되어 있는 data에 따라 다른 작동
display.scroll('wait') # s1 변수에 'stop'문자가 대입되어 있는 경우 소리 작동없이 wait 문자 출력
elif s1=='go': # s1 변수에 'go'가 대입되어 있다면 실행
for i in range(0, 1):
music.play(music.FUNK) # 건너기신호를 위해 range 함수를 사용하여 'FUNK' 2번 반복
for i in range(1, 3):
music.play(music.WAWAWAWAA) # 건너기신호 후 신속히 건너기 신호를 위해 range 함수를 사용하여 'WAWAWAWAA' 3번 반복
music.play(red2) # 신속히 건너기 신호 후 멈추기 신호 'red2' 연주
radio.send('go2') # 보행신호 종료 후 차량신호가 작동하도록 라디오 통신으로 'go2' 문자 전송
s1='stop' # 보행신호 정지를 위해 s1함수에 'stop' 문자 대입
※ 버튼 A를 눌렀을 때 라디오 통신의 ‘go’를 보내는 이유는 보행 신호등과 차량 신호등을 사용하기 위해 micro:bit에 파일을 업로드했을 때 동시에 작동하지 않게 하기 위해 시작 신호를 준비한 것이다. 한번 A버튼을 누른 후에는 자동으로 라디오 통신을 통해 신호를 주고받게 된다.
위 코드 예시는 보행 신호등과 차량 신호등 두 개의 micro:bit가 라디오 통신으로 서로 데이터를 주고받음으로 실행된다. 위 예제는 하나의 방법일 뿐 여러분의 코드로 만들어 보자.