Программируем роботов на Python

Приветствую тебя, мой друг!!! На этой странице ты сможешь найти примеры скриптов на языке Python для управления своим роботом, просто бери их и адаптируй под свой проект. Также ты сможешь найти здесь ряд команд для командной стоки в Linux. Они тебе пригодятся, так как наши роботы используют именно эту операционную систему.

Содержание:

1. Дисплей EV3

2. Кнопки блока EV3

3. Ультразвуковой датчик

4. Датчик касания

5. Гироскопический датчик

6. Датчик цвета

7. Большой мотор

8. Средний мотор

9. Звуки

10. Модуль Рандом

Дисплей

Вывод картинки на экран блока EV3:

from ev3dev.ev3 import *
from PIL import Image
lcd = Screen()
logo = Image.open('kartinka.jpg')
lcd.image.paste(logo, (0,0))
lcd.update() 

Вывод текста на экран блока EV3:

from ev3dev.ev3 import *
from time import sleep

lcd = Screen()
lcd.draw.text((40,80),'# D.V.O.R.I.K')
lcd.update()
sleep(3)
Кнопки блока EV3

Выход из программы при нажатии на любую кнопку:

#!/usr/bin/env python3

from ev3dev.ev3 import *
from time import sleep

btn = Button()

while True:
    if btn.any():            
        Sound.beep().wait()   
        exit()                
    else:
        sleep(0.01)           

Ультразвуковой датчик ( Ultrasonic Sensor )

Программа выводит расстояние от ультразвукового датчика до препятствия на экран дисплея. Прекращение программы осуществляется нажатием на кнопку датчика касания.

#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep


us = UltrasonicSensor()
ts = TouchSensor()
lcd = Screen()

us.mode='US-DIST-CM'
units = us.units

while not ts.value():        
    distance = us.value()/10
    lcd.draw.text((40,80), str(distance))
    lcd.update()
    sleep(0.1)
    lcd.clear()

    if distance < 60: 
        Leds.set_color(Leds.LEFT, Leds.RED)
        Leds.set_color(Leds.RIGHT, Leds.GREEN)
    else:
                Leds.set_color(Leds.RIGHT, Leds.RED)
                Leds.set_color(Leds.LEFT, Leds.GREEN)


Sound.beep()       
Leds.set_color(Leds.LEFT, Leds.GREEN)
Leds.set_color(Leds.RIGHT, Leds.GREEN)

Датчик касания EV3 (touch sensor)

Следующий скрипт заставляет зажигаться красным цветом левый светодиод блока EV3 при нажатии на датчик касания, подключенный к порту №1

#!/usr/bin/env python3
from ev3dev.ev3 import *
ts1 = TouchSensor('in1')

while True:
    if ts1.value()==1:  
        Leds.set_color(Leds.LEFT, Leds.RED)
    else:
        Leds.set_color(Leds.LEFT, Leds.GREEN)

Теперь давайте напишем скрипт который выполняет выход из цикла по нажатию на датчик касания:

#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep

ts = TouchSensor()

while not ts.value():
   Leds.set_color(Leds.LEFT, Leds.RED)
   sleep(0.2)
   Leds.set_color(Leds.LEFT, Leds.GREEN)
   sleep(0.2)

Гироскопический датчик (Gyro Sensor)

Гироскопический датчик предназначен для измерения угла вращения робота или скорости вращения. Сверху на корпусе датчика нанесены две стрелки, обозначающие плоскость, в которой работает датчик. Поэтому важно правильно установить датчик на робота. Также для более точного измерения крепление гироскопического датчика должно исключать его подвижность относительно корпуса робота. Даже во время прямолинейного движения робота гироскопический датчик может накапливать погрешность измерения угла и скорости вращения, поэтому непосредственно перед измерением следует осуществить сброс в 0 текущего показания датчика. Вращение робота против часовой стрелки формирует отрицательные значения измерений, а вращение по часовой стрелке — положительные. 

Приведенный ниже скрипт выполняет измерение угла наклона датчика и выводит результат на дисплей EV3. Завершение программы происходит при нажатии на датчик касания:

#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep

gy = GyroSensor()  # объявляем гироскопический датчик
ts = TouchSensor() # объявляем датчик касания
lcd = Screen()     # объявляем экран блока EV3

gy.mode='GYRO-ANG' # переводим датчик в режим измерения угла
units = gy.units   # настройка единиц измерения угла 

while not ts.value(): # запускаем цикл, пока не нажат датчик касания   
    angle = gy.value() #создаём переменную,в которой данные с датчик 
    lcd.draw.text((40,80), str(angle))
    lcd.update()
    sleep(0.5)

Датчик цвета (Color sensor)

Датчик цвета может работать в трех различных режимах:

В режиме «Цвет» датчик может определить цвет поднесенного к нему предмета

В режиме «Яркость отраженного света» датчик направляет световой луч на близко расположенный предмет и по отраженному пучку определяет яркость предмета;

в режиме «Яркость внешнего освещения» датчик может определить — насколько ярко освещено пространство вокруг.


В следующем скрипте датчик цвета излучает свет и измеряет интенсивность отраженного света, возвращая дважды в секунду значение, которое находится между 0 и 100. Для достижения наилучших результатов поместите датчик примерно в 3 мм от отражающей поверхности. Запустив скрипт мы получим значение около 80 с обычной белой бумагой и около 5 с черной поверхностью.

#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep

# объявляем датчик цвета
cl = ColorSensor()
# переводим его в режим измерения яркости отраженного цвета
cl.mode='COL-REFLECT'
# объявляем экран EV3
lcd = Screen()

while True:
           lcd.clear   #очищаем экран
           lcd.draw.text((40,80), str(cl.value()) #вносим на экран показание с датчика
           lcd.update() #активируем запись на экране
           sleep(0.5)   # ждем полсекунды

Чтобы перевести датчик цвета в режим измерения яркости внешнего освещения достаточно в скрипте поменять строчку:

cl.mode='COL-REFLECT'

на

cl.mode='COL-AMBIENT'

следующий скрипт — это пример работы датчика цвета в режиме определения цвета поднесённого к нему предмета. Для достижения максимальной точности предмет необходимо подносить на расстояние от 3 до 6 мм:

#!/usr/bin/env python3
# so that script can be run from Brickman

from ev3dev.ev3 import *
from time   import sleep

# объявляем датчик цвета и датчик касания
cl = ColorSensor() 
ts = TouchSensor()

# переводим датчик цвета в режим определения цвета
cl.mode='COL-COLOR'

colors=('unknown','black','blue','green','yellow','red','white','brown')

while not ts.value():    #цикл выполняется пока не нажмём на датчик касания
    Sound.speak(colors[cl.value()]).wait() #произносим цвет из массива colors 
    sleep(1)

Большой мотор (large motor)

Программа запускает большой мотор, который подключен к порту «B», на максимальную скорость. Вал мотора провернется на 360 градусов и резко остановится (не накатом!). После остановки мотора через 5 секунд, выполнится выход из программы.

#!/usr/bin/env python3

from ev3dev.ev3 import *
from time import sleep

m = LargeMotor('outB')

m.run_to_rel_pos(position_sp=360, speed_sp=1000, stop_action="hold")

sleep(5)

Следующий скрипт запускает мотор в обратную сторону со скоростью 75% от максимальной. Мотор запустится не на количество оборотов, а на время, в нашем случае это 5 секунд. И так как в нашем коде нет команды stop_action=»hold» , то наш мотор остановится накатом.

#!/usr/bin/env python3

from ev3dev.ev3 import *
from time import sleep

m = LargeMotor('outB')
m.run_timed(time_sp=5000, speed_sp=-750)

sleep(4)

Следующий скрипт запустит большой мотор на постоянную работу. Остановка мотора в данном случае происходит по команде m.stop(stop_action=» coast «)

#!/usr/bin/env python3
# So program can be run from Brickman

from ev3dev.ev3 import *
from time import sleep
m = LargeMotor('outB')

m.run_forever(speed_sp=900)
sleep(5)
m.stop(stop_action="coast")
sleep(5)

Средний мотор (Medium motor)

Для работы со средним мотором можно смело пользоваться скриптами из примеров для большого мотора, за одним маленьким исключением: вместо объявления переменной LargeMotor (большой мотор), мы объявляем MediumMotor(средний мотор).

#!/usr/bin/env python3

from ev3dev.ev3 import *
from time import sleep

m = MediumMotor('outD')
m.run_timed(time_sp=1000, speed_sp=650)

sleep(4)

Звуки (Sound)

Следующий скрипт воспроизводит звуковой файл «music.mp3», который находится по тому же адресу, что и скрипт:

#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep

Sound.play('music.mp3').wait()
sleep(4)

Следующий скрипт воспроизводит звук определенной тональности и частоты:

from ev3dev.ev3 import *
Sound.tone(1500, 2000).wait()

Следующий скрипт воспроизведёт текст, который вы укажите в кавычках второй строки:

from ev3dev.ev3 import *
 Sound.speak('STUDIA ZNANIY DVORIK').wait()

обратите внимание, что в кавычках можно писать не только текст, но и цифры, их блок EV3 прочитает на английском языке.

Также, вместо текста и цифр можно указать имя переменной, в этом случае EV3 произнесет значение переменной, которое хранится в ней в данный момент:

from ev3dev.ev3 import *
i=10 
Sound.speak(i).wait()
           

Рандом (Random)

Рассмотрим использование модуля Random на примере с запуском мотора. Скрипт заставит мотор сделать случайное число оборотов в диапазоне от 1 до 10:

#!/usr/bin/env python3

from ev3dev.ev3 import *
from time import sleep
import random

oborot=random.randint(1,10)
m = LargeMotor('outB')


m.run_to_rel_pos(position_sp=360*oborot, speed_sp=1000, stop_action="hold")

sleep(10)