[EV3]wiimote.py 해설

[목표]
레고 마인드스톰 EV3로 만든 로봇을 wii remote로 조종하기

[준비물]
– Lego EV3 robot
– wii remote
– ev3dev가 설치된 microSD (설치방법은 ev3dev 설치)
– {shell}python-cwiid{/shell} 패키지(HowTo: Python Wiimote fun)가 필요함 (설치방법은 {shell}apt-get install python-cwiid{/shell}로 설치해야 함)
– 그리고 아래와 같은 파이썬 코드

[python]
# wii remote로 로봇을 조종하기 위한 전제 조건
# 1. 왼쪽 모터는 B 포트에, 오른쪽 모터는 C 포트에, 팔을 구동할 모터는 D포트에 연결되어 있어야 함
# 2. ‘python-cwiid’ 패키지가 필요함
# 3. 블루투스가 켜있어야 함
# 4. wii remote의 2번 버튼을 누르고 있으면 전진, 1번 버튼을 누르고 있으면 후진함

# Drive your robot with a wii remote!
# Left motor on port B, right motor on port C,
# vertical arm on port D.
# Requires the package ‘python-cwiid’.
# Make sure bluetooth is enabled in brickman
# before trying to use this. Hold 2 to go forward
# and 1 to go backward.

import time

import cwiid
import pyev3

def clamp(value, lower, upper):
return min(upper, max(value, lower))

print ‘press 1+2 on the wiimote now’
time.sleep(1)
w = cwiid.Wiimote() #wiimote제어를 가져온다.
print ‘connected?’
w.led = 6
w.rpt_mode = cwiid.RPT_ACC | cwiid.RPT_BTN

left_motor = pyev3.Motor(pyev3.OUTPUT_B) #좌측모터 제어를 가져온다.
left_motor.reset()
left_motor.run_mode = ‘forever’
left_motor.regulation_mode = ‘on’

right_motor = pyev3.Motor(pyev3.OUTPUT_C) #우측무터 제어를 가져온다.
right_motor.reset()
right_motor.run_mode = ‘forever’
right_motor.regulation_mode = ‘on’

arm = pyev3.Motor(pyev3.OUTPUT_D)
arm.reset()
arm.run_mode = ‘forever’
arm.regulation_mode = ‘off’

target_distance = 8
top_speed = 720

left_motor.run = 1
right_motor.run = 1

last_btn_state = 0
move = 0

try:
while True: #무한루프 시작
state = w.state

buttons = state[‘buttons’]
if buttons != last_btn_state:
if buttons & cwiid.BTN_MINUS:
top_speed -= 10
print top_speed
if buttons & cwiid.BTN_PLUS:
top_speed += 10
print top_speed
if buttons & cwiid.BTN_2:
move = 1
elif buttons & cwiid.BTN_1:
move = -1
else:
move = 0
if buttons & cwiid.BTN_LEFT:
arm.duty_cycle_sp = 100
arm.run = 1
elif buttons & cwiid.BTN_RIGHT:
arm.duty_cycle_sp = -100
arm.run = 1
else:
arm.run = 0
print top_speed, move
last_btn_state = buttons

if move:
acc = state[‘acc’]
tilt = (clamp(acc[1], 95, 145) – 120) / 25.0 # roughly between -0.5 and 0.5
turn = top_speed * tilt
turn = clamp(turn, -abs(top_speed), abs(top_speed))
left_motor.pulses_per_second_sp = int(top_speed – turn) * move
right_motor.pulses_per_second_sp = int(top_speed + turn) * move
else:
left_motor.pulses_per_second_sp = 0
right_motor.pulses_per_second_sp = 0
finally:
left_motor.run = 0
right_motor.run = 0
[/python]

[더 읽을거리]
ev3dev 설치

spacer