Гайд по беспроводной связи в кружке робототехники

Прежде чем начнём — несколько важных моментов.

Занятия у нас проходят без использования каких-либо сильно упрощающих дело «адаптированных» наборов, вроде экосистемы «Тройка» от «Амперки». Просто потому, что китайские модули в десятки раз дешевле, а каких-то особых преимуществ наборы «Амперки» не дают.

Скорее — наоборот…

Как-то раз увидел, что инфракрасный датчик линии на сайте Амперки продаётся в двух отдельных версиях — аналоговой и цифровой. Это при том, что схемотехнически это один и тот же модуль. Но по-человечески только китайцы делают, а у нас производитель решил разапгрейдить модуль, дабы получить сверхприбыль. Когда это увидел, стал именовать «Амперку» не иначе как «Вампиркой».

Занятия в кружке проходят в группах до 8 человек. Среды разработки используем разные, но основной считаем классическую Arduino IDE. Курс освоения Arduino в большей степени является курсом по основам программирования на С++, поэтому модули осваиваются в привязке к темам курса программирования, в строгом порядке.

В статье будет упомянуто такое явление, как несовместимость некоторых библиотек. Я отдаю себе отчёт, что можно поковыряться в регистрах, перенастроить таймеры и всё такое прочее. Но я таким не занимаюсь по ряду причин. Во-первых, дети придут домой, скачают стоковые библиотеки и будут недоумевать, почему у них ничего не работает. Во-вторых, пришлось бы в кружке после каждого обновления библиотек вносить в них правки, и вообще — контролировать этот момент. Короче, я с таким не заморачиваюсь, находя альтернативные варианты.

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

ИК-приёмник с ИК-пультом

c8a80e0facdaf6f1493a39c425735e7a.png

Как искать: TL1838

Библиотека: iarduno_IR

Цена

Сложность освоения

Дальнобойность

Коллизии

5 р за ИК-приёмник

50 рублей за пульт

низкая

До 6 метров в помещении

Неизбежны

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

Мини-проекты, которые ученики могут делать, освоив данный способ беспроводной связи: простейший робот с беспроводной связью (при наличии навыка управления моторами через Arduino), базовый «настоящий» «умный дом» (управление несколькими лампочками 220 В через реле и ИК-пульт), разного рода иной интерактивчик со всей освоенной до этого периферией.

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

Bluetooth

a76b921d804e520c21d83c3457681b15.png

Как искать: SPP-C Bluetooth (HC-05 или HC-06 — не рекомендую)

Библиотека: SoftwareSerial, но можно и без библиотеки

Цена

Сложность освоения

Дальнобойность

Коллизии

150 р

средне

До 10–12 метров

При определённых условиях

Модули блютуса требуют не сильно больше фундаментальных знаний программирования, чем предыдущая микросхемка. По сути, только понимания того, как работает UART и как пользоваться переменными. Освоили Serial — считай, наполовину и блютус поняли. При этом блютус даёт кратно больше возможностей для юных инженеров, а именно:

1. Модуль обеспечивает уже радиосвязь — и теперь управлять приборами можно за пределами прямой видимости и на втрое большей дальности, чем по ИК-интерфейсу.

2. Для отправки данных используется смартфон. А он даёт множество возможностей кастомизировать панель управления создаваемого прибора. В работе мы используем, например, сервис RemoteXY, который позволяет быстро и просто создавать красивые интерфейсы. Также в привязке к теме блютуса я рассказываю ребятам про App Inventor, который сам по себе является целой отдельной технологической веткой, представляя собой, по сути, полноценный конструктор Android-приложений.

3. Можно одновременно запускать несколько блютусов в помещении, и не опасаться неизбежности наложения сигналов друг на друга (но тут есть нюансы, о которых скажу дальше).

Преимущества очевидны. Теперь чуть подробнее об использовании блютуса в учебном процессе. Как я и указал, сложность освоения тут выше, чем у ИК-связи.

Во-первых, требуется провести лекцию по UART, суть которой сводится к тому, что «RX модуля подключается к TX Arduino, и наоборот». Также надо ещё раз донести до детей, что пины 0 и 1 на ардуинах мы не используем до особого распоряжения.

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

На этом же этапе следует объяснить, как работать с библиотекой SoftwareSerial, что проблем обычно не вызывает. Отдельно следует упомянуть ОСОБЕННОСТЬ 0: при назначении пина Rx на арудино лучше чтобы это был пин 2 или 3 (то есть, пины с «быстрыми», аппаратными прерываниями). В противном случае может не заработать приём данных от блютуса к ардуине.

Тут же я обычно изображаю каноничную архитектуру Arduino-устройств с блютусом на борту, чтобы дети понимали, где тут Serial, а где — «другой Serial».

1c8fc2f3155927ee71f81c362fb8c94c.png

Когда это всё в юных головёнках уляжется должным образом, можно переходить к следующему шагу.

Во-вторых, приходится чётко объяснять порядок манипуляций, которые надо проделать с телефоном, чтобы подключиться к блютусу. И тут уже сразу две «особенности». ОСОБЕННОСТЬ 1 — на разных смартфонах чуть по-разному всё это делается. ОСОБЕННОСТЬ 2 — «яблочная» продукция в принципе не умеет общаться с блютусами. На этот случай в кружке всегда стоят на зарядке «православные» андроиды, готовые прийти на помощь несчастным «мичуринцам».

В-третьих, следует установить на телефоны блютус-терминалы. Не у всех детей это в принципе возможно (родительские контроли, забыты логины и пароли, детям — никакой воли, короче, вместо урока — порция душевной боли). Тоже решается наличием в кружке аппаратов с предустановленным ПО.

Всё это преодолимо, хотя довольно скучно и муторно. Но, допустим, установлены приложения, схемы собраны, прошивки залиты. И вот начинаем подключаться…

…и помните, выше я упоминал, что блютусы всё-таки чуть-чуть, да склонны к коллизиям? Ну, в общем-то, проявляется это только в том случае, если на 20 квадратных метрах кабинета врубятся сразу штук 16 блютусов (8 телефонов и 8 модулей). Это как раз и есть ОСОБЕННОСТЬ 3, которая выглядит так: на смартфонах (некоторых) отображаются некорректные имена блютусов, иногда имена меняются прямо во время подключения, иногда не подходят верные пин-коды, иногда — отвалы происходят. Решается это тем, что блютусы подключаем один за другим. Благо, темп работы у всех разный, и кое-какая дискретизация по времени в работе с модулями обычно имеется. Если нет — ну, что ж, подконтраливаю врукопашную.

Всё это с лихвой окупается тем ВОСТОРГОМ, с которым дети впервые отправляют какую-нибудь »1» в терминал, а в ответ на устройстве загорается светодиод!

А уж когда осваивается RemoteXY или AppInventor — и говорить нечего, просто на ушах стоят, упиваясь пьянящим ощущением власти) Минут пять уходит обычно на то, чтобы молодёжь наигралась, свайпая туда-сюда какой-нибудь переключатель НА САМОДЕЛЬНОМ приложении.

Качество шакальное, так как это кадр из видеоотчёта с занятия: молодой человек оторваться не мог от игрушки, которую собрал самостоятельно

Качество шакальное, так как это кадр из видеоотчёта с занятия: молодой человек оторваться не мог от игрушки, которую собрал самостоятельно

Однако и тут есть ложечка дёгтя (ОСОБЕННОСТЬ 4): библиотека SoftwareSerial конфликтует с библиотекой Servo. Выражается это в том, что при одновременном использовании этих библиотек сервы начинают довольно сильно подрагивать, портя весь кайф от применения слайдеров или джойстиков в том же RemoteXY.

И вот тут я даю ОСОБОЕ РАСПОРЯЖЕНИЕ: подключать блютус к пинам 0 и 1. Это решает проблему, хотя, опять же, добавляет мороки — теперь нужно отключать блютус при каждой перепрошивке, а отладка по Serial становится недоступной.

Но и это не всё.

Дело в том, что (ОСОБЕННОСТЬ 5) аппаратный Serial не работает адекватно на Arduino Nano, если использовать RemoteXY. На Arduino Uno — прекрасно работает. На нане (с тем же камнем, тем же всем) — не работает. Загрузчики пробовали и Old, и новый — вообще всё равно…

Ну и напоследок. У блютусов есть разные аппаратные версии и разные версии программного обеспечения. Это надо уточнять, работая с AT-командами. Учеников я к таким вещам подпускаю редко, уж точно сильно позже, чем при первом знакомстве. Просто потому что не будучи до конца в курсе, как и что тут работает, дети могут сбить оптимальные настройки модуля и потом нудить, мол, «оно не работает».

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

Поначалу тест происходил путём отправки команды «AT» без аргумента и с разным бодрэйтом да с разными интервалами. В ответ блютус выдавал «ОК», дав понять, что, собственно, с ним «всё ок».

…приходит мне как-то раз партия из 30 блютусов. Я начинаю их тестить — и в ответ полная тишина. Я в шоке: 30 блютусов мёртвых — это тебе не фунт изюму. Открываю спор с китайцем, ругань-дрязги… Уже почти вернул деньги, как вдруг приходит мне в голову отправить что-то кроме «AT». Отправляю «AT+NAME», и о чудо, получаю в ответ заветные «JDY-31».

Когда выяснилась ОСОБЕННОСТЬ 6 про более не жизнеспособную команду «AT», я отменил спор и стал с тех пор тестировать блютус командой «AT+VERSION». Связано это с тем, что она состоит из двух частей и при этом не имеет аргументов. Отсутствие аргументов нужно на случай, если (ОСОБЕННОСТЬ 7) одна команда «слипнется» с другой, и последующая команда становится как бы аргументом предыдущей. Такое случается по причине слишком маленькой паузы между командами. На скорости 9600 бод лучше, чтобы интервал был хотя бы 100 мс. Иначе вполне реально получить блютус с именем AT+NAME.

Фух.

Итого: блютус — это круто, блютус — это стильно, блютус — это больно работа для мозгов. Также это работа с Android, что позволяет впоследствии гармонично перейти от разработки хардварных проектов на Arduino и плюсах к разработке приложений на Java.

Пример простейшего интерфейса и «кода» для App Inventor, подходящего для работы с блютусами, приведён ниже. С подобных вот «приложений» начинаются у нас все проекты на Android.

bb14c1b33675084a4a9f143d75573154.png6b1fcdde27c9d72b599920a585664b87.png

Лучший модуль радиосвязи для кружка робототехники: SI4432

ed0a7103353620194af1047a591f8710.png

Как искать: SI4432

Библиотека: RH_RF22 (из набора RadioHead)

Цена

Сложность освоения

Дальнобойность

Коллизии

150 р

высокая

Тестировался до 500 метров

Можно полностью исключить

Если пролистаете статейку ниже, вы увидите, что про этот модуль сказано совсем немного. А всё потому, что он работает ровно так, как ожидается, у него нет непредсказуемых «особенностей», которыми так изобилует ранее упомянутый блютус. Именно поэтому я считаю данный модуль радиосвязи наилучшим. Итак…

Данный модуль — программируемый приёмник-передатчик, с настраиваемой несущей частотой в диапазоне от 240 до 960 МГц. Подключается по SPI, работает от 3,3 В, что требует либо подключения к Arduino через конвертер, либо перепайки на самой ардуине линейного стабилизатора AMS1117 с версии 5.0 В на версию 3.3 В. Первый способ предпочтительнее, так как для ардуины почти вся периферия работает с логическим уровнем 5 В.

Плюсами модуля являются:

1. Дальнобойность (несколько сотен метров в условиях застройки и помех на частоте 433 МГц и стандартной модуляции);

2. Устойчивость к перепадам по питанию (радиомодули типа MX или NRF таким похвастаться не могут — постоянно отваливались и ребутались при использовании на колёсных платформах);

3.  Возможность настраивать частоту с шагом в полторы сотни Гц, что позволяет избежать приёма сигналов от разных источников одним приёмником;

4. Никаких конфликтов со стандартной «робототехнической» периферией не выявлено, так как аппаратный SPI никому работать не мешает.

Особенности работы с этим модулем.

Во-первых, зачем-то пины интерфейса SPI названы как-то нестандартно. Таким образом, MOSI стал SDI (предполагаю, что это «Serial data input»), MISO — SDO, CLK — SCLK, а SS — NSEL (что, в принципе, удобнее, так как N явно указывает, какой логический уровень разрешает работу микросхемы). Пин NIRQ к интерфейсу SPI уже не относится, и является выходом прерывания, проваливающимся в 0 при наступлении событий.

Во-вторых, есть некоторая сложность при освоении библиотеки по стандартным примерам. Чтобы понять до конца то, что в них написано, следует знать синтаксис массивов, навыки их применения, а также иметь представление о ссылках и указателях. Поэтому изучение этого модуля я сдвигаю ближе к концу курса структурного программирования. Также в примерах не указано, что у конструктора класса есть удобные аргументы, и их аж целых два. Первый — это пин Arduino,   к которому подключён NSEL микросхемы. Второй — это NIRQ, причём это должны быть пины с «быстрыми» прерываниями, то есть, 2 или 3 на большинстве плат. Не зная этого работа с модулем может доставить головной боли.

В-третьих, сложности добавляет то, что проекты на основе этого модуля требуют сборки минимум двух устройств: собственно, какого-нибудь робота и аппаратного пульта для этого дела. Что, впрочем, детям только в радость — креативить пульты они могут, умеют и практикуют.

Пульт и выглядел, и работал как заводской

Пульт и выглядел, и работал как заводской

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

В общем-то и всё. В работе применяем уже 5 лет, все самые ответственные проекты собраны с применением именно этого чипа.

FPV-система

9bc052845f96cb82f24edefde71ab4e2.png

Роботы не были бы роботами, если бы на них не устанавливались камеры, позволяющие оператору наблюдать за происходящим. Тут всё просто: мы используем маломощные камеры с передатчиком на 25 мВт (искать можно как 25 mW fpv camera), а в качестве приёмников — Skydroid в исполнении с двумя антеннами.

Работать с этим всем очень просто: на камеру надо подать от 3,7 до 5 В, а приёмник — воткнуть в смартфон с OTG, на котором есть приложение вроде PokeFPV. После включения питания камеры и подключения приёмника к смартфону на приёмнике нужно длительно нажать кнопку сканирования, подождать секунд 30, и вуаля — на смартфоне отображается то же, что видит камера на роботе.

ИТОГ

Разумеется, существует огромное многообразие модулей, протоколов, систем для организации беспроводной связи, толерантной к мозгам учеников и аппаратному обеспечению Arduino. Но за время работы мы с коллегами остановили свой выбор именно на этих устройствах, по указанным выше причинам (соотношению цены и предоставляемых возможностей). В будущем планируем подробнее рассмотреть ESP8266 (как отдельную платформу, изучаемую в рамках курса web-разработки для интернета вещей) и модуль HC-12 — как альтернативу сложноватенькой SI4432. Кстати, HC-12 уже едет, так что надеюсь вскоре дополнить статью впечатлениями от его использования.

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

© Habrahabr.ru