Доработаем программу управления роботом (созданную на прошлом занятии) таким образом, чтобы он ехал по нажатию кнопок на клавиатуре, а если ни одна из кнопок не нажата — останавливался (такой вариант является более удобным для управления):
Если нажата какая-то из кнопок управления — робот едет в направлении в зависимости от кнопки Если не нажата ни одна из кнопок — робот стоит |
Распишем приведённый выше алгоритм более детально:
1. Начало
|
Опрос клавиш отдельными командами (не событиями) в mBlock реализован только для персонажей. Поэтому, а также чтобы получить заготовку программ для будущего управления роботом по Bluetooth и автоматическим управлением с компьютера (когда компьютер будет использоваться как расширенный “мозг” робота), реализуем систему передачи команд от персонажа к контроллеру Arduino:
Примечание: в mBlock компьютер — вкладка Персонажи, Arduino — вкладка Устройства
2. Для взаимодействия компьютера с Arduino сделаем кодовые обозначения команд в виде чисел:
Команда | Число |
---|---|
Вперёд | 1 |
Назад | 2 |
Влево | 3 |
Вправо | 4 |
Стоп | 5 |
Преобразуем эту таблицу, чтобы более наглядно показать направления:
↑ Вперёд 1 | ||
← Влево 3 | Стоп 5 | → Вправо 4 |
↓ Назад 2 |
Алгоритм для персонажа, передающего команды компьютера на контроллер Arduino в роботе:
1. Начало
|
Программа по этому алгоритму:
Алгоритм для контроллера Arduino, принимающего команды с компьютера в виде кода в представленной выше таблицы (также добавим назначение переменных пинов направлений и скоростей в начале):
1. Начало
|
Программа, реализующая этот алгоритм:
Чтобы данная программа работала, в программе должны быть созданы функции (через раздел Мои блоки) Вперёд, Назад, Влево, Вправо, Стоп. Напомним алгоритмы для этих функций:
|
Попробуйте управление роботом с клавиатуры. Теперь робот должен останавливаться, если ни одна из клавиш не нажата.
При испытаниях можно заметить, что робот двигается достаточно быстро. Иногда это полезно (например, в гонках по достаточно прямой трассе), но когда робот должен выполнять точную работу (проехать сложную трассу, переместить предметы на заданные места и т.д.) слишком высокая скорость может помешать.
Также при испытаниях можно заметить, что при езде вперёд и назад некоторые роботы немного отклоняются от прямого направления. Это объясняется тем, что характеристики моторов могут немного отличаться и один мотор вращается быстрее, другой медленнее и сторона с более быстрым вращением колеса “обгоняет” сторону с более медленным вращением.
Для снижения скорости робота и реализации прямого движения в прямом направлении требуется управление и калибровка скоростей моторов.
Создадим две новые переменные – Скорость левая и Скорость правая.
Для управление скоростями моторов используем не просто включение/выключение моторов, а команду, позволяющую задать цифровое значение скорости. Она находится в разделе Пин -> установить на порт «ШИМ»
здесь порт — номер контакта (пина) Arduino, на который подается напряжение.
ШИМ — значение уровня напряжения. ШИМ может принимать значение от 0 до 255 (при значениях вне этого диапазона команда работает неправильно):
// далее алгоритм остается прежним |
Для управления скоростями моторов потребуется внести изменения во все функции направлений. Команды направлений моторов останутся такими же, изменятся команды включения моторов – теперь включаем моторы не на максимальную скорость, а на заданную:
|
Проведём калибровку моторов, чтобы робот по команде Вперёд ехал вперёд. Если робот сворачивает вбок, нужно изменить задаваемые в начале кода значения переменных Скорость левая или Скорость правая (после изменений программу нужно перезапустить, чтобы изменения применились):
1. Если робот при езде вперёд сворачивает вправо – значит левая сторона “обгоняет” правую, надо снизить Скорость левую или повысить Скорость правую.
2. Если робот при езде вперёд сворачивает влево – значит правая сторона “обгоняет” левую , надо снизить Скорость правую или повысить Скорость левую.
Меняйте скорости до тех пор, пока робот не начнет ехать достаточно прямо. По возможности запишите полученные значения скоростей для каждого робота для использования в последующих занятиях.
8 (495) 150-18-32