메인
home
소프트웨어
home
🏓

마이크로비트를 활용한 게임 컨트롤 만들기 !

학습목표
1.
마이크로비트의 입력장치(스위치, 센서 등)를 활용하여 특정 시리얼 신호를 출력할 수 있다.
2.
마이크로비트에 입력된 신호를 PC에서 수신하여 게임 프로그램에 명령어로 연결할 수 있다.
3.
게임 컨트롤러를 최적화 할 수 있다.
신호 감도 조절, 유선 → 무선 라디오 신호 구성, 하드웨어 부착 등

  마빗 시리얼 통신 확인하기

1-1. 구글에서 [ 마이크로비트 파이썬 ] 검색 후 작업공간 제목 쓰기
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
복사

 과제 제출