- PVSM.RU - https://www.pvsm.ru -

Linux на LEGO Mindstorms EV3

image
Некоторое время работаю с Education версией LEGO Mindstorms EV3. Однажды подумалось: «Плохо, что нельзя писать под EV3 программы на Python, всё таки создавать в визуальной среде программирования более-менее серьёзные программы достаточно сложно и долго. Хотя...». Гугл сказал, что таки можно. EV3DEV [1], Debian Linux-based система, просто скачиваем образ системы, записываем на MicroSD, устанавливаем её в соответствующий разъём «программируемого блока» и включаем блок. Видим как с MicroSD запускается система — отображается лого EV3DEV и светодиоды под блоком кнопок сигнализируют о дисковой активности, далее запускается Brickman — менеджер при помощи которого мы можем запускать скрипты и производить некоторые настройки блока.
На сайте ev3dev.org дана подробная инструкция [2] по началу работы с системой. Четвёртым шагом идёт настройка сети [3] через USB. Проблем возникнуть не должно, подключаемся, ставим нужные пакеты, я сразу поставил mc и htop.
image
Ресурсов конечно не густо. Подключить zram у меня пока не получилось. Тем не менее python запускается и работает, причём скрипты работают заметно шустрее, чем программы сделанные в визуальной среде. Для управления блоком (т.е. для доступа к сенсорам, моторам, дисплею, кнопкам, светодиодам и звуку) есть API ev3dev-lang [4] (библиотека уже есть в системе), достаточно простое и удобное. В библиотеке есть примеры её использования, на сайте ev3dev.org есть подробное описание API, а так же как обращаться к устройствам напрямую. Есть и готовые проекты [5], один из них на Bash [6], а мне больше всего понравился Ev3 Print3rbot [7].

Мой пример простейшего Line follower

#!/usr/bin/python
import ev3dev.ev3 as ev3
import time


ANGLE = 5


l_motor = ev3.LargeMotor(ev3.OUTPUT_B)
r_motor = ev3.LargeMotor(ev3.OUTPUT_C)
c_sensor = ev3.ColorSensor()
l_motor.reset()
r_motor.reset()
l_motor.duty_cycle_sp = 100
r_motor.duty_cycle_sp = 100
l_motor.stop_command = "brake"
r_motor.stop_command = "brake"
l_motor.position_sp = ANGLE
r_motor.position_sp = ANGLE
c_sensor.command = "COL-REFLECT"    # by default
while True:
    motor = l_motor if c_sensor.value() > 50 else r_motor
    motor.run_to_rel_pos()
    while "running" in motor.state:
        time.sleep(0.01)

Ну и на последок, в лучших традициях, раз это не сделали до меня — я был просто обязан это сделать.

Bad Apple

Автор: Shrim

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/robototehnika/109620

Ссылки в тексте:

[1] EV3DEV: http://www.ev3dev.org/

[2] инструкция: http://www.ev3dev.org/docs/getting-started/

[3] настройка сети: http://www.ev3dev.org/docs/tutorials/connecting-to-the-internet-via-usb/

[4] API ev3dev-lang: https://github.com/rhempel/ev3dev-lang-python

[5] готовые проекты: http://www.ev3dev.org/projects/

[6] на Bash: http://www.ev3dev.org/projects/2014/08/20/EV3-simple-goodies/

[7] Ev3 Print3rbot: http://www.ev3dev.org/projects/2015/05/06/EV3-Print3rbot/

[8] Источник: https://geektimes.ru/post/269396/