학습목표
1.
마이크로비트의 입력장치(스위치, 센서 등)를 활용하여 특정 시리얼 신호를 출력할 수 있다.
2.
마이크로비트에 입력된 신호를 PC에서 수신하여 게임 프로그램에 명령어로 연결할 수 있다.
3.
게임 컨트롤러를 최적화 할 수 있다.
•
신호 감도 조절, 유선 → 무선 라디오 신호 구성, 하드웨어 부착 등
마빗 시리얼 통신 확인하기
1-1. 구글에서 [ 마이크로비트 파이썬 ] 검색 후 작업공간 제목 쓰기
•
작업공간 링크 :
micro:bit Python Editor

1-2. GPT를 통해 마이크로비트 시리얼통신 송신 코드 제작
•
GPT 프롬프트 예시
◦
마이크로비트에서 버튼 a 누르면 시리얼 통신으로 a출력하는 파이썬 코드 작성해.
◦
마이크로비트 기울기 x축, y축 좌우 값을 300, -300 이상 넘어가면 좌, 우 방향값을 시리얼 통신으로 출력해.
◦
신호값은 간단히 알파벳 하나로만 해줘
◦
신호가 안정화 될수 있게 히스테라시스 설정해줘.
1-3. 아래 파이썬 코드를 보며 이해하고, 이를 복사하여 마이크로비트에 업로드 한다.
from microbit import *
# 상태 플래그
aPressed = False
leftPressed = False
rightPressed = False
upPressed = False
downPressed = False
# 히스테리시스 설정값
ENTER_LEFT = -350
EXIT_LEFT = -300
ENTER_RIGHT = 350
EXIT_RIGHT = 300
ENTER_UP = 350
EXIT_UP = 300
ENTER_DOWN = -350
EXIT_DOWN = -300
while True:
# --------------------------------------------------------
# (1) 버튼 A: 길게 누름 (A: 다운 / a: 업)
# --------------------------------------------------------
if button_a.is_pressed() and not aPressed:
aPressed = True
uart.write("A\n") # A 버튼 Down
elif not button_a.is_pressed() and aPressed:
aPressed = False
uart.write("a\n") # A 버튼 Up
# --------------------------------------------------------
# (2) 버튼 B: 단발
# → 'B' 전송 (PC 측에서 받으면 방향키 모두 해제)
# --------------------------------------------------------
if button_b.is_pressed():
uart.write("B\n")
sleep(300)
continue
# --------------------------------------------------------
# (3) X축 기울기 -> 좌/우 Down/Up
# --------------------------------------------------------
xVal = accelerometer.get_x()
# 왼쪽
if xVal <= ENTER_LEFT and not leftPressed:
leftPressed = True
uart.write("L\n")
elif xVal > EXIT_LEFT and leftPressed:
leftPressed = False
uart.write("l\n")
# 오른쪽
if xVal >= ENTER_RIGHT and not rightPressed:
rightPressed = True
uart.write("R\n")
elif xVal < EXIT_RIGHT and rightPressed:
rightPressed = False
uart.write("r\n")
# --------------------------------------------------------
# (4) Y축 기울기 -> 위/아래 Down/Up
# --------------------------------------------------------
yVal = accelerometer.get_y()
# 위쪽 (Up 화살표)
if yVal >= ENTER_UP and not upPressed:
upPressed = True
uart.write("U\n")
elif yVal < EXIT_UP and upPressed:
upPressed = False
uart.write("u\n")
# 아래쪽 (Down 화살표)
if yVal <= ENTER_DOWN and not downPressed:
downPressed = True
uart.write("D\n")
elif yVal > EXIT_DOWN and downPressed:
downPressed = False
uart.write("d\n")
sleep(50)
Python
복사
1-4. 시리얼 통신에서 마빗을 제어 했을때 신호가 잘 들어오는지 확인해 보자
마빗 시리얼 통신 확인하기
2-1. 기본 컨셉
•
1단계 코드 : 마이크로 비트 → 시리얼통신
•
2단계 코드(아래 코드) : 시리얼통신 → PC 키보드 제어
◦
구현 동작 : 마이크로비트 → PC키보드 제어.
2-2. 초보자용 파이썬 개발 환경 Thonny 환경 구축
•
윈도우 키 누르고 th 검색 →Thonny 프로그램 열기
•
없으면 아래 링크에서 설치
2-3. Thonny 열기.
2-4. pyautogui에 대한 이해
•
기본 코드
import pyautogui as pg
import pyperclip as pc
import time
pg.moveTo(100, 100, 1)
pc.copy("원킹 천재 ")
time.sleep(0.2)
#pg.hotkey("command", "v")
pg.hotkey("ctrl", "v")
Python
복사
•
패키지 설치 : 도구 - 시스템 쉘 열기
•
아래 명령어로 필요한 패키지를 설치한다.
•
추가 학습자료 : 원킹의 파이썬 매크로에 관한 자료
2-5. 마이크로비트 신호 받아서 키보드 자동제어 하기 코드
import serial
import pyautogui
# 반드시 자신의 COM 포트로 수정할 것
SERIAL_PORT = 'COM3'
BAUD_RATE = 115200
def main():
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
print(f"[PC] 시리얼 포트 {SERIAL_PORT} 연결됨")
try:
while True:
if ser.in_waiting > 0:
data = ser.readline().decode('utf-8').strip()
print("Received:", data) # 디버깅용
# ───────── A 버튼 (길게 눌렀다 뗄 때)
if data == "A":
pyautogui.keyDown('space')
elif data == "a":
pyautogui.keyUp('space')
# ───────── B 버튼 (단발) → 모든 화살표 키 해제
elif data == "B":
# pyautogui.press('sapce')
for key in ['left', 'right', 'up', 'down']:
pyautogui.keyUp(key)
# ───────── 왼쪽 화살표
elif data == "L":
pyautogui.keyDown('left')
elif data == "l":
pyautogui.keyUp('left')
# ───────── 오른쪽 화살표
elif data == "R":
pyautogui.keyDown('right')
elif data == "r":
pyautogui.keyUp('right')
# ───────── 위 화살표
elif data == "U":
pyautogui.keyDown('up')
elif data == "u":
pyautogui.keyUp('up')
# ───────── 아래 화살표
elif data == "D":
pyautogui.keyDown('down')
elif data == "d":
pyautogui.keyUp('down')
except KeyboardInterrupt:
print("사용자에 의해 종료")
finally:
ser.close()
if __name__ == '__main__':
main()
Python
복사
•
마빗 움직임 → 시리얼 통신 수신 확인
게임 제어하기
•
여기서 게임을 고를 수 있다.
•
아래 게임 선택
자 ! 이제 마빗으로 제어 해 보자 ~!
마이크로비트 라디오 통신을 활용한 무선 컨트롤러 제작
[코드 4-1] 2인용 게임 할때 발신 코드
•
코드 4-1-1. micro:bit 송신측 (Transmitter) / 무선 배터리 연결
from microbit import button_a, button_b, accelerometer, sleep
import radio
# 라디오 설정
radio.config(power=7, channel=7, group=1, queue=3)
radio.on()
# 상태 플래그 & 히스테리시스
aPressed = leftPressed = rightPressed = upPressed = downPressed = False
ENTER_LEFT, EXIT_LEFT = -350, -300
ENTER_RIGHT, EXIT_RIGHT = 350, 300
ENTER_UP, EXIT_UP = 350, 300
ENTER_DOWN, EXIT_DOWN = -350, -300
# 루프 딜레이 (20ms)
DELAY = 20
while True:
# (1) 버튼 A: 1=다운, 2=업
if button_a.is_pressed() and not aPressed:
aPressed = True
radio.send('1')
elif not button_a.is_pressed() and aPressed:
aPressed = False
radio.send('2')
# (2) 버튼 B: 단발(3)
if button_b.is_pressed():
radio.send('3')
sleep(200)
while button_b.is_pressed():
sleep(10)
# (3) X축 좌/우: 4~7
x = accelerometer.get_x()
if x <= ENTER_LEFT and not leftPressed:
leftPressed = True
radio.send('4')
elif x > EXIT_LEFT and leftPressed:
leftPressed = False
radio.send('5')
if x >= ENTER_RIGHT and not rightPressed:
rightPressed = True
radio.send('6')
elif x < EXIT_RIGHT and rightPressed:
rightPressed = False
radio.send('7')
# (4) Y축 위/아래: 8~11
y = accelerometer.get_y()
# 위로 기울임 → 8/9
if y >= ENTER_UP and not upPressed:
upPressed = True
radio.send('8')
elif y < EXIT_UP and upPressed:
upPressed = False
radio.send('9')
# 아래로 기울임 → 10/11
if y <= ENTER_DOWN and not downPressed:
downPressed = True
radio.send('10')
elif y > EXIT_DOWN and downPressed:
downPressed = False
radio.send('11')
sleep(DELAY)
JavaScript
복사
•
코드4-1-2. micro:bit 수신측 (Receiver) / 유에스비 피씨에 연결
from microbit import accelerometer, button_a, button_b, uart, sleep
import radio
# 라디오 & UART 설정
radio.config(power=7, channel=7, group=1, queue=3)
radio.on()
uart.init(baudrate=115200)
# 상태 플래그 & 히스테리시스
aPressed = leftPressed = rightPressed = upPressed = downPressed = False
ENTER_LEFT, EXIT_LEFT = -350, -300
ENTER_RIGHT, EXIT_RIGHT = 350, 300
ENTER_UP, EXIT_UP = 350, 300
ENTER_DOWN, EXIT_DOWN = -350, -300
while True:
# --------------------------------------------------------
# (1) 무선 수신 즉시 UART 출력
# --------------------------------------------------------
msg = radio.receive()
if msg:
uart.write(msg + '\n')
# --------------------------------------------------------
# (2) 버튼 A: 길게 누름 (A: Down / a: Up)
# --------------------------------------------------------
if button_a.is_pressed() and not aPressed:
aPressed = True
uart.write("A\n")
elif not button_a.is_pressed() and aPressed:
aPressed = False
uart.write("a\n")
# --------------------------------------------------------
# (3) 버튼 B: 단발 (B)
# --------------------------------------------------------
if button_b.is_pressed():
uart.write("B\n")
sleep(200)
while button_b.is_pressed():
sleep(10)
# --------------------------------------------------------
# (4) X축 기울기 -> 좌/우 (L/l, R/r)
# --------------------------------------------------------
x = accelerometer.get_x()
if x <= ENTER_LEFT and not leftPressed:
leftPressed = True
uart.write("L\n")
elif x > EXIT_LEFT and leftPressed:
leftPressed = False
uart.write("l\n")
if x >= ENTER_RIGHT and not rightPressed:
rightPressed = True
uart.write("R\n")
elif x < EXIT_RIGHT and rightPressed:
rightPressed = False
uart.write("r\n")
# --------------------------------------------------------
# (5) Y축 기울기 -> 위/아래 (U/u, D/d)
# --------------------------------------------------------
y = accelerometer.get_y()
if y >= ENTER_UP and not upPressed:
upPressed = True
uart.write("U\n")
elif y < EXIT_UP and upPressed:
upPressed = False
uart.write("u\n")
if y <= ENTER_DOWN and not downPressed:
downPressed = True
uart.write("D\n")
elif y > EXIT_DOWN and downPressed:
downPressed = False
uart.write("d\n")
# --------------------------------------------------------
# 수신 루프 딜레이
# --------------------------------------------------------
sleep(10)
JavaScript
복사
•
코드 2-3-3. PC 쪽 (Python + PyAutoGUI) / 컴퓨터 써니에서 구동
import serial
import pyautogui
SERIAL_PORT = 'COM3'
BAUD_RATE = 115200
def main():
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=0.1)
print(f"[PC] 시리얼 포트 {SERIAL_PORT} 연결됨")
try:
while True:
raw = ser.read_until(b'\n')
if not raw:
continue
data = raw.decode('utf-8', errors='ignore').strip()
print("Received:", data)
# A/a/1/2 → 'a' key
if data in ("A", "1"):
pyautogui.keyDown('space')
elif data in ("a", "2"):
pyautogui.keyUp('sapce')
# B/3 → 좌/우 해제
elif data in ("B", "3"):
# pyautogui.press('sapce')
pyautogui.keyUp('left')
pyautogui.keyUp('right')
pyautogui.keyUp('up')
pyautogui.keyUp('down')
# L/l/4/5 → 왼쪽 화살표
elif data in ("L", "4"):
pyautogui.keyDown('left')
elif data in ("l", "5"):
pyautogui.keyUp('left')
# R/r/6/7 → 오른쪽 화살표
elif data in ("R", "6"):
pyautogui.keyDown('right')
elif data in ("r", "7"):
pyautogui.keyUp('right')
# U/u or 8/9 → 위쪽 화살표
elif data in ("U", "8"):
pyautogui.keyDown('up')
elif data in ("u", "9"):
pyautogui.keyUp('up')
# D/d or 10/11 → 아래쪽 화살표
elif data in ("D", "10"):
pyautogui.keyDown('down')
elif data in ("d", "11"):
pyautogui.keyUp('down')
except KeyboardInterrupt:
print("사용자에 의해 종료")
finally:
ser.close()
if __name__ == '__main__':
main()
JavaScript
복사