다운로드 교육자료 문제해결 레퍼런스 구입방법

교육 자료 : 파이썬 : 표준 파이썬 : 키보드 이벤트

오리걸음 경주
오리걸음 경주는 뒤뚱뒤뚱 달려가서 누가 먼저 목표 지점에 도착하는지 시합하는 경주입니다. 뒤뚱뒤뚱 달려가는 동작을 만들어야겠습니다. 왼쪽 바퀴를 중심으로 왼쪽으로 회전하다가 오른쪽 바퀴를 중심으로 오른쪽으로 회전하는 것을 반복하면 뒤뚱뒤뚱 앞으로 달려가게 됩니다.

방향을 바꾸는 명령은 어떻게 전달하면 좋을까요? 방향을 자주 바꾸어야 하기 때문에 컴퓨터 키보드의 스페이스 키를 눌러 명령하도록 해봅시다. 키보드 이벤트는 Keyboard.read() 메소드를 통해 얻을 수 있습니다.

작성한 코드를 IDLE에서 실행하면 파이썬 쉘 또는 편집기 창에서 키보드 이벤트를 가져가 버리기 때문에 코드에서 키보드 이벤트를 얻을 수 없습니다. 명령 창(윈도우) 또는 터미널(맥OS, 리눅스)에서 실행하세요. (예제 파일 실행 참고)

from roboid import *

hamster = Hamster()

left = False
while True:
    key = Keyboard.read() # 키보드 이벤트를 얻는다.
    if key == ' ': # 스페이스 키를 눌렀으면
        left = not left # 방향을 반대로 한다.

        if left: # 왼쪽 방향이면
            hamster.wheels(0, 50)
        else: # 오른쪽 방향이면
            hamster.wheels(50, 0)

    wait(20) # 너무 빨리 반복하지 않도록 한다.

출발선을 그리고, 목표 지점에도 선을 그립니다. 친구와 함께 오리걸음 경주를 해보도록 합시다.

경주를 좀 더 재미있게 하려면 다음 그림과 같이 종이컵을 세워 놓고 종이컵을 돌아서 다시 출발선으로 돌아오는 경주를 하여도 좋습니다.

햄스터 조종기
키보드의 방향 키를 사용하여 햄스터 조종기를 만들어 봅시다. 위쪽 방향 키는 앞으로 이동, 아래쪽 방향 키는 뒤로 이동, 왼쪽 방향 키는 왼쪽으로 회전, 오른쪽 방향 키는 오른쪽으로 회전하도록 하고, 스페이스 키를 누르면 정지하도록 합시다.

from roboid import *

hamster = Hamster()

while True:
    key = Keyboard.read() # 키보드 이벤트를 얻는다.
    if key: # 키보드 이벤트가 있으면
        if key == Keyboard.UP: # 위쪽 방향 키
            hamster.wheels(50) # 앞으로 이동한다.
        elif key == Keyboard.DOWN: # 아래쪽 방향 키
            hamster.wheels(-50) # 뒤로 이동한다.
        elif key == Keyboard.LEFT: # 왼쪽 방향 키
            hamster.wheels(-50, 50) # 왼쪽으로 회전한다.
        elif key == Keyboard.RIGHT: # 오른쪽 방향 키
            hamster.wheels(50, -50) # 오른쪽으로 회전한다.
        elif key == ' ': # 스페이스 키
            hamster.stop() # 정지한다.

    wait(20) # 너무 빨리 반복하지 않도록 한다.

축구 경기장을 만들고 친구와 함께 축구 경기를 해봅시다.
햄스터 피아노
키보드의 알파벳 키를 사용하여 피아노를 만들어 봅시다. 키보드의 a, s, d, f, g, h, j, k, l, ;, ' 키를 순서대로 도, 레, 미, 파, 솔, 라, 시, 도, 레, 미, 파 음으로 하고, 스페이스 키를 누르면 소리를 끄도록 합시다. 작은 따옴표(') 키의 경우에는 작은 따옴표로 감쌀 수 없기 때문에 큰 따옴표(")로 감싸서 문자를 표시하였음에 주의하세요.

from roboid import *

hamster = Hamster()

while True:
    key = Keyboard.read() # 키보드 이벤트를 얻는다.
    if key: # 키보드 이벤트가 있으면
        if key == 'a':
            hamster.note(Hamster.NOTE_C_4) # 도
        elif key == 's':
            hamster.note(Hamster.NOTE_D_4) # 레
        elif key == 'd':
            hamster.note(Hamster.NOTE_E_4) # 미
        elif key == 'f':
            hamster.note(Hamster.NOTE_F_4) # 파
        elif key == 'g':
            hamster.note(Hamster.NOTE_G_4) # 솔
        elif key == 'h':
            hamster.note(Hamster.NOTE_A_4) # 라
        elif key == 'j':
            hamster.note(Hamster.NOTE_B_4) # 시
        elif key == 'k':
            hamster.note(Hamster.NOTE_C_5) # 도
        elif key == 'l':
            hamster.note(Hamster.NOTE_D_5) # 레
        elif key == ';':
            hamster.note(Hamster.NOTE_E_5) # 미
        elif key == "'":
            hamster.note(Hamster.NOTE_F_5) # 파
        elif key == ' ': # 스페이스 키
            hamster.note(0) # 소리를 끈다.

    wait(20) # 너무 빨리 반복하지 않도록 한다.

작성한 코드에는 두 가지 문제점이 있습니다. 첫 번째는 조건문이 너무 많다는 것이고, 두 번째는 같은 키를 두 번 누르면 음이 연결되어 구분이 안 된다는 것입니다.

첫 번째 문제는 파이썬의 딕셔너리를 사용하여 해결할 수 있습니다. (다른 언어에서는 switch 문을 사용하면 되는데, 파이썬에는 switch 문이 없습니다.) 두 번째 문제는 음을 연주하기 전에 잠깐 쉬어주면 됩니다.

from roboid import *

hamster = Hamster()

# 딕셔너리를 만든다.
notes = {
    " ": Hamster.NOTE_OFF, # 소리를 끈다.
    "a": Hamster.NOTE_C_4, # 도
    "s": Hamster.NOTE_D_4, # 레
    "d": Hamster.NOTE_E_4, # 미
    "f": Hamster.NOTE_F_4, # 파
    "g": Hamster.NOTE_G_4, # 솔
    "h": Hamster.NOTE_A_4, # 라
    "j": Hamster.NOTE_B_4, # 시
    "k": Hamster.NOTE_C_5, # 도
    "l": Hamster.NOTE_D_5, # 레
    ";": Hamster.NOTE_E_5, # 미
    "'": Hamster.NOTE_F_5 # 파
}

while True:
    key = Keyboard.read() # 키보드 이벤트를 얻는다.
    if key and key in notes: # 키보드 이벤트가 딕셔너리에 있으면
        hamster.note(0, 0.05) # 0.05 박자로 잠시 쉰다.
        hamster.note(notes[key]) # 키보드의 키에 해당하는 음을 소리낸다.

    wait(20) # 너무 빨리 반복하지 않도록 한다.

도#, 미b 등의 반음을 추가하여 완전한 피아노를 만들어 봅시다. 조건문을 추가하지 않고 딕셔너리만 수정하면 된다는 것을 알 수 있습니다.

from roboid import *

hamster = Hamster()

# 딕셔너리를 만든다.
notes = {
    " ": Hamster.NOTE_OFF, # 소리를 끈다.
    "a": Hamster.NOTE_C_4, # 도
    "w": Hamster.NOTE_C_SHARP_4, # 도# (레b)
    "s": Hamster.NOTE_D_4, # 레
    "e": Hamster.NOTE_E_FLAT_4, # 미b (레#)
    "d": Hamster.NOTE_E_4, # 미
    "f": Hamster.NOTE_F_4, # 파
    "t": Hamster.NOTE_F_SHARP_4, # 파# (솔b)
    "g": Hamster.NOTE_G_4, # 솔
    "y": Hamster.NOTE_G_SHARP_4, # 솔# (라b)
    "h": Hamster.NOTE_A_4, # 라
    "u": Hamster.NOTE_B_FLAT_4, # 시b (라#)
    "j": Hamster.NOTE_B_4, # 시
    "k": Hamster.NOTE_C_5, # 도
    "o": Hamster.NOTE_C_SHARP_5, # 도# (레b)
    "l": Hamster.NOTE_D_5, # 레
    "p": Hamster.NOTE_E_FLAT_5, # 미b (레#)
    ";": Hamster.NOTE_E_5, # 미
    "'": Hamster.NOTE_F_5 # 파
}

while True:
    key = Keyboard.read() # 키보드 이벤트를 얻는다.
    if key and key in notes: # 키보드 이벤트가 딕셔너리에 있으면
        hamster.note(0, 0.05) # 0.05 박자로 잠시 쉰다.
        hamster.note(notes[key]) # 키보드의 키에 해당하는 음을 소리낸다.

    wait(20) # 너무 빨리 반복하지 않도록 한다.
목차
수업 준비
  1. 하드웨어 살펴보기
  2. 햄스터 · 햄스터S · USB 동글 PDF · PPT
  3. 디바이스 드라이버 설치
  4. 윈도우 · 맥OS · 리눅스 PDF · PPT
  5. 파이썬 설치
  6. 윈도우 · 맥OS · 리눅스 PDF · PPT
  7. 라이브러리 설치
  8. PDF · PPT
  9. 로봇과 컴퓨터 연결
  10. PDF · PPT
  11. 예제 파일 실행
  12. 윈도우 · 맥OS · 리눅스 PDF · PPT
기초
  1. IDLE에서 새 파일 만들기
  2. 클라우드 컴퓨터 환경에서 작업하기 (선택 사항)
  3. 말판 이동하기 #1 (순차, 횟수 반복)
  4. 이동하고 회전하기
  5. LED 켜고 소리 내기
  6. 순서대로, 반복하여 명령하기
  7. 키보드 이벤트
  8. 근접 센서 사용하기
  9. 말판 이동하기 #2 (~인 동안 반복)
  10. 바닥 센서 사용하기
  11. 밝기 센서와 가속도 센서 사용하기
  12. 브레이튼버그의 로봇
심화
  1. 보드 게임 만들기
  2. 그래픽 인터페이스
  3. 센서 한 개를 사용한 라인 트레이서
  4. 센서 두 개를 사용한 라인 트레이서
  5. 햄스터 친구 따라가기 (2인 1조)
  6. 라인 트레이서 교차로 주행하기
  7. 벽 따라가기
  8. 컵 따라 돌기 (미로 찾기용 커버 사용)
  9. 슬라럼 (미로 찾기용 커버 사용)
  10. 미로 탈출 (미로 찾기용 커버 사용)
  11. 로봇 청소기 흉내 내기
  12. 병렬 처리 (버전 1.4.0부터)
  13. 이벤트 처리 (버전 1.4.0부터)
확장 키트
  1. 조립하기
  2. 핀/소켓 배치 살펴보기
  3. 디지털 입력 - 버튼을 누르면 삐 소리가 나요
  4. 디지털 출력 - 어두우면 LED 불이 켜져요
  5. 디지털 출력 - 반짝반짝 LED를 깜박여요
  6. 디지털 출력 - 기울이는 방향으로 LED가 켜져요
  7. 아날로그 입력 - 포텐셔미터를 돌리면 음 높이가 달라져요
  8. 아날로그 입력 - 뜨겁지 않게 해주세요
  9. 아날로그 입력 - 빛을 따라 움직여요
  10. PWM 출력 - LED 불이 부드럽게 밝아졌다 어두워져요
  11. PWM 출력 - LED 촛불이 바람에 흔들려요
  12. 아날로그 서보 출력 - 햄스터 로봇에게 꼬리가 생겼어요
고급
  1. 행위 기반의 로봇 제어
  2. 경로 탐색
  3. 자리 바꾸기
Copyright 로봇SW교육원 All rights reserved.
어려운 일이 있으면 광운대학교 로봇학부 박광현 교수(akaii@kw.ac.kr)에게 연락하세요.