· 

Как связать два микроконтроллера по Bluetooth. Настраиваем HC-05 для работы в режиме Master

Как связать два микроконтроллера по Bluetooth. Настраиваем HC-05 для работы в режиме Master

О том, что такое Bluetooth, и зачем он нужен, много рассказывать не надо. Тем не менее, с точки зрения его использования в образовательной робототехнике следует особо подчеркнуть некоторые моменты. Это распространенный и универсальный тип беспроводной связи. Если укомплектовать робоплатформу модулем Bluetooth, управлять ей становится возможно и с компьютера, и с планшета, и, потенциально с любого другого устройства. А за счет доступности, Bluetooth часто оказывается единственной возможностью беспроводной связи, которую нам предоставляют разработчики. Особенно это касается мобильных робоплатформ начального уровня на базе Arduino.

Некоторые программные продукты, такие как ScratchDuino и Scratch4Ardino (“S4A”), требуют постоянного соединения робототехнического контроллера с компьютером, а в большинстве случаев нам хотелось бы отказаться от подключения проводом. Таким образом, мы вынуждены задействовать Bluetooth. В виде альтернативы — переход к Arduino IDE, либо визуальным средствам, позволяющие запрограммировать робоплатформу для автономной работы (ArduBlockSnap4ArduinomBlock). Но даже для автономных роботов Bluetooth продолжает быть востребованным. Нам может потребоваться отладка, переключение программ работы, либо переход в режим ручного управления. В дополнение - было бы здорово научиться сопрягать разные устройства между собой. Например, использовать ScratchDuino лабораторию как пульт дистанционного управления робоплатформой. Это легко осуществимо, но… лишь при посредничестве компьютера. Вопрос первый, как их связать напрямую?

Существует и другой важный аспект, на который нельзя не указать. К сожалению, использование Bluetooth в ходе занятий сопряжено с тем, что сбои связи происходят слишком часто, и на восстановление соединения приходится тратить массу времени. Иногда помогает лишь перезагрузка компьютера, удаление сохраненных настроек и сопряжение устройств заново, с нуля. А иногда не помогают никакие «танцы с бубном». Вопрос второй, как избежать всех этих проблем?

Чтобы найти решение, нам придется уйти немного в сторону и прояснить некоторые особенности работы Bluetooth. Для передачи данных используется профиль последовательного порта (SPP) и топология «точка-точка». Когда соединение установлено, между двумя устройствами образуется «прозрачный» беспроводной канал связи, который выглядит так, как будто бы устройства связаны проводом. Точнее, двумя. Первый «проводочек» передает сигнал протокола последовательного обмена данными в одном направлении, второй - в обратном. Единственная существенная особенность — этот канал работает на какой-то конкретной предопределенной скорости обмена. Информация передается в обоих направлениях, и оба устройства находятся в равном положении.

Однако, для того, чтобы подобный канал связи возник, соединение нужно инициализировать. И в этом отношении два устройства неравноправны. Одно из них пассивно ждет, то есть выполняет подчиненную роль (Slave). Это несложно, от «раба» большого ума не требуется. Другое - играет роль инициатора соединения (Master), на нем ответственности больше. Мастер должен узнать нужное нам сетевое устройство, отправить ему запрос на соединение, предоставить правильный PIN-код. Лишь после этого становится возможен обмен данными. 

На практике устройства Bluetooth, настройки которых мы менять не в состоянии, способны играть лишь роль Slave. А роль Master достается Bluetooth модулю компьютера или смартфона. Пользуясь средствами операционной системы, мы настраиваем сопряжение с нужным нам подчиненным устройством. После этого операционная система по нашему запросу (попытка отправить данные на соответствующий COM-порт, например) инициализирует Bluetooth соединение и следит за его работоспособностью. Делает она это без особого энтузиазма, кстати. Оно и понятно, у операционной системы банально нет полной информации о наличном состоянии канала связи. А у кого эта информация есть? Лишь у самого модуля Bluetooth!

Итак, мы вплотную подошли к решению. То, что нам нужно, это настроить наш модуль так, чтобы он был способен самостоятельно играть роль мастера, и устанавливать соединение, не дожидаясь указаний со стороны операционной системы. Для этого годится HC-05, один из самых распространенных внешних Bluetooth модулей. Он, в отличие от HC-06, обладает всем необходимым нам функционалом. Для удобства подключения следует использовать модуль, смонтированный на плате DIY с внешними «ногами» (на фотографии синего цвета).

Еще нам понадобится преобразователь USB-TTL UART. Я заказывал все отсюда и отсюда. Вот варианты поближе: раз и два.

Настройка HC-05 на инициализацию соединения с подчиненным Bluetooth модулем позволяет получить отказоустойчивый канал связи между двумя произвольными устройствами. Условием является лишь их способность использовать UART. Мы будем рассматривать все на примере коммуникации между двумя Arduino контроллерами, но аналогичным образом можно соединить Raspberry Pi и Espruino, например. Подключив мастер-модуль HC-05 к преобразователю USB-UART, мы получаем «брелок», связывающий подчиненное устройство с компьютером без необходимости настраивать сопряжение на уровне операционной системы. Когда каждая робоплатформа в учебном классе укомплектована собственным управляющим «брелком», нет нужды тратить время занятий на настройки. Bluetooth соединение работает надежно, а при обрыве связи восстанавливается за секунды.

Прежде, чем приступить, давайте поймем, на какую скорость обмена настроен Bluetooth робоплатформы, которой мы собираемся управлять. Скорость можно проверить, открыв файл прошивки в Arduino IDE. Если это ScratchDuino робоплатформа — 38400. Для S4A и Snap4Arduino «родная» скорость — 57600. Для робоконтроллеров компании MakeBlock – 115200. Если мы подключаем к самодельной робоплатформе только что купленный модуль HC-05 или HC-06, нам следует знать, что его скорость 9600. Первым делом нужно будет поменять ее на что-то более востребованное. Если собираемся использовать программную среду Snap4Arduino – 57600, mBlock – 115200. Меняются настройки при помощи AT-команд, и в подробностях все описано ниже. Напомню, робоплатформа будет играть роль подчиненного устройства. И master-модуль, и slave-модуль, и управляющая программа (среда программирования: Snap4Arduino, mBlock, etc.) должны использовать одну и ту же скорость. И та же самая скорость должна быть прописана в скетче, загруженном в робоплатформу. Если Вы используете готовый робототехнический набор, например ScratchDuino, узнайте имя Bluetooth модуля и PIN-код для подключения. Имя скорее всего написано снизу, а PIN-код - «1234».

Нам потребуется ПО, посредством которого мы будем отправлять AT-команды модулю. Тут все просто, сгодится любая терминальная программа (например, Termite) или Arduino IDE, в состав которого входит монитор последовательного порта.
Будем для определенности считать, что мы используем самодельную робоплатформу на базе Arduino Uno, и хотим добавить ей возможность Bluetooth коммуникации с другим Arduino устройством, а также подключения к компьютеру при помощи собственного преднастроенного USB «брелка». Тот, у кого уже есть готовая робоплатформа с встроенным Bluetooth модулем, легко адаптирует данное руководство применительно к своей ситуации.

Итак, вводные данные. Что у нас есть:
• компьютер с установленной Arduino IDE и драйверами для нашей платы;
• две платы Arduino Uno или подобные с USB кабелем для подключения к компьютеру, одна плата для робоплатформы, а другая для сопряженного устройства, например, пульта управления;
• автономный источник питания для одной из плат - сетевой адаптер или аккумуляторная батарея (для наглядности);
• два модуля HC-05 (в «большом» варианте, с внешними «ногами»), один будет «master», другой «slave» (на роль «slave» допустимо взять и HC-06);
• проводочки Dupont, «папа-мама» 8 штук, «мама-мама» 4 штуки, «папа-папа» 1 штука;
• скотч прозрачный узкий;
• кусочек стирательной резинки или любой другой плоский кусок резины;
• ручка и бумага для записей;
• преобразователь интерфейса USB-UART и драйвера для него.

Перед началом работы стоит вспомнить о том, что мы имеем дело с электронными компонентами, чувствительными к электростатическому напряжению и неправильному подключению. Поэтому делаем все аккуратно, как любят писать разработчики свободных аппаратных платформ и ПО – «на свой страх и риск».

Начинаем со смены настроек slave-модуля Bluetooth. Для этого его надо подключить к компьютеру посредством преобразователя USB-UART. Здесь мне опять придется отвлечься, чтобы развеять одно распространенное заблуждение. Несмотря на то, то напряжение работы микросхемы модуля 3.3V, питаться он должен от 5V и только от них. Связано это с тем, что на плате «обвязки» расположен собственный стабилизатор напряжения, который «съедает» как минимум 0.3 вольта. Таким образом минимально допустимое напряжение питания 3.6V. Практика показывает, что от 3.3V модуль тоже работает, но лишь до тех пор, пока батарейки чуть-чуть не просядут или мы не попытаемся переключиться в режим повышенного энергопотребления. А чем выше скорость обмена, тем выше энергопотребление. Итак, модуль требует питания от 5V. И в нашем случае нет нужды использовать делитель напряжения для «ног» Rx и Tx. Подключаем простыми проводочками «мама-мама» модуль Bluetooth к USB-UART по следующей схеме:
• +5V (USB-UART) – VCC (Bluetooth)
• GND (USB-UART) – GND (Bluetooth)
• TXD (USB-UART) – RXD (Bluetooth)
• RXD (USB-UART) – TXD (Bluetooth)
• +3.3V (USB-UART) – KEY (Bluetooth)

Обратите внимание, контакт «Transmit Data» одного устройства подключен к контакту «Receive Data» другого!

Про пятый пункт требуется сказать отдельно. Для перехода в режим AT-команд необходимо подать логическую единицу (3.3V) на контакт с названием «Key». Скорее всего, такой «ноги» Вы не увидите. Но выход существует, надо использовать контакт 34 на мини- плате модуля. Если смотреть сверху, расположив Bluetooth модуль «ногами» к себе, это самый дальний контакт в правом ряду.

Заводим провод под прозрачную пластиковую изоляцию, чтобы он коснулся этого контакта. Если изоляции на модуле нет, фиксируем скотчем. Другой конец провода подключаем к контакту +3.3V преобразователя USB-UART. В результате должно получиться вот что.

А что делать, если такую полезную вещицу, как преобразователь USB-UART, Вы приобрести еще не успели? Открою маленькую тайну для тех, кто не знает, либо не догадывается. Раз Вы пользуетесь платами типа Arduino Uno, Nano и прочими совместимыми, этот преобразователь у Вас уже есть, надо только суметь им воспользоваться. В нашем случае он выполнен в виде отдельной микросхемы, установленной на плате.

Превращаем Arduino Uno в преобразователь USB-UART. Нам не потребуется писать никаких скетчей для этого. Будем использовать следующую схему подключения:
• +5V (Arduino Uno) – VCC (Bluetooth)
• GND (Arduino Uno) – GND (Bluetooth)
• TX (Arduino Uno) – TXD (Bluetooth)
• RX (Arduino Uno) – RXD (Bluetooth)
• +3.3V (Arduino Uno) – KEY (Bluetooth)

Обратите внимание!! В ДАННОМ случае мы подключаем контакт «Transmit Data» модуля Bluetooth к контакту «Transmit Data» платы Arduino Uno, а «Receive Data» к «Receive Data» соответственно. Почему? Потому что мы хотим, чтобы модуль Bluetooth общался именно с компьютером, а не с контроллером Arduino, то есть участвовал в разговоре вместо него. Остается «заткнуть» сам контроллер Arduino, чтобы он не вмешивался в «разговор» и не портил нам все. Делается это легко, надо лишь отправить Arduino в бесконечную перезагрузку. Для простоты берем кусочек ластика и приматываем его скотчем так, чтобы кнопка «Reset» на плате была все время нажата.

Подключаем провода, не забыв проверить, что проводок +3.3V воткнут на нужную глубину, касается контакта KEY и только него.

Безусловно, все ценители прекрасного вольны решить вопрос бесконечного ребута по-другому, подав логическую единицу на контакт «Reset» (я, чтобы не городить лишнего, при необходимости использую для этого проводок «папа-папа-мама»).

Каким бы путем Вы не прошли (преобразователь USB-UART или плата Arduino UNO в том же качестве), устройство собрано. Аккуратно подключаем к USB разъему компьютера. Через диспетчер устройств проверяем, что все в порядке, в системе появился соответствующий COM-порт, выясняем его номер. В моем случае это «USB-SERIAL CH340 (COM10)» для китайского клона Arduino либо «Silicon Labs CP2110x USB to UART Bridge (COM31)» для преобразователя USB-UART. Светодиод модуля HC-05 ведет себя следующим образом: две секунды горит, две секунды пауза. Это означает, что модуль находится в режиме AT-команд, и готов к общению на скорости 38400. Это важно. Если бы мы вначале подали питание, а лишь потом логическую единицу на контакт «Key», скорость модуля была бы иной, заданной его настройками, и светодиод мигал бы по-иному.

Подготовительные работы закончены, мы готовы к «прошивке» нашего HC-05. Вначале займемся slave-модулем. Запускаем Arduino IDE, открываем монитор последовательного порта («Инструменты», «Монитор порта»). Выбираем скорость 38400 бод и режим «NL & CR». Отправляем команду «AT» (без кавычек), модуль отвечает «OK». Все в порядке, можно продолжать. Нам нужно поменять скорость, PIN-код, имя, заодно узнать MAC-адрес. Далее приведен листинг сеанса связи. Запрашиваем интересующую нас информацию.

Безусловно, все ценители прекрасного вольны решить вопрос бесконечного ребута по-другому, подав логическую единицу на контакт «Reset» (я, чтобы не городить лишнего, при необходимости использую для этого проводок «папа-папа-мама»).

Каким бы путем Вы не прошли (преобразователь USB-UART или плата Arduino UNO в том же качестве), устройство собрано. Аккуратно подключаем к USB разъему компьютера. Через диспетчер устройств проверяем, что все в порядке, в системе появился соответствующий COM-порт, выясняем его номер. В моем случае это «USB-SERIAL CH340 (COM10)» для китайского клона Arduino либо «Silicon Labs CP2110x USB to UART Bridge (COM31)» для преобразователя USB-UART. Светодиод модуля HC-05 ведет себя следующим образом: две секунды горит, две секунды пауза. Это означает, что модуль находится в режиме AT-команд, и готов к общению на скорости 38400. Это важно. Если бы мы вначале подали питание, а лишь потом логическую единицу на контакт «Key», скорость модуля была бы иной, заданной его настройками, и светодиод мигал бы по-иному.

Подготовительные работы закончены, мы готовы к «прошивке» нашего HC-05. Вначале займемся slave-модулем. Запускаем Arduino IDE, открываем монитор последовательного порта («Инструменты», «Монитор порта»). Выбираем скорость 38400 бод и режим «NL & CR». Отправляем команду «AT» (без кавычек), модуль отвечает «OK». Все в порядке, можно продолжать. Нам нужно поменять скорость, PIN-код, имя, заодно узнать MAC-адрес. Далее приведен листинг сеанса связи. Запрашиваем интересующую нас информацию.
AT
OK
AT+ADDR?
+ADDR:14:3:5a694
OK
AT+NAME?
+NAME:HC-05
OK
AT+UART?
+UART:9600,0,0
OK
AT+PSWD?
+PSWD:1234
OK

Наши команды выделены синим, ответ модуля — зеленым. Само собой, у Вас будет иной MAC-адрес, запишите его. Меняем настройки. Мне удобнее использовать такое имя модуля, которое включает в себя MAC-адрес.
AT+NAME=HC05-14-3-5a694
OK
AT+UART=115200,0,0
OK
AT+PSWD=5555
OK

Чтобы убедиться, что все получилось, попробуйте выдернуть преобразователь из USB, подключить и заново запросить все сведения. Проверили, теперь можно отсоединять все провода. Полезно будет как-то пометить подготовленный модуль. Например, подклеить скотчем кусочек бумаги и записать прямо на нем всю нужную информацию.

Slave-модуль готов, им можно уже пользоваться. Однако мы пока не достигли главного, не настроили мaster-модуль. Чтобы продолжить, нам необходимо подключить питание к slave-модулю, чтобы он оказался доступен для поиска. Подсоединяем его к одной из плат Arduino, пока всего лишь к контактам +5V и GND, контакты RXD и TXD не задействуем. Плату запитываем от аккумуляторной батареи, сетевого адаптера или свободного USB разъема компьютера. После включения питания светодиод на HC-05 начинает часто мигать, модуль ожидает соединения.

Начинаем настраивать master-модуль. Подключаем его к преобразователю USB-UART, снова внимательно проверяем, что проводок +3.3V касается контакта «Key». Втыкаем в USB, видим, что светодиод модуля зажигается на две секунды с двухсекундными паузами. Открываем монитор последовательного порта и производим действия аналогичные тем, что только что проделывали со slave-модулем. PIN-код и скорость обмена должны быть те же самые, иначе соединения не добиться. Листинг приводить не буду, раз справились со slave-модулем, с master-модулем тоже не будет проблем. После этого делаем ресет, меняем роль и пытаемся образовать пару.
AT+RESET
OK
AT+ROLE=1
OK
AT+PAIR=14,3,5a694,5
ERROR:(16)

И, скорее всего, видим сообщение об ошибке. Первые три компонента команды AT+PAIR это три составляющих части MAC-адреса slave-модуля, с которым мы пытаемся соединиться. Не забудьте о том, что Вам необходимо использовать адрес своего собственного модуля.

Выполняем следующую магическую последовательность действий.
AT+INQM=0,5,5
OK
AT+INIT
OK
AT+INQ
+INQ:14:3:5A694,1F00,7FFF
+INQ:23:4D:EB3193,0,7FFF
OK

Некоторое время ждем, и… Ура! Bluetooth нашел какие-то устройства в сети, и мы видим адрес нашего slave-модуля! Продолжаем. Проверим имя и укажем, что надо всегда связываться именно с этим устройством и только лишь с ним.
AT+RNAME? 14,3,5a694
+RNAME:HC05-14-3-5a694
OK
AT+PAIR=14,3,5a694,5
OK
AT+BIND=14,3,5a694
OK
AT+CMODE=0
OK

Готово! Осталось проверить работоспособность созданной пары Bluetooth модулей. Отключим питание slave-устройства. Выдернем преобразователь USB-UART из компьютера, отсоединим провод «+3.3V - Key», больше мы в нем не нуждаемся. Master-модуль остается подключенным лишь четырьмя проводами к USB-UART, теперь это законченное устройство. Для удобства можно заменить проводочки на более короткие, скрепить изолентой.

Стоит вставить этот «брелок» в любой компьютер, и если slave-модуль имеет питание, соединение тут же будет установлено. Проверяем. Включаем питание. Модуль часто замигал, он готов к новому сеансу связи. Втыкаем «брелок». Пара секунд, и светодиодная индикация изменилась. Работает! Отключаем питание, немного ждем, включаем снова. Остается только порадоваться, как быстро восстанавливается соединение.

Обратите внимание, что компьютер вообще ничего не знает от существовании Bluetooth. Для него наш «брелок» - просто COM-порт. Соответственно, мы больше не нуждаемся ни в драйверах Bluetooth, ни в какой бы то ни было его настройке. И потраченное нами время с лихвой будет компенсировано во время занятий.

Стоит добавить, что slave-модуль по-прежнему допускает соединение с любого Bluetooth устройства. Мы сможем управлять робоплатформой и с компьютера, и с планшета, а теперь еще при помощи пульта дистанционного управления на базе Arduino. 

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

Download
Напоследок небольшой проект для двух Arduino контроллеров, демонстрирующий возможность двустороннего обмена данными, этакий Bluetooth пинг-понг
BluetoothPingPong.zip
Compressed Archive in ZIP Format 441 Bytes

Нам потребуется две платы Arduino (любых), два источника питания, пара сопряженных модулей HC-05, работающих на скорости 115200 (либо поменяйте ее в скетче), соединительные провода и две кнопки. Впрочем, без кнопок можно будет обойтись.

Загружаем скетч, представленный ниже, на обе платы Arduino. Обратите внимание, когда мы подключаем Arduino к компьютеру USB кабелем, Bluetooth модуль должен быть отключен, иначе он будет «вмешиваться в разговор» и вызовет сбой загрузки. Затем к каждой плате мы подключаем свой Bluetooth модуль. Какое устройство будет играть роль master, а какое slave, в данном случае все равно. Используем стандартную схему подключения:
• +5V (Arduino Uno) – VCC (Bluetooth)
• GND (Arduino Uno) – GND (Bluetooth)
• RX (Arduino Uno) – TXD (Bluetooth)
• TX (Arduino Uno) – RXD (Bluetooth)

К каждой плате потребуется подключить кнопку, которая при нажатии будет замыкать контакты GND и D12. Можно заменить кнопку двумя проводками. Коснулись одним проводом другого — имитировали нажатие. Состояние платы будет отображать встроенный светодиод. Если светодиод горит, надо нажать кнопку, «сделать пас» партнеру.

Код
void setup() {
  pinMode(13,OUTPUT);
  pinMode(12,INPUT_PULLUP);
  // Используем встроенный подтягивающий резистор
  Serial.begin(115200);
}
boolean myTurn=true;

void loop() {
  if (Serial.available()) {
    if (Serial.read()==int('@')) {
      myTurn=true;
    }
  }
  if (myTurn) {
    digitalWrite(13,HIGH);
    if (!digitalRead(12)) {
      Serial.print("@");
      digitalWrite(13,LOW);
      myTurn=false;
    }
  }
}



В следующих публикациях мы подробнее рассмотрим возможности использования Bluetooth для решения практических задач образовательной и спортивной робототехники.

В заключение хотелось бы выразить благодарность Леониду Захарову за то, что дал импульс к глобальному изучению данной темы и Юрию Винницкому за поддержку и целенаправляющие дружеские пинки.