Робототехника на Hobot L в mBlock Scratch
Часто требуется, чтобы робот мог определить свое место в пространстве, ориентироваться относительно окружающих стен, препятствий и движущихся предметов (человека, других роботов), чтобы не сталкиваться с ними. В сложных роботах для этого используется камера и программа распознавания образов, в автономных автомобилях — лидары на основе лазеров и радары на основе радиоволн. В бытовых роботах (например, в роботах-пылесосах), роботах для учебы и робототехнических соревнований используются более простые датчики расстояния на основе ультразвука.
Информация о датчике расстояния
Ультразвуковой дальномер модуль – это помещенные на одну плату приемник и передатчик ультразвукового сигнала. Принцип действия основан на хорошо известном явлении эхолокации. Излучатель формирует акустический сигнал, который отразившись от преграды, возвращается к датчику и регистрируется приемником. Зная скорость распространения ультразвука в воздухе и время запаздывания между излученным и принятым сигналом, легко рассчитать расстояние до акустической преграды. В отличие от инфракрасных дальномеров на ультразвуковой датчик не влияют источники света или цвет препятствия. Могут возникнуть затруднения при определении расстояния до пушистых или тонких объектов. Кроме приемника и передатчика на плате находится необходимая обвязка.
Датчик | Порт |
---|---|
Датчик расстояния Trig | Цифровой 11 |
Датчик расстояния Echo | Цифровой 10 |
Примечание: датчик не требует установки отдельного расширения в mBlock, для опроса данного датчика можно использовать команду УЗ датчик с портов trig “” echo “” раздела Датчик. В режиме Онлайн команда команда неактивна, поэтому работаем с датчиком только в режиме Загрузка.
Так как датчик расстояния работает только в режиме Загрузка, установим в mBlock два расширения, необходимых для передачи данных с Arduino на компьютер:
2. Перейдите во вкладку Персонажи. Нажмите +расширение, чтобы попасть в Центр расширений.
3. Найдите и добавьте в проект расширение Трансляция режима передачи (находится во второй строке всех расширений):
Перед тем, как использовать датчик расстояния в сложных программах управления роботом, нужно убедиться, что он работает и правильно измеряет расстояние. Для этого опросим датчик и передадим информацию с него на компьютер, чтобы расстояние выводилось на экран, схема передачи расстояния:
Датчик расстояния подключается к разъему 1 (над USB портом), пины Arduino 10 и 11.
Опрос на закрепление освоения предыдущего занятия и напоминание принципа записи значений с датчика и отправки персонажу:
Вопрос ученикам 1: какой командой mBlock мы записываем значение расстояния с датчика расстояния в переменную, каждый раз новое значение? (ответ — Задать)
Вопрос ученикам 2: а какой командой мы отправим значение этой переменной персонажу? (ответ : Отправить сообщение в режиме загрузки message со значением этой переменной)
2. Алгоритм и код для персонажа: принять расстояние с Arduino и сказать его для показа на экране:
3. Загрузите программу в робота, запустите код персонажа и убедитесь, что датчик расстояния работает (поводите рукой перед датчиком, расстояние на экране должно меняться соответственно расстоянию от датчика до руки)
Для принятия решений роботом о том, куда ему ехать на основе того, что он узнает расстояние до препятствия, используются ветвления
Что такое ветвление
Ветвление в программировании — это как развилка на дороге. Допустим, мы идем по дороге и видим развилку, где дорога разделяется на две части. Если мы выберем одну дорогу, мы пойдем в одном направлении, а если выберем другую дорогу, то пойдем в другом направлении. Точно также и в программировании, программа может разделиться на две части и в зависимости от определенного условия выполнить тот или иной блок кода
Как видим из примеров выше, ветвление в блок-схемах обозначается ромбом (читается Если), из двух углов которого выходит путь, по которому Исполнитель идёт, если на вопрос в ромбе ответ “Да”, из другого выходит путь, по которому Исполнитель идёт, если на вопрос в ромбе ответ “Нет”
Примеры ветвления
Ветвление с одной веткой:
В Scratch ветвление с одной веткой выглядит так: если “условие” – тогда:
Ветвление с двумя ветками:
3. Иначе:
В Scratch ветвление с двумя ветками выглядит так: если “условие” то (действия, которые надо сделать, если условие выполняется), иначе (действия, которые надо сделать, если условие на выполняется)
Робот с датчиком расстояния не может видеть, он похож на человека с вытянутой вперёд рукой, но с закрытыми глазами. Человек идёт вперед, пока не коснётся стены (то есть расстояние до стены станет меньше длины его руки), как только коснётся стены — остановится. Сделаем аналогичный алгоритм для робота. Робот должен опрашивать датчик и проверять расстояние до стены в бесконечном цикле, иначе он один раз проверит расстояние до стены и поедет не обращая внимание на стену.
Начало
Повторять всегда:
Иначе:
Ветвления часто лучше понятны, когда представлены не в виде текстового алгоритма, а в виде блок-схемы, поэтому показываются оба варианта:
Для движения робота потребуется создать (через раздел Мои блоки) функции Вперёд и Стоп, а для их работы указать в программе, какие номера пинов отвечают за эти направления. Доработаем алгоритм:
11. Иначе:
Определить Вперёд:
Определить Стоп:
Код на основе данного алгоритма и блок-схемы:
Загрузите программу в робота и убедитесь, что робот останавливается у стены или другого препятствия. Если робот ударяется о стену — увеличьте пороговое расстояние (например, поставьте 30 вместо 20). Также можно уменьшить скорость движения робота, чтобы он успевал остановиться.
Примечание: в итоговой отлаженной программе блок отправки расстояния на компьютер можно убрать, чтобы увеличить скорость реакции робота
Предыдущая программа была похожа на программу системы безопасности — например, робот в цехе завода едет по заданному пути, когда на его пути препятствие (например, человек) — останавливается, когда препятствия нет (человек прошел) — робот едет дальше. Также это похоже на алгоритм автомобиля с автопилотом (как Тесла). Напишем программу, которая дает роботу возможность объезжать препятствия, похоже на программу робота — пылесоса. Изменение прошлого алгоритма будет в том, что при обнаружении препятствия робот не останавливается, а разворачивается на месте (попробуем сделать разворот на 90 градусов):
В программе изменится только то, что вместо функции Стоп нужно добавить в ветвление и создать через Мои блоки функцию Вправо 90
Если Расстояние < 20:
Иначе:
Чтобы робот повернулся на определённый угол, нужно, чтобы он включил моторы на вращение на месте и какое-то время держал их включенными. От этого времени зависит угол поворота, его нужно подобрать. Время задаём командой подождать “” раздела Управление:
Определить Вправо 90:
Загрузите программу в робота и испытайте, при необходимости доработайте.