Например TDA7294

РадиоКот > Схемы > Цифровые устройства > Примочки к ПК

Bluetooth по-китайски: теория и практика

Автор: Aheir
Опубликовано 03.05.2012.
Создано при помощи КотоРед.

Сегодня помучаем получившие уже достаточно широкое распространение Bluetooth модули HC-04. Думаю, не ошибусь, если скажу, что широкое распространение они получили благодаря нашим китайским друзьям, низкой цене и бесплатной доставке с Dealextreme)))

В простейшем случае модуль представляет собой Bluetooth-RS232 мост: какие байтики на вход послали, такие по радиоканалу и передались – фактически радиоудлинитель порта, все очень просто и легко интегрируется в существующие системы с RS232.

Вообще, у этих модулей достаточно много названий (по крайней мере, в продаже их можно найти под разными именами): HC-04, HC-05, BC04, BC05, BC06, RF-BT0417C, BT0417 и ряд других. Однако общей для все остается основа, а именно – микроконтроллер BC417143B от Cambridge Silicon Radio (CSR). Это решение называется BlueCore4, и все модули на его основе даже внешне очень похожи, поскольку основаны, видимо, на каком-то одном reference-design. Я пересмотрел достаточно много фотографий модулей, отличия минимальны: чуть другое расположение кварца и 1-2 пассивных компонентов, другой типоразмер какого-либо элемента – не более.

BC417143B сам по себе обладает достаточно богатым набором интерфейсов и возможностей:

 

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

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

 

Размеры – 27х13мм, питается железячка от 3,3В, потребляет в процессе установки соединения до 30мА и около 8мА в условиях стабильного коннекта. Поддерживает Bluetooth 2.0. Умеет работать в двух режимах: АТ-команд (для настройки и управления) и передачи данных (просто тупо отдает в эфир все, что получает по последовательному интерфейсу), переключение между режимами – аппаратное (в зависимости от состояния определенной ноги модуля. Скорость UART’a из стандартного ряда 1200 – 115200, настраивается АТ-командами (по умолчанию – 9600 8N1).

Назначение выводов следующее:

 

Или есть вот такая красивая картинка:

 

В простейшем случае для работы достаточно подключить питание и выводы Rx-Tx – все, можно связываться с устройством.

В режим AT-команд модуль переводится подтягиванием вывода PIO11 к питанию с последующим сбросом, в режиме передачи данных этот вывод заземлен или болтается в воздухе.

Собственно, «из коробки» этот модуль не умеет практически ничего, команды ограничены минимальным набором (все команды заканчиваются посылкой символов 0x0D и 0x0A):

AT – ответ ОК

AT+BAUDx, где (х = 1..8, что соответствует скорости 1200..115200) – установка скорости интерфейса, ответ – OKxxx, где xxx – установленная скорость

AT+NAMEname – установить имя модуля name, ответ – OKname

AT+PINxxxx – установить пин-код для соединения хххх, ответ – OKхххх

На этом все. Причем в данном виде модуль не может выступать в качестве инициатора соединения, мастера, он может быть только ведомым. Конечно, применение можно найти, но как-то оно скучно получается.

Варианты? Перепрошивка, что же еще… Но сначала сделаем несколько плат для удобства работы с модулем.

Вариант №1

Схема платы на рисунке:

 

Имеется линейный стабилизатор для питания модуля на 3,3В, все выводы подключены к штыревым разъемам, добавлено несколько статусных светодиодов (на момент изготовления платы я еще не знал, как оно будет работать по факту, поэтому постарался учесть все органы управления и индикации, которые видел на различных схемах включения модулей – отсюда такое изобилие на схеме).

В собранном виде оно выглядит так:

 

Уже после (забегая вперед) перепрошивки модуля была изготовлена плата по второму варианту:

 

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

 

На обратной стороне платы расположены цепи питания и внешнего сброса, все остальное – сверху.

Практически по этой же схемы был изготовлен вариант № 3:

 

Здесь вся суть в том, что данная плата предназначена для замены модулей MaxStream  Xbee и XbeePro (это ZigBee, их я иногда тоже использую) и совместима с ними по выводам:

 

Как потом оказалось, такие платки уже даже серийно выпускаются…

Теперь насчет перепрошивки модуля. Многие читатели, уверен, обратили внимание на то, что на всех платах я сохранил SPI-интерфейс модуля: именно через него и осуществляется прошивка. Нужно собрат несложный программатор на LPT-порт компьютера, практически 5 проводков для AVR:

 

По сути, это просто согласование уровней между 5В LPT и 3.3В модулем.

В сборе выглядит вот так:

 

Я установил ряд разъемов для удобства подключения. Для программирования на модуль требуется подать внешнее питание.

Все манипуляции производятся под управлением Casira BlueSuite или Casira BlueLab. Насколько я понимаю, это разработки непосредственно CSR, причем раньше они разрешали регистрироваться у себя на сайте, после чего можно было скачивать это программное обеспечение и всяческие примеры, готовые прошивки и т.п. решения для их продуктов. Однако на данный момент судя по всему это работать перестало (для России, по крайней мере, но если у кого получится – дайте знать). Однако многие вещи остались лежать в Сети, так что при некотором старании все ищется. BlueLab я раздобыл только недавно и еще не пробовал, но это целая среда для разработки собственных приложений плюс документация и примеры, так что при желании там есть, где развернуться. А вот после установки BlueSuite на компе появляется масса всяческих утилит, предназначенных для работы в том числе и с нашим пациентом. Поэтому цепляем модуль к программатору, программатор к компу, подаем питание на модуль, не забывая внимательно следить, чтобы земли были объединены… А то мало ли что;)

Непосредственно для прошивки предназначена Blue Flash:

 

После запуска выбираем способ подключения к модулю (LPT1) и указываем на файл прошивки. Как уже стало понятно, прошивать будем нечто под названием «HC-05».

После этого нажимаем «Stop Processor» (не волнуйтесь, это про модуль, а не про ваш любимый комп)), становятся активными остальные кнопки:

 

Я бы порекомендовал на всякий случай сохранить имеющуюся прошивку через «Dump», хотя это и не обязательно, в принципе… Ну а дальше жмем «Download» и через пару минут получаем совсем другое устройство. Конечно, можно еще «Verify» жмакнуть, чтоб убедиться, что все хорошо.

Теперь запускаем PSTool.

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

 

Открывается основное окно:

 

В левой части немеряно всяческих параметров, значения которых можно всячески изменять. Настроек реально очень много, так что простор для экспериментов имеется, я, честно говоря, особо не копался.

Стоит сразу изменить адрес устройства:

 

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

Теперь ради интереса можно запустить BlueTest3. Опять же, выбираем способ подключения:

 

И попадаем в основное окно:

 

Это некий набор тестов, которые выбираются из списка в левой верхней части окна. Модуль счастливо откликается на пинки, рапортует об успешном выполнении тестов, все это пишется в лог внизу окна, все довольны – вобщем, тоже можно повозиться и посмотреть осциллографом, что будет происходить в ходе различных тестах на выводах у модуля.

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

Один нюанс. На данный момент я перепрошил 4 модуля и после перепрошивки скорость последовательного интерфейса у них почему-то принимала случайное значение: у кого-то 9600, у другого – 115200. Причины явления мне не понятны, но после соответствующей настройки AT-командами все возвращается в нормальное русло. Да, в режиме команд скорость интерфейса – 38400.

Вобщем, собрали пару плат, научились устанавливать соединение, погоняли туда-сюда байтики по воздуху – вроде все работает, стабильно, дальность на воздухе метров до 20, бетонную стену пробивает, в пределах квартиры работает. Теперь хочется сделать что-то более-менее осмысленное.

У меня уже довольно давно была мысль сделать какую-нибудь систему синхронизации времени для нескольких домашних часов в разных помещениях (DS1307, конечно, достаточно точна сама по себе, да и другие микросхемы RTC тоже, но вот кварцы и прочие компоненты часов все же приводят к некоторому убеганию на уровне 10-15с/месяц: не критично, но неаккупратненько как-то). Это вполне себе реализуемо на таких модулях, так почему бы и нет? Итак, нам нужно установить по модулю в каждые часы, время на которых мы хотим изменять, а так же некий передатчик точного времени. В качестве такого передатчика вполне логично использовать компьютер с синхронизацией времени из Сети (конечно, не атомный эталон, ну дык ведь и не для точной промышленности стараемся в данном случае). В принципе, в качестве передатчика вполне подойдет какой-нибудь USB-донгл, но у меня такого не нашлось (да и кроме того хотелось лишний раз повозиться с новыми для меня STM32 и проверить некоторые другие решения), поэтому родилась такая вот схема:

 

Суть в чем: микроконтроллер STM32F100C4T6 одним своим UART смотрит через преобразователь интерфейсов в USB компа, а вторым – в Bluetooth-модуль. Кроме этого имеется кучка индикаторных светодиодов и несколько кнопок (не используются). Также имеется возможность принудительно сбрасывать модуль и переводить его в режим команд/данных – соответствующие выводы подключены к микроконтроллеру.

В качестве USB-RS232 преобразователя применена Atmega8 с софтовой реализацией USB. Честно говоря, не помню, откуда скатал это решение, но все исходники доступны в конце статьи (давно уже лежала на винте эта схема, все никак не доходили руки попробовать, как оно живет). Конечно, решение избыточно, но просто было интересно. Не обязательно использовать именно такой переходник, варианты рассмотрены здесь . Скорости обмена между компом, микроконтроллером и модулем равны и составляют 38400кбит/с. Вот чем мне нравятся STM-ки, так это гибкостью системы тактирования: я поставил кварц на 4.433619 МГц (купил по случаю 1000шт задешево, теперь вот использую)), частота тактирования ядра при этом 26.601714 МГц, но совершенно спокойно получаются любые стандартные скорости обмена по UART.

Все это дело упаковалось в пластиковый корпус BOX-KC01:

 

Печатная плата разрабатывалась непосредственно под него и в собранном виде выглядит как-то так:

 

USB разъем не устанавливал: miniUSB у меня маловато, а хвостов с USB-A папой на конце много и бесплатно – просто распаял на плату кабель длиной около метра.

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

 

После подключения устройства к компу обнаружится новое устройство и потребуется установка драйвера в виде inf-файла. После этого в системе появится новый виртуальный ком-порт, с которым можно работать стандартными средствами. Для определенности будем называть нашу коробочку контроллером.

Итак, контроллер тоже может работать в двух режимах – режиме команд и режиме передачи данных.

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

В этом режиме поддерживаются следующие команды (все в символах латиницы):

«с0» - переключение контроллера в режим данных, возвращает «Data Mode OK»

«с1» - сброс ВТ-модуля, возвращает «ВТ Reset OK»

«с2» - переключение ВТ-модуля в режим команд, возвращает «BT Command Mode OK»

«с3» - переключение ВТ-модуля в режим данных, возвращает «BT Data Mode OK»

«с4» - сброс настроек ВТ-модуля, возвращает «BT Reinit Completed»

«с5хххххххххххх» - установка нового адреса ведомого (хххххххххххх – сам адрес), возвращает «Setting New Bind Address Completed»

«с6» - состояние соединения в соответствии с состоянием статусного светодиода ВТ-модуля, возвращает «Connection Passed» или «Connection Failed»

«с9» - сброс контроллера, возвращает «MCU Reset...»

Вот скриншот общения с контроллером:

 

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

 

После этого ВТ-модуль устанавливает соединение с тем устройством, с которым он работал в последний раз перед выключением.

Светодиоды отображают прохождение данных по последовательному интерфейсу BT-модуля и соединению с ПК (Rx и Tx), состояние BT-модуля (Stat, см. даташит), состояние соединения (Conn) и состояние контроллера (Contr. Mode: мигает в режиме команд и повторяет Conn в режиме данных)

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

Непосредственно для синхронизации времени на часах была «написана» небольшая программка на HiAsm:

 

Все предельно просто: выбираем ком-порт, на котором висит контроллер, далее соединяемся с целевым устройством ( OrbitLED (пришлось поправить прошивку для работы по UART, см. соответствующую статью ) или GreenClock (один мой уже довольно старый проект, делается по мере наличия времени уже несколько лет, надеюсь, скоро все же выложу его на Радиокоте)) и либо нажимаем «Sync Time» для синхронизации, либо «Set Time» для установки любого другого времени и даты, настроенного в полях «Time and Date Setup».

Назначение кнопок в нижней части окна понятно из их названий. Часть из них вряд ли когда-то понадобится и использовалась исключительно для тестовых целей. Вообще конечно эту программу нужно переделать так, чтобы синхронизация происходила по расписанию в автоматическом режиме. Тогда, поместив ее в автозагрузку на домашнем сервере 24/7, можно полностью решить вопрос одинаковости показаний часов по всей квартире. Именно так я в ближайшее время поступить и собираюсь.

Вобщем и вцелом модули понравились, так что могу рекомендовать к применению. Весьма интересна возможность изменения Device Class модуля: можно прикидываться любым ВТ-устройством. Я ради эксперимента подключался в качестве гарнитуры к своему смартфону. А если разобраться с написанием собственных прошивок к модулю, то появятся просто широчайшие возможности. Но это, как водится, уже совсем другая история…

 


Файлы:
Исходники для контроллера, Keil
Даташит на модуль
Комплект плат для модулей P-CAD2006
Плата контроллера P-CAD2006
Наклейка на лицевую панель (Corel)
Прошивка HC04 для BT-модуля (дамп исходной)
Прошивка HC05
Проект HiAsm и программа ClockSync
USB-RS232 на Мега8 (AVR Studio)
27.gif


Все вопросы в Форум.


ID: 1217

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

145 3 3
3 4
Подробно