Использование двигателей

Использование двигателей

На этой странице описаны не все доступные двигательные функции, а только те, которые представляют наибольший интерес для начинающих программистов EV3 Python. Полное описание смотрите в официальной документации .
В новой (версия 2) библиотеке EV3 Python реализованы значительные улучшения моторных функций. Улучшения включают в себя:введение классов MoveSteering и  MoveTank , которые имитируют функциональность блоков Move Steering и Move Tank в стандартной системе на основе значков Lego EV3, иногда называемой EV3-G.

целый ряд новых on-функций, похожих на run-функции библиотеки v1, но лучше. Поскольку функции «on» лучше, вы должны использовать их, а не функции «run», даже если функции «run» все еще доступны (по крайней мере, на данный момент…). Поскольку функции «запуска» неполноценны, они не будут использоваться на этом сайте, хотя на старом сайте, посвященном библиотеке EV3 Python v1 , функции «запуска» описаны.

С помощью новых функций можно задавать значения угла в градусах и оборотах, а значения времени в минутах и ​​секундах. Например, вы можете запросить, чтобы двигатель вращался со скоростью 10 оборотов в минуту.

В новой библиотеке есть функция wait_until_not_moving() для одиночных моторов, которая может быть полезна, например, для определения того, прекратили ли движение захватные рычаги, которые смыкаются вокруг объекта (вы не будете точно знать, какое значение угла или времени использовать, чтобы заставить руки смыкаются).

Новые функции «включения» делают программу «блокировкой» (паузой) до тех пор, пока движение не завершится, прежде чем продолжить, что является тем же поведением  , что и блокировка двигателя в EV-G, и почти всегда  то, что вам нужно. Если вы не хотите, чтобы функция  блокировала программу, это тоже  вариант  .Общие параметры, используемые функциями onскоростьБольшинство методов, использующих двигатели, принимают  аргумент скорости . скорость представляет собой целое число, которое представляет собой  процент от номинальной максимальной скорости двигателя . Например, если вы установите скорость  на 50, то двигатель будет работать на 50% от его номинальной максимальной скорости (для функций, которые управляют двумя двигателями, скорость относится к более быстрому двигателю).Номинальная максимальная скорость большого двигателя Lego EV3 составляет 1050 градусов в секунду .Номинальная  максимальная скорость среднего двигателя Lego EV3 составляет 1560 градусов в секунду .Двигатели обычно не способны надежно и точно достигать своей номинальной максимальной скорости, поэтому не следует использовать значения скорости выше 90 .В официальной документации  вы часто будете видеть ссылки на «количество тахометров в секунду», но для двигателей  Lego EV3 это просто то же самое, что и градусы в секунду.Как указывалось ранее,  скорость представляет собой  процент от номинальной максимальной скорости двигателя . Следовательно , если для большого и среднего двигателей установлена ​​скорость = 50 , то они будут работать с разными скоростями (в градусах в секунду). Большой двигатель будет работать со скоростью 50% x 1050 = 525 градусов в секунду, а средний двигатель будет работать со скоростью 50% x 1560 = 780 градусов в секунду. Также можно указать скорость в градусах в секунду или оборотах в секунду , или градусах в минуту , или оборотах в минуту — во всех этих случаях большие и средние двигатели будут вращаться с одинаковой скоростью, если вы зададите им одинаковое значение, например, 100 градусов в минуту. второй       . Это работает следующим образом: вы вводите желаемое значение, например, в градусах в секунду, а функция преобразует его в соответствующее значение скорости  . Например , SpeedDPS() преобразует значение в градусах в секунду в соответствующее значение скорости  . Следующий сценарий демонстрирует использование этих функций преобразования. Обратите внимание, что эти функции преобразования должны быть импортированы , прежде чем их можно будет использовать в скрипте, как показано ниже. #!/usr/bin/env python3из ev3dev2.motor импортировать LargeMotorиз ev3dev2.motor импортировать SpeedDPS, SpeedRPM, SpeedRPS, SpeedDPMиз времени импортировать сон
лм = большой двигатель ()
»’Это запустит большой двигатель на 50% его мощности.расчетная максимальная скорость 1050 град/с.50% х 1050 = 525 град/с»’lm.on_for_seconds (скорость = 50, секунды = 3)спать(1)
»’скорость и секунды являются ПОЗИЦИОННЫМИаргументы, что означаетвам не нужно включать имена параметров какпока вы ставите аргументы в этом порядке (скорость, затем секунды), так что это то же самое, что ипредыдущая команда:»’lm.on_for_seconds(50, 3)спать(1)
»’Это будет работать со скоростью 500 градусов в секунду (DPS).Вы должны быть в состоянии услышать, что двигатель работаетнемного медленнее, чем раньше.»’lm.on_for_seconds (скорость = SpeedDPS (500) , секунды = 3)спать(1)
# 36000 градусов в минуту (DPM) (редко полезно!)lm.on_for_seconds (скорость = SpeedDPM (36000) , секунды = 3)спать(1)
# 2 оборота в секунду (RPS)lm.on_for_seconds (скорость = SpeedRPS (2) , секунды = 3)спать(1)
# 100 оборотов в минуту (об/мин)lm.on_for_seconds (скорость = SpeedRPM (100) , секунды = 3)
тормозтормоз является булевым параметром, что означает, что он может принимать  значения True или False . Если это правда, то, как только двигатель завершит свое движение, двигатель будет активно пытаться удерживать двигатель в фиксированном положении. Если тормоз равен False, то  , как только двигатель завершит свое движение, двигатель постепенно остановится, замедляясь только за счет трения. тормоз всегда имеет значение True по умолчанию. тормоз является аргументом ключевого слова  («kwarg»), поэтому вам не нужно включать его в команду двигателя, но если вы включаете, вы должны указать имя, а также значение, например, rake=False . блокировать«Блокировка» программы означает приостановку выполнения программы до тех пор, пока текущая команда не будет завершена. Многие моторные команды v2 имеют аргумент ‘ block ‘, и почти в каждом случае block=True по умолчанию. Исключением является функция on( ), для которой block=False по умолчанию. block является  аргументом ключевого слова, и поэтому вам не обязательно включать его в свой код для запуска команды. Если вы не включите  block=False , то будет использоваться значение по умолчанию block=True (за исключением функции on() , для которой block=False  по умолчанию ). функции включения для управления одним двигателемВы можете заставить один или несколько двигателей вращаться с заданной скоростью.через заданный уголна определенное время’навсегда’ (пока двигатель не будет остановлен командой off () и позднее во время выполнения программы)пока он не перестанет двигаться (например, когда захват закрывает объект)на заданную позициюпока не будет достигнуто другое состояние
Поверните один двигатель на заданный уголИспользуйте либо on_for_rotations() , либо on_for_degrees() :
on_for_rotations(speed, rotations, brake=True, block=True)Вращайте двигатель на скорости  для оборотов.Пример: включить один двигатель на 5 оборотов при 50% его номинальной максимальной скорости:on_for_rotations(speed=50, rotations=5)
Имена позиционных аргументов указывать не нужно, если аргументы указаны в правильном порядке и вы никогда не ставите безымянный аргумент после именованного аргумента, так что это то же самое, что и выше:on_for_rotations(50, 5)
Чтобы сделать ваши скрипты максимально понятными, вероятно, будет хорошей идеей включить имена, как я обычно делаю на этом сайте.
Как объяснялось ранее, скорость  представляет собой целое число в процентах от номинальной максимальной скорости двигателя. Функции преобразования доступны для преобразования таких единиц, как градусы в секунду, в соответствующее значение скорости  , как описано выше. Пример: чтобы повернуть один двигатель на 5 оборотов со скоростью 500 градусов в секунду:on_for_ вращений (скорость = SpeedDPS (500) ,  вращений = 5 )Не забудьте импортировать функцию преобразования, прежде чем использовать ее, как показано в первом скрипте на этой странице.
Как упоминалось ранее, вам не нужно включать аргументы ключевого слова « тормоз » и « блок» , если вы хотите использовать их значения по умолчанию «Истина» и «Истина», как это обычно бывает.

on_for_degrees(speed, degrees, brake=True, block=True)
Поверните двигатель на скорости  на градусы .
Пример: поверните один двигатель на 90 градусов при 80% номинальной максимальной скорости:on_for_grades (скорость = 80, градусы = 90)
Запуск одного двигателя в течение заданного времениon_for_seconds(speed, seconds, brake=True, block=True)
Вращайте двигатель на скорости в  течение нескольких секунд
Пример: двигатель должен работать на 40 % от  номинальной максимальной скорости в течение 3 секунд: on_for_seconds (скорость = 40, секунды = 3)

Запустите один двигатель «навсегда»on(speed, brake=True, block=False)Вращайте двигатель на скорости  «навсегда»Пример: для включения двигателя на 45% от номинальной максимальной скорости:вкл(скорость=45)Остановить один двигательВам часто понадобится это, чтобы выключить двигатель, который вы включили «навсегда» с помощью  on() .off()
Запустите один двигатель, пока он не перестанет двигатьсяХорошим примером может быть ситуация, когда руки захвата смыкаются вокруг какого-либо объекта. Вы не можете точно знать, какому углу или какому времени соответствует это движение.
wait_until_not_moving()
Эта команда обычно выдается после команды on() , как в этом примере. Просто возьмите движущееся колесо, чтобы остановить его, и скрипт прекратит работу.#!/usr/bin/env python3from ev3dev2.motor import LargeMotor, OUTPUT_B
large_motor = LargeMotor(OUTPUT_B)
large_motor.on(speed=50)large_motor.wait_until_not_moving()
Поверните один двигатель в заданное положениеПо состоянию на декабрь 2018 года в этой команде может быть ошибка, которая может привести к зависанию программы. В частности, если двигателю приказано переместиться в положение, которое находится в пределах примерно 10 градусов от его текущего положения, это может привести к сбою, что приведет к зависанию программы. Поэтому я советую вам пока избегать использования этой функции .
on_to_position(speed, position, brake=True, block=True)Эта функция игнорирует знак скорости, что имеет смысл, поскольку всегда будет только одно возможное направление вращения двигателя для достижения запрошенного положения. Важно понимать, что положение (угол) имеет бесконечную шкалу, и поэтому двигатель будет вращаться предсказуемым образом. Например, если двигатель находится в положении 1° и получает указание перейти в положение 359°, то он повернется в положительном направлении на 358°. Не утверждайте, что начальная и конечная позиции разделены всего на 2° — они разделены на 358°. Если двигатель находится в положении 180° и вы даете ему указание перейти на -540°, то он повернется на 720° (два оборота) в отрицательном направлении — он окажется в том же физическом положении, что и до его перемещения, но теперь он «официально» в новой позиции -540°.
Запустите один двигатель, пока не будет достигнуто какое-то другое состояниеДругие функции для одиночных двигателей см. в официальной документации .
Используйте двигатель в качестве датчикаПоскольку вы можете прочитать положение двигателя, вы можете использовать двигатель в качестве датчика. Например, вы можете вручную повернуть двигатель, а затем иметь код, который может управлять скоростью второго двигателя или воспроизводить звуки, например, в зависимости от положения двигателя. Для двигателей Lego EV3 position возвращает текущее положение двигателя в градусах. Когда двигатель вращается по часовой стрелке (как видно, если держать двигатель таким образом, что красная ось двигателя находится внизу справа), положение увеличится. Аналогично, вращение против часовой стрелки приводит к уменьшению положения. Запись установит позицию на это значение.функции «вкл.» для управления парой двигателейВ эту группу функций входят очень важные функции MoveSteering и MoveTank .
Так же, как и в системе на основе значков Lego EV3,  функции MoveTank управляют двумя двигателями на основе  значений левой_скорости  и  правой_скорости  .
Как и в системе на основе значков Lego EV3,  функции  MoveSteering  управляют двумя двигателями на основе значения рулевого управления и значения скорости (EV3-G называет скорость «мощностью»). Немного сложнее объяснить значение этих параметров по сравнению с параметрами MoveTank . Значение рулевого управления управляет траекторией движения робота и может быть любым значением в диапазоне от -100 до +100.-100 означает поворот налево на месте-50 означает поворот налево с не вращающимся левым колесом0 означает идти прямо+50 означает поворот направо с не вращающимся правым колесом+100 означает поворот направо на местеЗначение скорости относится к скорости более быстрого колеса (иногда колеса могут быть одинаково быстрыми, например, когда рулевое управление = 0). Скорость более медленного колеса рассчитывается автоматически на основе значений рулевого управления и скорости .
Эта диаграмма может помочь вам понять взаимосвязь между MoveTank и MoveSteering . Он предназначен для того, чтобы показать, какие значения left_speed и right_speed ( параметры MoveTank ) соответствуют всем возможным значениям рулевого управления и значению скорости 40 ( параметры MoveSteering ).

Для всех значений рулевого управления (от -100 до +100) всегда есть хотя бы один двигатель со скоростью, равной значению скорости 40.Когда рулевое управление =0, мы замечаем, что и left_speed , и right_speed равны скорости , равной 40.При  рулевом управлении =25 мы отмечаем, что left_speed=40  и right_speed=20  При  рулевом управлении =50 мы отмечаем, что left_speed=40  и right_speed=0  При  рулевом управлении =100 мы отмечаем, что left_speed=40  и right_speed=-40  Прежде чем вы сможете использовать эти функции MoveTank и MoveSteering , вы должны импортировать их и определить пару двигателей. По умолчанию эти функции будут работать с большими двигателями Lego EV3, и вам не нужно импортировать LargeMotor , чтобы использовать эти функции с парой больших двигателей. Ниже используются разумные имена для сопряжения больших двигателей:steer_pair = MoveSteering(OUTPUT_B, OUTPUT_C)tank_pair = MoveTank(OUTPUT_B, OUTPUT_C)Я рекомендую вам не использовать имена типа drive_pair, иначе когда вы столкнетесь с кодом типа drive_pair.on_for_seconds(50,50,3)  , вы не узнаете из него, является ли это командой рулевого управления или командой танка — движения будут очень разные.
Вы также можете использовать эти функции с парой средних двигателей, но в этом случае вам необходимо импортировать MediumMotor . Вам также необходимо указать в сопряжении, что вы используете средние двигатели, например :tank_pair= MoveTank(OUTPUT_B, OUTPUT_C, motor_class=MediumMotor)
Вот полный скрипт с использованием пары средних моторов:#!/usr/bin/env python3from ev3dev2.motor import MediumMotor, MoveSteering, OUTPUT_A, OUTPUT_Dfrom time import sleep
steer_pair = MoveSteering(OUTPUT_A, OUTPUT_D, motor_class=MediumMotor)
steer_pair.on_for_seconds(steering=0, speed=50, seconds=2)

Вы должны использовать подходящую пару двигателей, поэтому вы не можете соединить большой двигатель со средним двигателем.
Переместить танк на заданный уголИспользуйте либо on_for_rotations() , либо on_for_degrees().on_for_rotations(left_speed, right_speed, rotations, brake=True, block=True)Вращайте моторы со скоростью left_speed и right_speed для вращения . Как и для параметра скорости  , который используется с одиночными двигателями, левая_скорость и правая_скорость представляют собой целые проценты от  номинальной максимальной скорости двигателя. Как и в случае со скоростью , вы можете использовать функции преобразования, такие как SpeedDPS()  , которые преобразуют градусы в секунду в соответствующие  значения left_speed или right_speed . 
Если левая_скорость не равна правой_скорости (т. е. робот будет вращаться), двигатель снаружи поворота (тот, у которого более высокая скорость) будет вращаться на полные обороты , в то время как для двигателя внутри будет рассчитано количество оборотов. в соответствии с ожидаемым оборотом.
Пример:tank_pair = MoveTank(OUTPUT_B, OUTPUT_C)# drive in a turn for 10 rotations of the outer (faster) motortank_pair.on_for_rotations(left_speed=50, right_speed=75, rotations=10)
Поскольку это позиционные аргументы, имена необязательны, поэтому можно написать одну и ту же командуtank_pair.on_for_rotations(50, 75, 10)но, вероятно, лучше включить имена для ясности.
on_for_degrees(left_speed, right_speed, degrees, brake=True, block=True)Вращайте моторы на left_speed и right_speed на градусы . Единственная разница между  on_for_rotations() и  on_for_degrees() заключается в том, что в одном используются повороты, а в другом — градусы.Переместить танк на заданное времяon_for_seconds(left_speed, right_speed, seconds, brake=True, block=True)Вращайте моторы со скоростью left_speed и right_speed в течение секунд .Переместить танк «навсегда»на (левая_скорость, правая_скорость)Начните вращать двигатели в соответствии с левой_скоростью и правой_скоростью навсегда.Остановить моторыoff(brake=True)Немедленно остановите оба двигателя.Пример скриптаЗаставьте робота двигаться вперед по прямой до тех пор, пока не будет нажат сенсорный датчик, прикрепленный к бамперу, затем остановите оба двигателя. Обратите внимание, что ‘ is_pressed ‘ не является функцией, поэтому ей не нужны круглые скобки. Обратите внимание, что здесь неуместно использовать ts.wait_for_bump() , потому что, когда бампер сталкивается с объектом, это «нажатие» на датчик касания, а не «удар» (нажатие и отпускание). Наконец, заметьте также, что после выключения двигателей тормоз будет действовать на них в течение 5 секунд, в течение которых их будет очень трудно провернуть вручную, тогда как после завершения программы  их будет намного легче провернуть.
#!/usr/bin/env python3from ev3dev2.motor import MoveTank, OUTPUT_B, OUTPUT_Cfrom ev3dev2.sensor.lego import TouchSensorfrom time import sleep
ts = TouchSensor()tank_pair = MoveTank(OUTPUT_B, OUTPUT_C)
tank_pair.on(left_speed=30, right_speed=30)
while not ts.is_pressed:  # while touch sensor is not pressed    sleep(0.01)
tank_pair.off()sleep(5)Переместить руль на заданный уголИспользуйте либо  on_for_rotations() , либо on_for_degrees().  on_for_rotations(steering, speedrotations, brake=True, block=True)Вращайте моторы так, чтобы робот двигался по траектории, определяемой рулевым управлением , и чтобы более быстрый мотор имел скорость, равную скорости, и двигался на угол, заданный поворотами . Скорость и угол поворота более медленного двигателя вычисляются автоматически на основе значений рулевого управления и скорости .
скорость представляет собой целое число в процентах от  номинальной максимальной скорости двигателя. Вы можете использовать функции преобразования, такие как  SpeedDPS()  , которые преобразуют градусы в секунду в соответствующее  значение скорости . 
Пример:steer_pair = MoveSteering (OUTPUT_B, OUTPUT_C)# заезжаем в оборот на 10 оборотов внешнего мотораsteer_pair.on_for_rotations(рулевое управление=-20, скорость=75, обороты=10)
Поскольку это позиционные аргументы, имена необязательны, поэтому можно написать одну и ту же командуsteer_pair.on_for_rotations(-20, 75, 10)но, вероятно, лучше включить имена для ясности.
on_for_degrees(steering, speed, degrees, brake=True, block=True)Вращайте моторы так, чтобы робот двигался по траектории, определяемой рулевым управлением , и чтобы более быстрый мотор имел скорость, равную скорости , и двигался на угол, заданный в градусах . Скорость  и угол поворота более медленного двигателя вычисляются автоматически на основе значений рулевого управления и скорости . Единственная разница между on_for_rotations() и on_for_degrees() заключается в том, что в одном используются повороты, а в другом — градусы. Переместить рулевое управление  на заданное времяon_for_seconds(steering, speed, seconds, brake=True, block=True)Вращайте моторы так, чтобы робот двигался по длинному пути, определяемому рулевым управлением , со скоростью, определяемой скоростью . Более быстрый двигатель будет иметь скорость, равную скорости , а скорость более медленного двигателя будет рассчитываться как функция значения скорости и значения рулевого управления . (Иногда двигатели работают одинаково быстро, например, когда рулевое управление = 0.)Переместить рулевое управление «навсегда»вкл(рулевое управление, скорость)Начните вращать двигатели в соответствии с  рулевым управлением  и  скоростью  навсегда.Остановить моторыoff(brake=True)Немедленно остановите оба двигателя.
Регулировка скорости и  синхронизацияEV3 Python обычно использует функцию под названием « регулирование скорости » при использовании двигателей.  Когда регулирование скорости включено, контроллер двигателя будет изменять мощность, подаваемую на двигатель, чтобы поддерживать требуемую скорость . Это сравнимо с тем, как круиз-контроль вашего автомобиля пытается поддерживать постоянную скорость, даже если ваш автомобиль движется вверх или вниз по склону.
Хотя EV3 Python использует регулировку скорости, в настоящее время он не предлагает синхронизацию  двигателей для пар двигателей, так что если один двигатель замедляется ниже требуемой скорости, другой двигатель замедляется, чтобы соответствовать. Синхронизация двигателей — это функция EV3-G, и однажды она может быть доступна в EV3 Python.
Другие примечанияОбратите внимание: если к EV3 подключен только один большой двигатель, вам не нужно указывать, к какому порту двигателя он подключен. То же самое верно для среднего двигателя, а также для каждого типа датчика.

Если у вас есть два двигателя одного типа, подключенные к EV3, и вы запускаете команду для перемещения одного двигателя этого типа без указания буквы порта, то порт, который находится первым в алфавитном порядке, будет тем, который получает команду. Самый первый скрипт на этой странице является примером этого. В этом скрипте нет ничего, что говорило бы о том, какой мотор должен двигаться, поэтому скрипт будет использовать первый большой мотор, который он найдет при сканировании портов мотора в алфавитном порядке. Если у вас есть большие двигатели на портах B и C, двигатель B будет двигаться. Если вы хотите, чтобы двигатель C двигался, вы можете изменить начало скрипта следующим образом:#!/usr/bin/env python3from ev3dev2.motor import LargeMotor, OUTPUT_Cfrom ev3dev2.motor import SpeedDPS, SpeedRPM, SpeedRPS, SpeedDPMfrom time import sleep
lm = LargeMotor(OUTPUT_C)