EV3
EV3 파이썬 추적자 로봇(초음파센서,모터)
유찬맨
2021. 9. 6. 23:43
반응형
초음파 센서와 모터를 이용하여 손을 따라다니는 로봇을 제작하였다.
왼쪽 모터 = B
오른쪽 모터 = C
전방 초음파 = 1
좌측 초음파 = 2
우측 초음파 = 3
로봇을 처음 제작하여서 어디서부터 설계해야 할지 어려움이 있었다.
미션인 막대를 잘 밀기 위해 막대의 중심에 맞게 전방에 모양을 설계하였다.
스크린에 초음파 값을 클리어해주어야 하는데
딜레이를 사용하면 주행에 지장을 주어
딜레이를 사용하지 않고 스크린에 센서 값을 작성해 주었다.
#!/usr/bin/env pybricks-micropython
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,UltrasonicSensor,
InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile, Font
ev3 = EV3Brick() #138
Ultrasonic_Sensor1 = UltrasonicSensor(Port.S1)
Ultrasonic_Sensor2 = UltrasonicSensor(Port.S2)
Ultrasonic_Sensor3 = UltrasonicSensor(Port.S3)
Ultrasonic_Sensor1.distance()
left_motor = Motor(Port.B)
right_motor = Motor(Port.C)
robot = DriveBase(left_motor,right_motor,55.5,102)
def gom(sec):
left_motor.run_time(-300,sec,Stop.BRAKE, False)
right_motor.run_time(-100,sec,Stop.BRAKE, True)
def poth(): #서브미션인 막대 밀어 넣기 함수
while 1:
if Ultrasonic_Sensor1.distance()<50:
break
else:
robot.drive(200,0)
wait(100)
robot.drive(-100,0)#바퀴를 역회전 시켜 막대를 더 잘 밀어넣을 수 있게 한다
wait(100)
def gogo(): #추적자 메인 함수
if Ultrasonic_Sensor1.distance()<300 and Ultrasonic_Sensor2.distance()<300 and Ultrasonic_Sensor3.distance()<300:
poth() #서브미션 발동 조건
elif Ultrasonic_Sensor1.distance()<300 and Ultrasonic_Sensor3.distance()<300:
robot.drive(150,255-Ultrasonic_Sensor3.distance())#센서값이 클수록 더 많이 꺾는다
elif Ultrasonic_Sensor1.distance()<300 and Ultrasonic_Sensor2.distance()<300:
robot.drive(150,-1*(255-Ultrasonic_Sensor2.distance()))
elif Ultrasonic_Sensor1.distance()<300:
robot.drive(150,0)
else:
robot.drive(0,0)
s_pan=0
def screen_yuchan(): #초음파 센서의 값을 딜레이 없이 EV3스크린에 쓰는 함수
global s_pan
s_pan+=1
if s_pan>50: #카운트가 50보다 클때마다 스크린에 센서값을 작성한다
ev3.screen.clear()
ev3.screen.draw_text(0,0, str(Ultrasonic_Sensor1.distance())+'mm')
ev3.screen.draw_text(0,20, str(Ultrasonic_Sensor2.distance())+'mm')
ev3.screen.draw_text(0,40, str(Ultrasonic_Sensor3.distance())+'mm')
s_pan=0
main_pan=0
while 1:
screen_yuchan()
if Ultrasonic_Sensor1.distance()<50: #메인 코드 발동조건
main_pan=1
elif main_pan==1:
gogo()
반응형