Я использую MicroPython с Lego Mindstorms EV3. Нужна помощь в настройке сопрограмм, чтобы мой робот мог обнаруживать вхоPython

Программы на Python
Ответить
Anonymous
 Я использую MicroPython с Lego Mindstorms EV3. Нужна помощь в настройке сопрограмм, чтобы мой робот мог обнаруживать вхо

Сообщение Anonymous »

Я пытаюсь запрограммировать робота Lego EV3 с помощью MicroPython для демонстрации робототехники за 2 дня. У меня большая часть функций работает, за исключением одной основной проблемы. Если срабатывает один из датчиков (например, датчик касания), робот должен говорить. Однако если робот активно получает входные данные от ИК-пульта дистанционного управления (который управляет движением) при срабатывании датчика, это движение будет продолжаться, пока робот говорит, независимо от того, какие кнопки нажаты на пульте дистанционного управления. Я знаю, что это потому, что функция ev3.speaker.say() является «блокирующим вызовом».
Я знаю, что мне нужно настроить сопрограммы, чтобы робот мог продолжать проверять входные данные с ИК-пульта дистанционного управления, пока он говорит. Я искал, как это сделать, и посмотрел демо-версию LEGO «Gyro Boy», но все еще не могу заставить ее работать. В этой текущей версии кода робот вообще не двигается, даже когда я нажимаю кнопки на пульте, что должно заставить его выйти из цикла while и выполнить код движения, но по какой-то причине этого не происходит.
Я также пробовал использовать многопоточность вместо сопрограмм, но это тоже не сработало.
Если кто-то не знаком со спецификой программирования EV3, документация представляет собой набор HTML-файлов, которые прилагаются к загрузке, поэтому я загрузил его копию на свой Google Диск. Вот ссылка на эту папку: https://drive.google.com/drive/folders/ ... sp=sharing. Я рекомендую загрузить всю папку документации Python EV3.
Вот мой текущий код:
(Я знаю, что мы должны размещать минимальный воспроизводимый код, но не знаю, в чем здесь проблема, поэтому я не могу изолировать ее, чтобы создать воспроизводимый код. Кроме того, у меня нет времени беспокоиться об этом. (Мне нужно, чтобы это работало утром послезавтра, а завтра я работаю весь день и Сегодня вечером я занят, поэтому у меня есть буквально пара часов, чтобы разобраться с этим.)
#!/usr/bin/env pybricks-micropython
from ucollections import namedtuple
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
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

#### Define Robot Hardware and Connections ####
armMotor = Motor(Port.A)
leftMotor = Motor(Port.B)
rightMotor = Motor(Port.C)
touchSensor = TouchSensor(Port.S1)
gyroSensor = GyroSensor(Port.S2)
colorSensor = ColorSensor(Port.S3)
irSensor = InfraredSensor(Port.S4)

#### Define Constants ####
WHEEL_DIAMETER = 30.5 # mm
AXLE_TRACK = 200 # mm
LEG_MOTOR_SPEED = 500 # deg/s
GYRO_INIT_VALUE = gyroSensor.angle()
ARM_MOTOR_SPEED = 600 # deg/s
CAN_USE_COLOR_SENSORS = True

#### Define Objects ####
ev3 = EV3Brick()

# Not currently using the DriveBase
# robotDriveBase = DriveBase(leftMotor, rightMotor, WHEEL_DIAMETER, AXLE_TRACK)

#### Settings / Config ####
ev3.speaker.set_speech_options(None, "m1", 180, 80)

#### Define Functions Here ####
def MotorControlAndActions():
# Remote Control

# ----> COROUTINE IMPLEMENTATION ATTEMPT
while len(irSensor.buttons(1)) == 0 and len(irSensor.buttons(2)) == 0:
yield

if Button.LEFT_UP in irSensor.buttons(1):
leftMotor.run(LEG_MOTOR_SPEED)
elif Button.LEFT_DOWN in irSensor.buttons(1):
leftMotor.run(-LEG_MOTOR_SPEED)
else:
leftMotor.brake()

if Button.RIGHT_UP in irSensor.buttons(1):
rightMotor.run(LEG_MOTOR_SPEED)
elif Button.RIGHT_DOWN in irSensor.buttons(1):
rightMotor.run(-LEG_MOTOR_SPEED)
else:
rightMotor.brake()

# Shooting Control
if Button.LEFT_UP in irSensor.buttons(2):
armMotor.run(ARM_MOTOR_SPEED)
else:
armMotor.brake()

# MAIN NON-COROUTINE FUNCTION
def SensorDetectAndReact():
# Sensor Control
if touchSensor.pressed() == True:
# {
ev3.speaker.say("Yo Dawg! I grabbed somethin... I wonder what it is? Alas, I ain't got no way of figuring dat out...")
# }

elif colorSensor.ambient() > 30:
ev3.speaker.say("YO! Its too bright in here! Turn the lights down, please?")
elif colorSensor.ambient() == 0:
ev3.speaker.say("Hey... I can't see. Can somebody turn a light on? I'm too short...")
elif CAN_USE_COLOR_SENSORS == True:
if colorSensor.color() == Color.RED:
ev3.speaker.say("AHH! There's something red on my shoulder! Get It Off!")
elif colorSensor.color() == Color.BLUE:
ev3.speaker.say("Coooool dude. I got somethin blue on me.")
elif colorSensor.color() == Color.WHITE:
ev3.speaker.say("Some white stuff has fallen on my shoulder. Does it feel frosty in here or is it just me?")
elif colorSensor.color() == Color.BROWN:
ev3.speaker.say("HEY! Who put this brown")
ev3.speaker.beep()
ev3.speaker.say("on my shoulder! That's nasty!")
elif colorSensor.color() == Color.YELLOW:
ev3.speaker.say("I sense something yellow. Reminds me of sunny days...")
elif colorSensor.color() == Color.GREEN:
ev3.speaker.say("GREEN MEANS GO!")
# robotDriveBase.straight(100)
ev3.speaker.say("Oh... wait... sorry.")
# robotDriveBase.straight(-100)
# elif colorSensor.color() == Color.BLACK:
# ev3.speaker.say("Theres something black on me... I dont know what to do with that...")

# if gyroSensor.angle() > GYRO_INIT_VALUE + 70 or gyroSensor.angle() < GYRO_INIT_VALUE - 70:
# rightMotor.brake()
# leftMotor.brake()
# ev3.speaker.say("Whoops!!! It looks like I just bit the dirt!! Can somebody help me back up please?")
return

# }

#### Main Code Loop ####
while True:
# {
SensorDetectAndReact()
MotorControlAndActions()

# }


Подробнее здесь: https://stackoverflow.com/questions/798 ... -coroutine
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»