Занятие 3. Модернизация программы перемещений робота. Передача данных от персонажа роботу

Робототехника на Hobot L в mBlock Scratch
Доработаем программу управления, роботом (созданную на прошлом занятии) таким образом, чтобы он ехал по нажатию кнопок на клавиатуре, а если ни одна из кнопок не нажата - останавливался (такой вариант является более удобным для управления):

Нажата какая-то из кнопок управления - робот едет в направлении в зависимости от кнопки

Не нажата ни одна из кнопок - робот стоит

  1. Распишем приведённый выше алгоритм более детально:
  1. Начало
  2. Повторять всегда:
  • Если нажата клавиша “стрелка вверх”:
  • Вперёд
  • Если нажата клавиша “стрелка вниз”:
  • Назад
  • Если нажата клавиша “стрелка влево”:
  • Влево
  • Если нажата клавиша “стрелка вправо”:
  • Вправо
  • Если не нажата никакая клавиша:
  • Стоп
Опрос клавиш отдельными командами (не событиями) в mBlock реализован только для персонажей. Поэтому, а также чтобы получить заготовку программ для будущего управления роботом по Bluetooth и автоматическим управлением с компьютера (когда компьютер будет использоваться как расширенный “мозг” робота), реализуем систему передачи команд от персонажа к контроллеру Arduino:
Примечание: в mBlock компьютер - вкладка Персонажи, Arduino - вкладка Устройства
2. Для взаимодействия компьютера с Arduino сделаем кодовые обозначения команд в виде чисел:
Преобразуем эту таблицу, чтобы более наглядно показать направления:
Алгоритм для персонажа, передающего команды компьютера на контроллер Arduino в роботе:
  1. Начало
  2. Повторять всегда:
  • Если нажата клавиша “стрелка вверх”:
  • Задать для Приём значение 1
  • Если нажата клавиша “стрелка вниз”:
  • Задать для Приём значение 2
  • Если нажата клавиша “стрелка влево”:
  • Задать для Приём значение 3
  • Если нажата клавиша “стрелка вправо”:
  • Задать для Приём значение 4
  • Если не нажата никакая клавиша:
  • Задать для Приём значение 5
Программа по этому алгоритму:
Алгоритм для контроллера Arduino, принимающего команды с компьютера в виде кода в представленной выше таблицы (также добавим назначение переменных пинов направлений и скоростей в начале):
  1. Начало
  2. Задать для Мотор левый Направление значение 4
  3. Задать для Мотор правый Направление значение 7
  4. Задать для Мотор левый Скорость значение 5
  5. Задать для Мотор правый Скорость значение 6
  6. Повторять всегда:

a. Если Приём = 1:

  • Вперёд

b. Если Приём = 2:

  • Назад

c. Если Приём = 3:

  • Влево

d. Если Приём = 4:

  • Вправо

e. Если Приём = 5:

  • Стоп
Программа, реализующая этот алгоритм:
3. Чтобы данная программа работала, в программе должны быть созданы функции (через раздел Мои блоки) Вперёд, Назад, Влево, Вправо, Стоп. Напомним алгоритмы для этих функций:

Определить Вперёд:

  1. Задать на Мотор левый Направление значение “высокий”
  2. Задать на Мотор правый Направление значение “высокий”
  3. Задать на Мотор левый Скорость значение “высокий”
  4. Задать на Мотор правый Скорость значение “высокий”

Определить Назад:

  1. Задать на Мотор левый Направление значение “низкий”
  2. Задать на Мотор правый Направление значение “низкий”
  3. Задать на Мотор левый Скорость значение “высокий”
  4. Задать на Мотор правый Скорость значение “высокий”

Определить Влево:

  1. Задать на Мотор левый Направление значение “низкий”
  2. Задать на Мотор правый Направление значение “высокий”
  3. Задать на Мотор левый Скорость значение “высокий”
  4. Задать на Мотор правый Скорость значение “высокий”

Определить Вправо:

  1. Задать на Мотор левый Направление значение “высокий”
  2. Задать на Мотор правый Направление значение “низкий”
  3. Задать на Мотор левый Скорость значение “высокий”
  4. Задать на Мотор правый Скорость значение “высокий”
4. Попробуйте управление роботом с клавиатуры. Теперь робот должен останавливаться, если ни одна из клавиш не нажата.

Управление скоростью мотора

При испытаниях можно заметить, что робот двигается достаточно быстро. Иногда это полезно (например, в гонках по достаточно прямой трассе), но когда робот должен выполнять точную работу (проехать сложную трассу, переместить предметы на заданные места и т.д.) слишком высокая скорость может помешать.

Также при испытаниях можно заметить, что при езде вперёд и назад некоторые роботы немного отклоняются от прямого направления. Это объясняется тем, что характеристики моторов могут немного отличаться и один мотор вращается быстрее, другой медленнее и сторона с более быстрым вращением колеса “обгоняет” сторону с более медленным вращением.

Для снижения скорости робота и реализации прямого движения в прямом направлении требуется управление и калибровка скоростей моторов.

  1. Создадим две новые переменные – Скорость Левая и Скорость Правая.

Для управление скоростями моторов используем не просто включение/выключение моторов, а команду, позволяющую задать цифровое значение скорости. Она находится в разделе Пин:

установить на порт "ШИМ"

здесь порт - номер контакта (пина) Arduino, на который подается напряжение.

ШИМ - значение уровня напряжения. ШИМ может принимать значение от 0 до 255 (при значениях вне этого диапазона команда работает неправильно):

  • значение 0 – минимальное значение (аналог состояния “низкий” на пине, 0 Вольт напряжение, стоп на моторе)
  • значение 255 – максимальное значение (аналог состояния “высокий” на пине, 5 Вольт напряжение, максимальная скорость мотора)
  • значение в диапазоне 1…254 - промежуточные значения напряжения, например, 128 соответствует напряжению 2,5 Вольта и средней скорости вращения мотора

Добавь правильный текст, Карина :)

  1. Начало
  2. Задать для Мотор левый Направление значение 4
  3. Задать для Мотор правый Направление значение 7
  4. Задать для Мотор левый Скорость значение 5
  5. Задать для Мотор правый Скорость значение 6
  6. Задать для Скорость левая значение 150
  7. Задать для Скорость правая значение 150

// дальше алгоритм остается прежним

Для управления скоростями моторов потребуется внести изменения во все функции направлений. Команды направлений моторов останутся такими же, изменятся команды включения моторов – теперь включаем моторы не на максимальную скорость, а на заданную:

Определить Вперёд:

  1. Задать на Мотор левый Направление значение “высокий”
  2. Задать на Мотор правый Направление значение “высокий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Назад:

  1. Задать на Мотор левый Направление значение “низкий”
  2. Задать на Мотор правый Направление значение “низкий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Влево:

  1. Задать на Мотор левый Направление значение “низкий”
  2. Задать на Мотор правый Направление значение “высокий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Вправо:

  1. Задать на Мотор левый Направление значение “высокий”
  2. Задать на Мотор правый Направление значение “низкий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Стоп:

  1. Установить на порт Мотор левый Скорость ШИМ 0
  2. Установить на порт Мотор правый Скорость ШИМ 0
Проведём калибровку моторов, чтобы робот по команде Вперёд ехал вперёд. Если робот сворачивает вбок, нужно изменить задаваемые в начале кода значения переменных Скорость левая или Скорость правая (после изменений программу нужно перезапустить, чтобы изменения применились):
a. Если робот при езде вперёд сворачивает вправо – значит левая сторона “обгоняет” правую, надо снизить Скорость левую или повысить Скорость правую.
b. Если робот при езде вперёд сворачивает влево – значит правая сторона “обгоняет” левую , надо снизить Скорость правую или повысить Скорость левую.
Меняйте скорости до тех пор, пока робот не начнет ехать достаточно прямо. По возможности запишите полученные значения скоростей для каждого робота для использования в последующих занятиях.
Made on
Tilda