Я пытаюсь запрограммировать робота Lego EV3 с помощью MicroPython. Если срабатывает один из датчиков (например, датчик касания), робот должен говорить. Однако если робот активно получает сигналы от ИК-пульта дистанционного управления (который управляет движением) во время срабатывания датчика, предыдущее движение будет продолжаться, пока робот говорит, независимо от того, какие кнопки нажаты на пульте дистанционного управления. Я знаю, что это потому, что функция ev3.speaker.say() является «блокирующим вызовом».
Я знаю, что мне нужно настроить сопрограммы, чтобы робот мог продолжать проверять входные данные с ИК-пульта дистанционного управления, пока он говорит. Я искал, как это сделать, и посмотрел демо-версию LEGO «Gyro Boy», но все еще не могу заставить ее работать. С этим текущим кодом робот вообще не двигается, даже когда я нажимаю кнопки на пульте дистанционного управления, что должно заставить его выйти из цикла while и выполнить код движения, но этого не происходит.
Я также пробовал использовать многопоточность вместо сопрограмм, но это тоже не сработало.
Документация по программированию EV3 представляет собой набор HTML-файлов, которые входят в загрузку, поэтому я загрузил ее на Google Диск папка.
Вот мой текущий код:
#!/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 ... king-calls
Обнаружение ввода с ИК-пульта EV3 во время блокировки вызовов ⇐ Python
Программы на Python
-
Anonymous
1771269849
Anonymous
Я пытаюсь запрограммировать робота Lego EV3 с помощью MicroPython. Если срабатывает один из датчиков (например, датчик касания), робот должен говорить. Однако если робот активно получает сигналы от ИК-пульта дистанционного управления (который управляет движением) во время срабатывания датчика, предыдущее движение будет продолжаться, пока робот говорит, независимо от того, какие кнопки нажаты на пульте дистанционного управления. Я знаю, что это потому, что функция ev3.speaker.say() является «блокирующим вызовом».
Я знаю, что мне нужно настроить сопрограммы, чтобы робот мог продолжать проверять входные данные с ИК-пульта дистанционного управления, пока он говорит. Я искал, как это сделать, и посмотрел демо-версию LEGO «Gyro Boy», но все еще не могу заставить ее работать. С этим текущим кодом робот вообще не двигается, даже когда я нажимаю кнопки на пульте дистанционного управления, что должно заставить его выйти из цикла while и выполнить код движения, но этого не происходит.
Я также пробовал использовать многопоточность вместо сопрограмм, но это тоже не сработало.
Документация по программированию EV3 представляет собой набор HTML-файлов, которые входят в загрузку, поэтому я загрузил ее на Google Диск папка.
Вот мой текущий код:
#!/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()
# }
Подробнее здесь: [url]https://stackoverflow.com/questions/79890424/detect-input-from-ev3-ir-remote-during-blocking-calls[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия