Этот материал разработан как раздел второй главы Курса программирования и робототехники.
Первая часть материала посвящена феномену эхолокации, на котором базируется работа ультразвукового датчика дальности (попутно знакомимся и с радиолокацией).
Вторая часть описывает программирование датчика дальности робота Maqueen в среде программирования MakeCode для контроллера микро:бит.
В третьей части происходит знакомство с функциями и функциями с параметрами.
Знакомство со средой программирования MakeCode (или другими средами визуального программирования) будет подспорьем при чтении второй и третьей частей.
На десерт - творческое задание.
1. Эхолокация и радиолокация
Загадка таинственных существ
Летучая мышь - существо необычного, немного жутковатого, вида и необычного поведения: летучие мыши никогда не ходят по земле, спят в дневное время в висячем положении вниз головой, а ночью летают, развернув свои руки-крылья.
Сегодня, во время паники из-за коронавируса, летучая мышь (вирус которой выскользнул из научной лаборатории и породил пандемию), стала чуть не зловещим символом угрозы человечеству. Между тем, исследованию этих замечательных существ человек обязан открытию феномена эхолокации.
Итальянский естествоиспытатель Ладзаро Спалланцани в 18-ом веке обнаружил, что летучие мыши способны прекрасно ориентироваться в абсолютно тёмном пространстве. В опытах коллеги Спалланцани было показано, что восковые пробки в ушах летучих мышей лишают их загадочной способности ориентироваться. Учёные сделали логичный вывод, что таинственные животные ориентируются в темноте с помощью слуха.
Современники не смогли принять этот вывод.
Ультра и Инфра
Человек привык называть звуком то, что он слышит. По мере развития науки стало, однако, понятно, что звук это механические колебания среды (воздуха, например) в определённом диапазоне частот: когда мы слышим высокие и низкие звуки - наше ухо различает колебания разной частоты. Как выяснилось, человеческое ухо слышит лишь в части диапазона частот звука, но это не означает, что звуков за пределами этой части диапазона не существуют и они не используются в природе.
Как мы видим, в 18-ом веке (не так давно, по меркам человеческой истории) даже у научного сообщества не было чёткого осознания ограниченности органов чувств человека как измерительных приборов:
"Мы ничего не слышим - о какой же ориентации с помощью слуха может идти речь? Это просто смешно!".
Позднее, с развитием представлений о природе звука, были введены понятия "ультразвук" и "инфразвук" - для звуков, соответственно, выше и ниже диапазона восприятия человеческого уха. (Со светом - аналогичная история: инфракрасное и ультрафиолетовое излучение - это свет за пределами видимости человеческим глазом).
Летучая мышь использует для ориентации ультразвук. Но механизм использования ультразвука для ориентации (эхолокацию) ученые исследовали и признали лишь около 100 лет назад, в 20-том веке, когда физики уже активно исследовали радиолокацию.
Суть эхолокации и радиолокации
В основе эхолокации, как и в основе радиолокации, лежит принцип анализа сигнала, отражённого от объекта, на который сигнал направлен.
Живой организм или техническое устройство излучает волны, а потом "ловит" их отражение.
Зная время, за которое сигнал достиг препятствия и вернулся (t) и скорость сигнала (v), можно легко определить расстояние до препятствия (s).
Вопрос: напишите формулу расстояния до объекта
s=v*t/2
Вопрос: почему мы делим расстояние v*s пополам?
Расстояние - информация, которую извлечь из отражённого сигнала проще всего. На самом деле, анализируя отражённый сигнал, можно определить размеры и форму обнаруженного отражателя сигнала.
Мозг летучей мыши блестяще справляется с таким анализом, что позволяет животному не натыкаться в абсолютной темноте даже на тонкую проволоку.
Эхолокация и радиолокация отличаются частотой и скоростью, соответственно, ультразвука и радиоволн:
скорость ультразвука в воздухе - 330 м/c (как и скорость звука), а скорость радиоволн - 300000 км/c, почти в миллион раз выше.
Использование эхолокации и радиолокации в технике
Летучая мышь исследует с помощью ультразвука пространство в радиусе нескольких метров, а планетарные радиолокаторы могут "видеть" планеты в миллионах километров от Земли. На сегодня принцип эхолокации широко используется в различных исследованиях, от исследований дна водоёмов до "осмотра" младенца в утробе:
расшифровка названия известной и широкораспространённой ныне медицинской процедуры УЗИ - УльтраЗвуковое Исследование. Ультразвуковые волны способны проникнуть внутрь организма и отразиться от внутренних органов, принося информацию об их состоянии.
Широко используется человеком и радиолокация. Наиболее известное использование радиолокации - определение нахождения воздушного судна на большом расстоянии. Радиолокаторы излучают волны, и, в случае отражения этой волны от летящего объекта, извещают человека о нахождении объекта.
Практическое применение радиолокации в противовоздушной обороне началось во время Второй Мировой войны, когда британские радиолокаторы (тогда - совершенно секретные устройства) засекали немецкие самолёты за многие десятки километров до подлёта к Британским островам и давали обороняющимся ценнейшие минуты на подготовку к отражению воздушной атаки.
2. Датчик дальности робота Maqueen
Форма датчика
На снимке робота Maqueen хорошо виден "бинокль": это и есть датчик дальности.
Датчик дальности работает по принципу эхолокации, "подсказанному" летучей мышью.
Вопрос. Почему у датчика две "зрительных трубы"?
Для эхолокации нужны Передатчик и Приёмник - отсюда и две "трубы": Передатчик подаёт сигнал, Приёмник ловит отражённый от препятствия сигнал. У летучей мыши Передатчиком служит рот или нос (в зависимости от вида летучей мыши), а Приёмником - уши.
Поддержка датчика дальности в среде программирования MakeCode
Создадим новый проект в среде MakeCode.
Датчик дальности - часть робота Maqueen, и соответствующий блок ("read ultrasonic sensor cm" - "прочитать значение с ультразвукового датчика в сантиментрах") включён в папку Maqueen.
Если папка Maqueen ещё не включена в проект,
- В "шестерёнке" выбираем Расширения, набираем maqueen, запускаем поиск и выбираем появившившийся блок maqueen
- в колонке папок появятся папки, связанные с роботом Maqueen).
Теперь у нас есть "подручные средства" для написания программы, использующей датчик дальности.
Попробуем создать следующую программу:
Если расстояние до препятствия больше 50 см, то
Двигаться вперёд
Иначе
Остановиться
Программу будем выполнять постоянно. Для постоянного выполнения программы программы
- В блок "при начале" перенесём блок "пока (истина)"
Далее займёмся блоком "если" и переменной для считывания данных с датчика
- Заведём переменную расстояние
- В блок "пока" перенесём блок "если ... то \ иначе"
Прежде, чем анализировать расстояние в блоке "если", надо считать его с датчика:
- Перенесём из папки Переменные блок "задать для (расстояние) ..." в блок "при начале" внутрь блока "пока"
Теперь нужно заменить 0 в блоке "задать для..." значением с датчика:
- Из папки Maqueen возьмём блок "read ultrasonic sensor cm" и поставим его на место 0
- Напишем условие в блоке "если" -
получится следующая программа:
Теперь можно внести действия в ветки блока "если", вот так:
Но мы пойдём другим путём...
3. Создание блоков (функций) в системе MakeCode
Не правда ли, программа
Если расстояние до препятствия больше 50 см, то
Двигаться вперёд
Иначе
Остановиться
читается хорошо, смысл программы выражен наглядно.
Когда мы заменили "Двигаться вперёд" и "Остановиться" на блоки обращения к моторам, то цели ("Двигаться вперёд" и "Остановиться") заменились на средства их достижения (включить и выключить моторы). Наглядность программы немного потерялась. Если мы будем создавать достаточно большую программу, то её логику будет очень трудно "прочитать" среди деталей реализации замысла.
Конечно, пока мы создаём программу, мы помним все детали, но пройдёт немного времени, м восстановить логику программы будет трудно. Если нашу программу будет изучать другой человек, ему тоже будет трудно понять логику программы среди множества деталей.
А нельзя создать новые блоки: Двигаться вперед и Остановиться, и спрятать в этих блоках детали реализации? Тогда программа сохранила бы свою наглядность. Ответ - можно! (И даже нужно). У нас программа совсем небольшая, но для тренировки лучше начать с маленькой программы - потом это умение очень пригодится при разработке программ большего размера.
Блоки, создаваемые пользователями, называются в системе программирования MakeCode функциями.
Заготовки блоков пользователя спрятаны в папке Функции.
- Если в колонке папок нет папки Функции
то надо открыть папку Расширенные - Откроем папку Функции и нажмём "Создать функцию..."
В блоке "функция" вписано doSomething - это шаблон названия
- Вместо doSomething запишем своё название блока: Двигаться вперёд
- Нажмём на кнопку Готово
Блок с названием "Двигаться вперёд" создан, он появится в поле создания программы. Нужно его заполнить.
- Из блока "при начале" перенесём блок "motor (all)..." внутрь блока "Двигаться вперёд"
Вызов функции
Наш блок (функция) готов. Как же его использовать? Не подставлять же блок целиком в программу (он может быть весьма громоздким и включать в себя много блоков). Для использования функции есть специальный механизм: вызова функции. Вызов функции реализуется единичным блоком "вызвать ..."
- Откроем папку Функции
- там появился блок "вызвать Двигаться вперёд"
- Перенесём блок "вызвать Двигаться вперёд" в ветку "то" блока "если"
Завершим работу:
- Повторим процедуру создания и вызова функции для блока Остановиться
Мы получили следующую программу
Испытаем её. Чтобы было интереснее, возьмём картонку в качестве препятствия, которое можно передвигать.
Пользуясь картонкой, робота можно заставить бегать за вами: когда робот приближается к вам и останавливается, - отодвинем картонку: робот поедет за вами.
Но чего-то не хватает...
А-а-а, когда мы отодвигаем картонку, робот следует за ней, но вот если мы надвигаем картонку на робота, то он на это не реагирует. Так не интересно. Пусть робот отодвигается от картонки, если расстояние станет меньше некоторого!
Например, так:
Если расстояние больше 50 то
Двигаться вперед
Иначе если расстояние меньше 30 то
Двигаться назад
Иначе
Остановиться
Диапазон 30-50 см от препятствия становится "зоной отдыха" для робота: там он не двигается, а когда препятствие меняет положение, то робот двигается в сторону "зоны".
- Чтобы изменить структуру блока "если", нажмём + в левом нижнем углу блока
- между ветками "если то" и "иначе" появится новая ветка "иначе если то"
- В новую ветку поставим условие расстояние < 30
(можно сделать копию условия из верхней ветки и поправить условие)
- Сделаем функцию "Двигаться назад"
: - Поместим блок "вызов Двигаться назад" внутрь созданной ветки блока "если"
Теперь с роботом можно немного побегать
Функция с параметрами
Фактически мы написали для робота программу "Держаться в диапазоне 30-50 см".
Можем ли мы "упаковать" нашу программу в один блок? Почему нет!
Правда, создание блока для конкретного диапазона - не очень интересно: если мы захотим попробовать другой диапазон, то придётся делать новый блок или модифицировать исходный.
Программисты так не поступают: для таких случаев программисты разрабатывают функцию с параметрами: блок функции будет содержать окошки для диапазона, подобно тому как многие блоки содержат окошки параметров. Например, блок "показать число" из папки Основное содержит окошечко, куда мы вписываем число (переменную), которое хотим вывести на дисплей: у нас нет отдельных блоков для вывода 0, 1, 2 и т.д - есть один блок "показать число" с параметром.
Мы будем создавать блок "Держаться в диапазоне" с параметрами мин (нижняя граница диапазона) и макс (верхняя граница диапазона).
- В папке Функции откроем "Создать функцию..."
- Выберем имя функции - Держаться в диапазоне
Теперь надо добавить диапазон.
- В строке Добавить параметр нажмём кнопку Число
- в блоке "функция" после названия функции появится окошко с надписью num: это наш первый параметр
- Заменим надпись num на мин
- Ещё раз нажмем кнопку Число
- в блоке "функция" появится ещё окошко с надписью num
- Переименуем второй параметр в макс
- Нажмем кнопку Готово
- мы получили заготовку нашей функции с параметрами
- В блок функции Держаться в диапазоне перенесём блок "пока" из блока "при начале"
- теперь числа 30 и 50 в перенесённых блоках нужно заменить на параметры функции мин и макс:
- Захватим мышью параметр мин и перенесём его на место числа 30
- Захватим мышью параметр макс и перенесём его на место числа 50
Полученную функцию нужно вызвать из блока "при начале".
- Откроем папку Функции и перенесём блок "вызвать Держаться в диапазоне (1) (1)" в блок "при начале"
В блоке "вызвать Держаться в диапазоне" нужно подставить параметры диапазона. Для разнообразия подставим 25 и 35. В результате получим
Теперь пора проверить работу программы.
Упражнение. Добавить в функцию Держаться в диапазоне "эмоции". "Эмоции" можно выразить звуком или изображением на дисплее. Для нахождения внутри диапазона и для каждого случая вне диапазона нужно выбрать свою эмоцию.
Заметим, что изменения внутри функции не поменяют нашу главную программу - блок "при начале".
4. Творческое задание
Задание: определить экспериментально, какая "зрительная труба" датчика дальности является Передатчиком, а какая - Приёмником.
Внимание - провокация! Автор не знает ответа на этот вопрос, и вообще не уверен, что в домашних условиях эта задача решаема. Но... нашей школе так не хватает провокации и "открытых" вопросов, которые допускают разные ответы или ответы на которые ещё не известны. А ведь интересно поломать голову и посмотеть, как юные инженеры будут порождать гипотезы и находить в них изъяны.
Ссылки
- При работе над первой частью публикации использованы материалы Википедии.
- Программы, описываемые в настоящей публикации, используют мотивы проекта "Очень общительный и тактичный собеседник", из книги Александра Григорьева и Юрия Винницкого "Игровая робототехника для юных программистов и конструкторов: MBOT и MBLOCK", "БХВ-Петербург", 2019.