Занятие 1. Знакомство с конструктором Hobots L

Робототехника на Hobot L в mBlock Scratch
Часто требуется, чтобы робот мог определить свое место в пространстве, ориентироваться относительно окружающих стен, препятствий и движущихся предметов (человека, других роботов), чтобы не сталкиваться с ними. В сложных роботах для этого используется камера и программа распознавания образов, в автономных автомобилях - лидары на основе лазеров и радары на основе радиоволн. В бытовых роботах (например, в роботах-пылесосах), роботах для учебы и робототехнических соревнований используются более простые датчики расстояния на основе ультразвука.

Информация о датчике расстояния

Ультразвуковой дальномер модуль – это помещенные на одну плату приемник и передатчик ультразвукового сигнала. Принцип действия основан на хорошо известном явлении эхолокации. Излучатель формирует акустический сигнал, который отразившись от преграды, возвращается к датчику и регистрируется приемником. Зная скорость распространения ультразвука в воздухе и время запаздывания между излученным и принятым сигналом, легко рассчитать расстояние до акустической преграды. В отличие от инфракрасных дальномеров на ультразвуковой датчик не влияют источники света или цвет препятствия. Могут возникнуть затруднения при определении расстояния до пушистых или тонких объектов. Кроме приемника и передатчика на плате находится необходимая обвязка.
Примечание: датчик не требует установки отдельного расширения в mBlock, для опроса данного датчика можно использовать команду УЗ датчик с портов trig “” echo “” раздела Датчик. В режиме Онлайн команда команда неактивна, поэтому работаем с датчиком только в режиме Загрузка.

Установка используемых расширений

Так как датчик расстояния работает только в режиме Загрузка, установим в mBlock два расширения, необходимых для передачи данных с Arduino на компьютер:

  1. В режиме Устройства нажмите кнопку +расширение под алитрой команд (разноцветными кругами), чтобы войти в Центр расширений. В верхней строке должно находится расширение для связи с компьютером в режиме Загрузка – Upload Mode Broadcast. Добавьте его в проект.
2. Перейдите во вкладку Персонажи. Нажмите +расширение, чтобы попасть в Центр расширений.
3. Найдите и добавьте в проект расширение Трансляция режима передачи (находится во второй строке всех расширений):

Передача расстояния c Arduino на компьютер

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

Датчик расстояния подключается к разъему 1 (над USB портом), пины Arduino 10 и 11.
Опрос на закрепление освоения предыдущего занятия и напоминание принципа записи значений с датчика и отправки персонажу:
Вопрос ученикам 1: какой командой mBlock мы записываем значение расстояния с датчика расстояния в переменную, каждый раз новое значение? (ответ - Задать)
Вопрос ученикам 2: а какой командой мы отправим значение этой переменной персонажу? (ответ : Отправить сообщение в режиме загрузки message со значением этой переменной)
  1. Алгоритм для Arduino, чтобы опросить датчик, записать в переменную Расстояние (её нужно создать) и отправить расстояние на компьютер:
  1. Начало
  2. Повторять всегда:
  • Задать для Расстояние значение УЗ датчик с портов trig 11 echo 10
  • Отправить сообщение в режиме загрузки message со значением Расстояние
2. Алгоритм и код для персонажа: принять расстояние с Arduino и сказать его для показа на экране:
  1. Начало
  2. Повторять всегда:
  • Сказать Расстояние

При получении сообщения message в режиме загрузки:

  1. Задать для Показать значение сообщение в режиме загрузки message значение
3. Загрузите программу в робота, запустите код персонажа и убедитесь, что датчик расстояния работает (поводите рукой перед датчиком, расстояние на экране должно меняться соответственно расстоянию от датчика до руки)

Ветвление

Для принятия решений роботом о том, куда ему ехать на основе того, что он узнает расстояние до препятствия, используются ветвления

Что такое ветвление

Ветвление в программировании - это как развилка на дороге. Допустим, мы идем по дороге и видим развилку, где дорога разделяется на две части. Если мы выберем одну дорогу, мы пойдем в одном направлении, а если выберем другую дорогу, то пойдем в другом направлении. Точно также и в программировании, программа может разделиться на две части и в зависимости от определенного условия выполнить тот или иной блок кода

Как видим из примеров выше, ветвление в блок-схемах обозначается ромбом (читается Если), из двух углов которого выходит путь, по которому Исполнитель идёт, если на вопрос в ромбе ответ “Да”, из другого выходит путь, по которому Исполнитель идёт, если на вопрос в ромбе ответ “Нет”
Примеры ветвления
Ветвление с одной веткой:
  1. Начало
  2. Если “Идёт дождь”:
  3. Взять зонт
В Scratch ветвление с одной веткой выглядит так: если “условие” – тогда:
Ветвление с двумя ветками:
  1. Начало
  2. Если “Идёт дождь”:
  • Взять зонт

3. Иначе:

  • Надеть кепку
В Scratch ветвление с двумя ветками выглядит так: если “условие” то (действия, которые надо сделать, если условие выполняется), иначе (действия, которые надо сделать, если условие на выполняется)

Остановка робота у стены или другого препятствия

Робот с датчиком расстояния не может видеть, он похож на человека с вытянутой вперёд рукой, но с закрытыми глазами. Человек идёт вперед, пока не коснётся стены (то есть расстояние до стены станет меньше длины его руки), как только коснётся стены - остановится. Сделаем аналогичный алгоритм для робота. Робот должен опрашивать датчик и проверять расстояние до стены в бесконечном цикле, иначе он один раз проверит расстояние до стены и поедет не обращая внимание на стену.

Начало

Повторять всегда:

  • Опросить датчик расстояния
  • Если Расстояние < 20:
  • Стоп

Иначе:

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

Иначе:

Вперёд


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

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

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

  • Установить на порт Мотор левый Скорость ШИМ 0
  • Установить на порт Мотор правый Скорость ШИМ 0
Код на основе данного алгоритма и блок-схемы:
Загрузите программу в робота и убедитесь, что робот останавливается у стены или другого препятствия. Если робот ударяется о стену - увеличьте пороговое расстояние (например, поставьте 30 вместо 20). Также можно уменьшить скорость движения робота, чтобы он успевал остановиться.
Примечание: в итоговой отлаженной программе блок отправки расстояния на компьютер можно убрать, чтобы увеличить скорость реакции робота

Остановка робота у стены и разворот

Предыдущая программа была похожа на программу системы безопасности - например, робот в цехе завода едет по заданному пути, когда на его пути препятствие (например, человек) - останавливается, когда препятствия нет (человек прошел) - робот едет дальше. Также это похоже на алгоритм автомобиля с автопилотом (как Тесла). Напишем программу, которая дает роботу возможность объезжать препятствия, похоже на программу робота - пылесоса. Изменение прошлого алгоритма будет в том, что при обнаружении препятствия робот не останавливается, а разворачивается на месте (попробуем сделать разворот на 90 градусов):

В программе изменится только то, что вместо функции Стоп нужно добавить в ветвление и создать через Мои блоки функцию Вправо 90

Если Расстояние < 20:

  • Вправо 90

Иначе:

  • Вперёд
Чтобы робот повернулся на определённый угол, нужно, чтобы он включил моторы на вращение на месте и какое-то время держал их включенными. От этого времени зависит угол поворота, его нужно подобрать. Время задаём командой подождать “” раздела Управление:

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

  1. Задать на Мотор левый Направление значение “высокий”
  2. Задать на Мотор правый Направление значение “низкий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая
  5. Подождать 0.5 секунд
Загрузите программу в робота и испытайте, при необходимости доработайте.
Made on
Tilda