Публикации сообщества

Михаил Семионенков • 18 апреля 2020

"А мы уйдём на север!" Компас как артефакт и повод попрограммировать

"Этим полукреслом мастер Гамбс начинает" работу над второй главой курса основ программирования и робототехники. Поскольку вторая глава в её "железной" части посвящена датчикам платы микро:бит и робота Maqueen, то мы попробуем по возможности отталкиваться от феноменов, связанных с этими датчиками 
(речь не идёт о полноценном раскрытии феномена, но о привязке феномена к занятиям по робототехнике и программированию).

Первый пример - встроенный компас платы микро:бит.
Вторая часть материала предполагает знакомство со средой программирования makecode. Наличие робота Maqueen для выполнения заданий в этом материале не требуется (удобной возможности использовать компас платы микро:бит на борту робота не найдено: компас платы работает в горизонтальном положении, а в робота плата вставляется вертикально). Даже наличие платы микро:бит не обязательно: эмулятор микро:бит в среде программирования makecode позволяет посмотреть результат работы программы.

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

Компас 

Компас - прибор, служащий для ориентирования на местности. 
Допустим, у нас есть карта местности, и мы знаем, в какой точке местности (по карте) мы находимся, а также знаем точку, куда мы хотим попасть.
Мы можем нарисовать на карте стрелку от исходной точки до конечной - стрелка укажет нам направление движения. Но как найти это направление на местности?
На местности нужно от чего-то оттолкнуться, от какого-то направления, которое нам известно. На суше ориентирами могут служить холмы, вышки, строения: любой объёкт, нанесённый на карте, который мы можем увидеть и распознать.
А как, например, ориентироваться на море, где моряка окружает водная гладь без каких-либо ориентиров?  
Многие века моряки использовали для ориентации Полярную звезду: известно, что Полярная звезда всегда находится на севере от наблюдателя.  
Если мы станем лицом к Полярной звезде, то справа у нас будет восток, слева - запад, сзади - юг. 
Нарисуем на карте вторую стрелку - из исходной точки на север (карты обычно выполнены так, что север находится вверху. Если это не так, то на карте есть значок, показывающий направление на север).
На карте получился угол - это угол между направлением на север и направлением движения. 
Зная направление на север, мы можем определить азимут - отклонение нашего маршрута от направления на север, другими словами, величину угла между направлением на север и направлением движения.
Моряки вместо "азимута" используют термин "курс".
Курс измеряется в градусах, от 0 (север) до 359, по часовой стрелке.

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

Контрольный вопрос: Какому курсу в градусах соответствует курс ост? зюйд-вест, норд?

Зная на местности направление на север и определив по карте азимут (курс), мы можем выбрать на местности направление движения к цели.

Моряки пользовались Полярной звездой для определения на местности направления на север. У Полярной звезды как ориентира есть, однако, большой недостаток: её видимость зависит от погоды и времени суток. Компас - это "ручная" Полярная звезда
Стрелка компаса указывает на север (второй конец стрелки компаса указывает на юг, но для определённости мы будет отталкиваться от направления на север). 
До недавнего времени был широко распространён компас, базирующийся на европейском изобретении 14-ого века: магнитная стрелка установлена в таком компасе на шпильку
В Китае компас был изобретён гораздо раньше, ещё до нашей эры, и представлял из себя магнитную стрелку, плавающую на пробке в чаше с водой.
И в том, и в другом случае в состоянии покоя стрелка, под влиянием магнитного поля Земли (а Земля - это огромный магнит), ориентируется в направлении север-юг.  
Надо заметить, компас показывает направление на магнитный северный полюс Земли, который не находится в географическом северном полюсе Земли (точке, которой соответствует "вершина" глобуса),
но для загородной прогулки это неточность в определении направления на север не имеет практического значения.

Встроенный компас на плате микро:бит

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

Калибровка компаса

Блок для получения значения с компаса "компасный курс (^)" находится в основной папке Ввод.
Прежде, чем программа сможет обратится к компасу, компас должен быть откалиброван, другими словами - настроен на работу. 
Программа может вызвать калибровку компаса явно: блок "калибровать компас" находится в папке Ввод ... more. 
Если программа не будет использовать блок "калибровать компас" явно, то калибровка будет выполнена при первом обращении за значением с компаса. Но есть тонкость: калибровка - относительно длинная операция, которую нужно выполнять вручную, вращая плату определённым образом. Если калибровка включена в основную программу (блок "при начале"), то её придётся выполнять при каждом перезапуске программы: как при нажатии кнопки RESET, так и выключении-включении питания.
К счастью, этого можно избежать, если включить калибровку компаса в блок, выполняемый при каком-то событии: нажатии кнопки или встряхивании. 
Таким образом можно однажды откалибровать компас, а потом многократно перезапускать программу уже без калибровки. Однако, при прошивке новой версии программы калибровку придётся выполнять заново.

Чтобы опробовать калибровку, используем следующую программу 

Калибровка компаса
Калибровка компаса

 

Прошьём программу на микро:бит. Теперь посмотрим, как работает калибровка: встряхнём микро:бит. 
На экране мы увидим бегущую строку: "Заполнить экран" (на английском).
После завершения бегущей строки нужно вращать микро:бит так, чтобы "залить" все светодиоды светом (это вполне интуитивная операция).
Когда все светодиоды на экране загорятся, произойдёт смена изображения: на экране появится смайлик, и экран вскоре погаснет: это означает, что калибровка завершена.

Работа с компасом. 

Для чтения данных с компаса макро:бит должен находится в горизонтальной плоскости. При обращении к компасу (блок "компасный курс") компас возвращает курс (азимут) платы микро:бит, точнее, азимут оси платы,
проходящей от центра контакта 2 платы до разъёма USB (величину угла в градусах от направления на север до оси платы.

Курс компаса микро:бит
Курс платы микро:бит

 

Опробуем работу компаса. Чтобы убедиться, что компас возвращает по запросу данные, необходимо вывести эти данные наружу. Самый простой способ - выводить полученное с компаса число на дисплей микро:бит.
Поскольку для получения различных значений с компаса плату нужно вращать в плоскости, а смотреть на дисплей удобно только в одном положении, то стоит разделить во времени получение данных с компаса и просмотр данных.

Вопрос: Как это можно сделать?

Например, так: при нажатии кнопки А обратится к компасу и запомнить полученное значение, а при нажатии кнопки В - показать число на дисплее. Число запомним в переменной "курс".

Итак, получаем следующую программу:

Программа "Компас"
Опрос компаса и вывод данных

 

Теперь прошьём программу, выполним калибровку и попробуем померить курс при разной ориентации платы.

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

Самостоятельная работа: переделать программу так, чтобы получить вариант, описанный выше.

Можно пойти дальше: опрашивать компас постоянно и выводить данные на дисплей. В этом случае нужно подумать о выводе информации в другой форме (постоянный вывод числовой информации в виде бегущей строки не слишком удобен).
Как?
Посмотрим на следующее изображение

Роза ветров
Роза ветров ("компасная роза")

 

Эта стилизованная 8-конечная звезда с обозначением направлений называется розой ветров (по-английски она называется компасной розой).  
В сильно упрощённом виде мы изображали нечто похожее в программе "Пропеллер", 4 линии, проходящие через центр дисплея. 
Если программа опроса компаса просто изобразит розу ветров, то это не будет нести информации. Для того, что зритель получил информацию, изображение должно меняться в зависимости от значений, получаемых
 программой с компаса.

Как?

Графический вывод информации с компаса

Идея! Изображать только тот луч звезды, который соответствует курсу, полученному программой с компаса.

Мы изображали разные положения стрелки часов в программе "Стрелка часов". Изображения стрелки мы можем использовать в качестве изображений румбов (конечно, использовать всего 8 румбов вместо диапазона от 0 до 359 градусов - это большая вольность. Но мы её себе сегодня позволим :-)).

А как нам вычислить, какой румб соответствует тому или иному значению курса?

Можно, конечно, поступить самым прямолинейным образом: разбить окружность на восемь частей, на середину каждой из которых приходится румб, вычислить границы частей в градусах и расписать систему условий:

Если курс <=22* ИЛИ курс >=338 то румб = север

Если курс >=23* И курс <=67 то румб = северо-восток

и так далее

Но это долго и скучновато. Мы же работаем с массивом. Нельзя курс перевести прямо в индекс массива?

Надо попробовать. На каждый румб приходится по 45 градусов. 

Разделим курс на 45. Получится число в диапазоне [0, 8), то есть, от 0, до 8, но 0 входит в диапазон, а 8 - нет.

Это близко к диапазону индекса: от 0 до 7, но большинство частных от деления курса на 45 не являются целыми числами. 

Посмотрим поближе, как румбы соотносятся с диапазонами частных от деления.

Задание: убедиться в следующем соответствии диапазонов частного и румбов:

[0, 0.5) - север

(0.5, 1.5) - северо-восток

(1.5, 2.5) - восток 

и так далее

Если это так, то нам достаточно округлить частное до ближайшего целого:

числа в диапазоне [0, 0.5) будут округлены до нуля, в (0.5, 1.5) - до единицы, и далее аналогично мы будем получать индекс изображения в массиве стрелок.

Вопрос: сколько значений индекса мы получим в результате округления всех возможных частных от деления курса на 45?

Если вы ответили 8, то вы поторопились. Подумаем ещё...

Индексов получится не 8, а 9, поскольку последняя 1/16 диапазона курсов [338, 359] после деления на 45 и округления до ближайшего целого будет округляться до 8, и от 0 до 8 будет 9 индексов. "Лишний" индекс получился из-за разрыва значений курса в точке 0 (север): в результате "восточная" половина северного румба попала на индекс 0, а "западная" - на индекс 8.

Полученные индекс 0 и 8 должны ссылаться на одно и то же изображение. Поступить можно двояко:

  • проверить индекс, и если он равен 8, приравнять его к нулю и обойтись 8-ью уникальными элементами в массиве
  • завести в массиве изображений 9-ый элемент и скопировать туда первый элемент - тогда мы избежим дополнительную проверку

В последнем случае мы получим следующий массив изображений:

массив изображений
массив изображений румбов 

 

Для округления нам нужен блок "округление" из папки Математика, для деления - блок "(0) / (0)" из той же папки. В результате получим следующую программу

румб
Программа "Румб"

 

 

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

Если в распоряжении есть блок для автономного питания микро:бит (на худой конец, его роль может сыграть робот с платой микро:бит), то с такой программой можно попробовать походить по азимуту: выбрав азимут, нужно поворачиваться с платой микро:бит до тех пор, пока на дисплее не появится изображение нужного румба.

Это означает, что микро:бит ориентирован в направлении движения.

Теперь - вперёд! 

Если румб на микро:бит вдруг сменится, это значит, что мы отклонились от курса, и направление нужно немного подправить.

Удачи!

 

Использовано изображение розы ветров  из WikiMedia Commons

Автор - ElfQrin