Начнем с алгоритма работы нашей программы!
1. Едем вперед.
2. Если препятствие на расстоянии 20см, то едем назад.
3. Останавливаемся.
4. Поворачиваем голову вправо.
5. Поворачиваем голову по центру.
6. Поворачиваем голову влево.
7. Разворачиваемся
8. Останавливаемся.
И так схема у нас есть, на ней обозначены микроконтроллер,ножка gnd, к портам D4, D5, D17, D18, D19, D21, D22, D23 подключены драйвера двигателей на микросхеме MX1508, четыре электрических мотор-редуктора, а также блок питания на 5В, подключенный для питания драйвера двигателей, к порту D14 подключен сервопривод mg90, а также для определения препятствий будем использовать ультразвуковой дальномер типа HC - SR04 подключенный к портам D12, D13,ниже распиновка и характеристики драйвера двигателей MX1508, которые нам нужны будут для управления моторами робота и краткая характеристика сервопривода mg90.
Напряжение для моторов: 2-10 В
Напряжение для управляющих контактов: 1,8-7 В
Номинальный (рабочий) ток для каждого мотора: 1,5 А
Максимальный ток для каждого мотора: 2,5 А
Потребляемый ток в режиме ожидания: 0,1 мА
Тип драйвера: Н-мост
Схема включения сервопривода mg90:
Практически к каждому материалу есть видеоролик на YouTube и RUTUBE каналах, теорию можно прочитать в статье, а как работает устройство в железе, посмотреть в видеоролике!
Вернемся к программе.
Драйверы двигателей у нас подключены к портам D4, D5, D17, D18, D19, D21, D22, D23, сформируем ШИМ сигнал в программе на ножках портов D4, D5, D17, D18, D19, D21, D22, D23, укажем частоту сигнала на данных выводах freq и присвоим ей значение 5000, допишем в программе
freq = 5000
motor_l1 = PWM(Pin(17), freq)
motor_l2 = PWM(Pin(5), freq)
motor_l3 = PWM(Pin(18), freq)
motor_l4 = PWM(Pin(19), freq)
motor_p1 = PWM(Pin(4), freq)
motor_p2 = PWM(Pin(21), freq)
motor_p3 = PWM(Pin(22), freq)
motor_p4 = PWM(Pin(23), freq),
Сервопривод у нас подключен к порту D14, настроим в программе порт D14 и укажем частоту ШИМ сигнала на данной ножке равной 50Гц, допишем в программе servo_pin = PWM(Pin(14), freq=50), далее займемся настройкой ультразвукового дальномера, настраиваем ножку 13 на выход и задаем ей имя trig trig = Pin(13, Pin.OUT), по аналогии настраиваем ножку 12 на вход и задаем ей имя echo echo = Pin(12, Pin.IN). С настройкой портов закончили, далее чтобы наша программа работала добавим в нее модуль import machine, который содержит необходимые функции, для работы платы, строкой from machine import Pin, PWM укажем чтобы нам постоянно не повторять machine в коде, подключаем необходимые нам функции которые служат для формирования задержек from utime import sleep_us, ticks_us, sleep_ms.
Далее наш код будет состоять из восьми функций:
Рассчитываем расстояние до объекта.
def hc04_distance():
trig.value(1)
sleep_us(10)
trig.value(0)
on_impuls = ticks_us()
while echo.value() == 0:
on_impuls = ticks_us()
while echo.value() == 1:
off_impuls = ticks_us()
time = off_impuls - on_impuls
distance = time * 0.034 / 2
return distance
Едем вперед:
def motor_forward(speed):
motor_l1.duty(speed)
motor_l2.duty(0)
motor_l3.duty(0)
motor_l4.duty(speed)
motor_p1.duty(0)
motor_p2.duty(speed)
motor_p3.duty(0)
motor_p4.duty(speed)
Едем назад:
def motor_backward(speed):
motor_l1.duty(0)
motor_l2.duty(speed)
motor_l3.duty(speed)
motor_l4.duty(0)
motor_p1.duty(speed)
motor_p2.duty(0)
motor_p3.duty(speed)
motor_p4.duty(0
Стоим:
def motor_stop(speed):
motor_l1.duty(0)
motor_l2.duty(0)
motor_l3.duty(0)
motor_l4.duty(0)
motor_p1.duty(0)
motor_p2.duty(0)
motor_p3.duty(0)
motor_p4.duty(0)
Поворачиваем:
def motor_left(speed):
motor_l1.duty(0)
motor_l2.duty(speed)
motor_l3.duty(speed)
motor_l4.duty(0)
Поворачиваем сервопривод вправо:
def turn_right(angle):
servo_pin.duty(angle)
sleep_ms(500)
servo_pin.duty(0)
Поворачиваем сервопривод влево:
def turn_left(angle):
servo_pin.duty(180 - angle)
sleep_ms(500)
servo_pin.duty(0)
Поворачиваем сервопривод по центру:
def turn_centr(angle):
servo_pin.duty(angle)
sleep_ms(500)
servo_pin.duty(0)
В бесконечном цикле while True, мы будем выполнять функции в соответствии с нашим алгоритмом.
Едем вперед motor_forward(800), если препятствие на расстоянии 20см distance = hc04_distance()
if distance < 20:, то едем назад motor_backward(800) задержка sleep_ms(500), останавливаемся motor_stop(0) задержка sleep_ms(100), поворачиваем голову вправо turn_right(58) задержка sleep_ms(10), поворачиваем голову по центру turn_centr(100) задержка sleep_ms(10), поворачиваем голову влево turn_left(100) задержка sleep_ms(10), разворачиваемся motor_left(800) задержка sleep_ms(1500), останавливаемся motor_stop(0) и повторяем повороты головой - иначе else:
motor_stop(0) останавливаемся.
Исходный код программы Скачать архив
Понравился проект? Не забудь поделиться им с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube и RUTUBE !
- СПАСИБО ЗА ПРОСМОТР.
- С уважением.
- Электроника и Робототехника!