Archives

[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

EV3에 ev3dev를 설치하다

선택 이유
– firmware가 아니다.
– linux이다.
– microSD(32GB이하 짜리를 이용해야 함. 이를 초과하면 인식하지 못함)에 설치한 다음, 꽂기만 하면 된다.

설치 순서(Getting Started with ev3dev)
1. 디스크 이미지 파일을 내려 받는다.
https://github.com/ev3dev/ev3dev/releases
여기에는 LEGO MINDSTORMS EV3({shell}ev3-{/shell}로 시작하는 파일 선택), Raspberry Pi({shell}rpi-{/shell}로 시작하는 이미지 파일 선택)와 Raspberry Pi 2({shell}rpi2-{/shell}로 시작하는 이미지 파일 선택)를 위한 것도 있다.
2. 디스크 이미지를 microSD에 옮긴다.
http://www.ev3dev.org/docs/tutorials/writing-sd-card-image-mac-command-line/
3. microSD를 ev3에 꽂고 작동시킨다.
처음 부팅할 때는 시간이 많이 걸린다.
4. ev3와 통신할 수 있도록 한다.
Connecting to the Internet via Bluetooth
user : robot
default passwd : maker
따라서 접속한 다음, {shell}passwd{/shell}명령어를 이용해서 비밀번호를 바꾸는 것이 좋다.

5. 통신을 통해서 프로그램을 설치하거나, 파일을 옮길 수 있다.

프로그램 실행하기
python 프로그램을 실행시키기 위해서는 셀스크립트를 만들어서 실행시킨다.(출처:Launch programs from brickman)
[shell]#!/bin/bash
python program.py[/shell]

spacer

광명을 찾았다

오늘 드디어 돗수가 있는 물안경을 쓰고 처음으로 수영을 했다.
물속에서도 볼 수 있다니! 수영장에서도 사람이 보이다니!
물속에 들어가도 보이니 두려움이 쬐끔 줄었다.
물속에 눈 감고 있는 것은 사실 많이 공포스럽다.
물속이 더 잘 보인다. (근시인 사람이 물속에서는 정상시력인 사람인보다 더 잘 보인다. 공기와 물의 굴절률이 다르기 때문이다. 험험…)

그리고, 왜 팔이 뻐근한지도 알았다. 내가 양팔을 너무 크게 휘저어서 힘이 많이 들었다.
유투브는 정말 많은 것을 알려준다. 그래도 전체적인 감독은 두 아들이 하고 있다.
문제는 숨쉬기, 팔젓기, 발차기 등등이 제각각 놀고 있다. 그래서 여전히 힘들다.

이 물안경을 주문하기 위해서 한국 안경점에 전화해서 시력을 확인했다.
그리고 아마존에 주문했는데, 중국 광저우에서부터 배달이 되는 바람에 참 오래 걸렸다.
아파트 수영장 물 뺀 다음에 물안경이 배달되는 줄 알았다.

swim goggle

[더 읽을거리]
아마존 상품 정보

spacer

9월 22일

[연구실 출근]
오늘은 두 아들을 등교시키고, 바로 대학 연구실로 갔다.
시간이 얼마나 걸리는 지를 확인하기 위해서다.
7시 반 쯤에 부시중학교를 가고, 8시 2분에 연구실에 갔다.
로비에 이미 적지 않은 수의 학생이 있었다.
연구실에는 아무도 없다. 그래서 들어갈 수 없다. 왜? 난 아직 신분증을 받지 못했다. 쩝
로비에서 연구노트를 읽었다.
9시에 다시 연구실에 갔더니, 한 학생이 와있다.

[칸쿤 호텔 예약]
오늘 칸쿤에 있는 호텔 예약을 했다.
어제 항공권 예약에 이어서 방을 잡은 것이다. 큰 것은 다 예약했다.

[휴대전화 요금제]
T-Mobile 소비자 상담을 chat으로 했다.
국제전화 선택사항이 삭제되지 않는다는 것과 그로 인해 10불을 내게 되었다는 것을 얘기했더니, 둘 다 해결해줬다.
역시 챗이 훨씬 편하다.

[텔레비전 배송]
오늘도 텔레비전에 대한 연락은 없다.
가져오는 것도 가져가는 것도 모두 연락이 없다.
이번 주에 일이 끝날라나?

[축구 교실]
저녁에 창연이, 예준이, 하늘이를 태우고 공원에 갔다.
운동전에 아이들을 모아 놓고 설명을 했다. 지난 주처럼.

[창선 이발]
그 사이 창선이는 머리를 깎았다. 정사모님이 수고해 주셨다. 감사합니다.

spacer

9월 21일

[칸쿤 예약 확인]
이주전에 예약한 내용을 고객상담 채팅으로 확인했다.
내가 분명히 예약하고 결제했는데, 예약 정보가 없고 예약확인 메일도 없어서 다시 확인했다.
상담원에게 탑승자 이름을 줘서 예약여부를 확인했으나, 아무런 소득이 없었다.
그래서 우리의 예약이 완전하게 이루어지지 않은 것을 확인했다.
이중 예약을 할 수 없으니, 확인을 했던 것이다. 이렇게 오전이 간다.
이제 새로 예약을 해야 한다.

예약확인 방법 : 확인 이메일 또는 문자, 통장 확인

예약으로 어제그제 잠을 못잔 집사람이 침대에 자는 동안, 점심을 차렸다.

[칸쿤 항공권 예약]
문제는 항공편이 편한 것이 없다.
밤에 타서 새벽에 도착하는 것과 공항에서 밤새 기다려야 하는 것 밖에 없다.
그래도 예약을 했다.

[휴대전화 요금제 문제]
지난 달에 국제전화 서비스를 신청했었다. 집사람 전화로 국제전화를 할 수 있으니, 굳이 내가 또 할 필요가 없없다. 그래서 어제 서비스를 취소하려 했으나 불가능했었다. 그리고 새로 시작하는 한 달 요금을 내야했는데, 그 서비스요금(10불)도 포함되어 나왔다.
요금도 오늘(21일)까지 내라고 한다. 분명히 문자로는 22일까지였는데, 웹페이지에는 21일이라고 하니 어쩔 줄을 모르겠다. 아무래도 내일 고객상담 신청을 해야겠다. 일단 60불을 냈다.

spacer