Bluetooth-модуль HC-05

Bluetooth-модуль HC-05

Bluetooth уже давно и прочно вошёл в нашу жизнь в качестве удобного протокола связи различных устройств: мобильных телефонов, ноутбуков, КПК, гарнитур, мышей, клавиатур… Список можно ещё долго продолжать. Обычно эту технологию интегрируют в свои продукты крупные производители электроники в виде малюсенькой микросхемы в корпусе BGA или QFN. А как быть нам, простому электронному люду, не владеющими тёмными силами создания 4-слойных плат и кунг-фу микромонтажа? Для этого есть
Bluetooth-модуль HC-05 от наших китайских собратьев.Этот модуль представляет собой плату размером 2.7×1.4 см, с 34 выводами с шагом 1.5 мм, расположенных по периметру платы, и имеет на одном из торцов антенну:

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

  • TX, RX, CTS, RTS — линии UART; CTS и RTS недоступны в данной прошивке
  • PCM_CLK, PCM_OUT, PCM_IN, PCM_SYNC — линии для приёма-передачи звука (недоступны)
  • AIO0, AIO1 — линии I/O общего назначения (недоступны)
  • RESET — линия сброса (активируется логическим нулём)
  • 3.3 V, GND — питание, земля
  • NC — не подсоединён (Not Connected)
  • USB_D+, USB_D- — линии данных USB (недоступны)
  • CSB, MOSI, MISO, CLK — линии SPI (CSB — это SS, Slave Select), используются для прошивки чипа
  • PIO0 — разрешение/запрет RX
  • PIO1 — разрешение/запрет TX
  • PIO2-PIO7, PIO10 — линии I/O общего назначения
  • PIO8 — для светодиода, показывающего состояние модуля: светодиод мигает с разной скоростью в зависимости от того, чем занят модуль — опросом Bluetooth-устройств, ожиданием или чем-то ещё
  • PIO9 — для светодиода, показывающего статус соединения: горит, если установлено соединение с другим Bluetooth-устройством
  • PIO11 — для управления режимом работы: по умолчанию режим простого удлинителя UART, а если подать на него логичскую 1 — режим AT-команд

Кстати, модуль питается от 3.3 В, но его линии I/O могут работать и с 5-вольтовой логикой, что позволяет подключать его UART к Arduino без заморочек.

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

На плате установлен стабилизатор на 3.3 В, так что можно запитать модуль стандартным для Arduino напряжением 5 В, подключив питание к выводу, обозначенному 5V. Принципиальная схема платы:

А вот ещё исходники в формате DipTrace: принципиальная схема и разведённая плата.

Итак, плата готова, приступим к работе с модулем. Ставим breakout в макетную плату и подключаем следующим образом:

  • 3.3v — к 3.3 В от Arduino
  • GND — к GND Arduino
  • RX — к TX Arduino
  • TX — к RX Arduino

Включаем Arduino с подключенным модулем. Если в вашем компьютере нет встроенного Bluetooth-контроллера, воспользуйтесь Bluetooth USB-донглом вроде этого:

Теперь займёмся программной частью. Для начала зальём в Arduino такой скетч:

Windows 7

Кликните правой кнопкой мыши на значке Bluetooth в трее:

В появившемся списке устройств выбираем наш модуль и жмём Далее:

В следующем окне выберите вариант ввода PIN-кода вручную:

Введите код «1234» и нажмите Далее:

Если авторизация пройдёт успешно, то вы увидите следующее окно:

Откройте список Bluetooth-устройств и зайдите в свойства модуля:

На вкладке «Службы» поставьте галочку напротив профиля последовательного порта и нажмите ОК:

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

Теперь вам понадобится программа-терминал с хорошей настраиваемостью. Неплохим вариантом будет лёгкая и бесплатная (даже для коммерческого использования) программа Termite. Установите её, запустите и нажмите Settings. В настройках поставьте:
Port — COM6 (ну или какой порт Windows назначила модулю у вас)
Baud rate — 38400
Transmitted text — Append nothing

Жмите OK и в главном окне программы Disconnected — click to connect:

Всё — можно слать символы:

Модуль должен зажигать светодиод L в ответ на символ ‘1’, тушить на ‘0’ и мигать им на ‘*’ c частотой примерно два раза в секунду. При вводе любых других символов светодиод должен около секунды мигать с большей частотой.

Ubuntu Linux 11.04

Запустите bluetooth-wizard и нажмите «Вперёд»:

В следующем окне дождитесь нахождения вашего модуля и нажмите кнопку «Параметры PIN»:

Выберите PIN-код 1234 и закройте окно:

В окне со списком устройств Жмите «Вперёд», и если будут ошибки, повторите операцию с PIN-кодом. В случае успеха вы увидите такое окно:

Запустите сканирование доступных Bluetooth-устройств:

H-C-2010-06-01 — это имя нашего устройства (может быть также «HC-05»). Создаём устройство для работы по протоколу RFCOMM:

Всё, теперь можно обмениваться данными через виртуальный COM-порт /dev/rfcomm0. Можно прямо в консоли:

Также можно воспользоваться замечательной программой cutecom: в поле Device введите /dev/rfcomm0, в списке Baud rate поставьте скорость 38400, внизу окна в списке выберите вариант No line end. Теперь жмите Open device и шлите через поле Input символы:

Модуль должен зажигать светодиод L в ответ на символ ‘1’, тушить на ‘0’ и мигать им на ‘*’.

AT-команды

Чтобы задействовать такие функции модуля, как опрос «соседних» Bluetooth-устройств, установку другой скорости UART и прочие, необходимо использовать AT-команды, описанные в этом datasheet. Сразу предупреждаю: этот даташит очень китайский — многие вещи просто не описаны, для некоторых команд не описано даже их поведение, оформление кривое, куча ошибок из-за невнимательного copy&paste. Но другие даташиты на этот модуль ещё хуже }:[=]

Все команды имеют вид AT+КОМАНДА, AT+КОМАНДА? или AT+КОМАНДА=ПАРАМЕТРЫ и должны оканчиваться комбинацией CR+LF (символы с кодами 0x0D и 0x0A, ‘\r’ и ‘\n’). Примеры команд:

AT+NAME? — спросить у модуля его имя
AT+ROLE=1 — задать роль master
AT+INQ — запустить опрос соседних Bluetooth-устройств

Отвечает модуль так:

  • В случае успеха:
    +КОМАНДА: ОТВЕТ
    OK
    Строки, начинающейся с ‘+’, может и не быть, если команда не должна ничего возвращать. Например, на команду AT+NAME? модуль ответит так:
    +NAME:H-C-2010-06-1
    OK
    а на команду AT (тест) просто:
    OK
  • В случае ошибки:
    FAIL
    или
    ERROR:(КОД ОШИБКИ)Самый первый код ошибки 0 значит, что формат команды неверен — на команду AT+ЖАХНИ, к примеру, модуль ответит:
    ERROR:(0)Кстати, зацените грустный смайл 🙁 в этом ответе.Многие команды имеют как форму запроса, так и форму установки параметра. Опять же, команда AT+NAME? возвращает имя модуля, тогда какAT+NAME=ИМЯ его устанавливает.Для того, чтобы модуль мог принимать AT-команды, нужно его перевести в соответствующий режим — для этого нужно установить вывод PIO11 в логическую 1 (подтянув к питанию, например). После этого соединяйтесь с модулем, используя Arduino в качестве переходника USB-UART, аккуратно вытащив из него микроконтроллер (не сломайте ножки МК!)
    Выставьте в терминалке конец строки CR+LF и попробуйте скормить модулю пару команд. Выглядеть это должно примерно так:Всего команд 36, описаны они все в даташите. Заданные командами настройки модуль сохраняет в своей flash-памяти, так что после его можно использовать без повторной настройки.

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

    И напоследок: возможность перепрошивки HC-05 в HC-06:

  • Все знают эти bluetooth модули. Так как схема включения не сложная, по быстренькому подключил модуль к переходнику USBUART.

    image

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

    После недолгих поисков, оказалось, что у этой платки есть несколько прошивок. Итак:

    • Версии HC-04 и HC-06 отвечают на 9600. При этом, разделителем служит таймаут. Да, да, вам нужно очень-очень быстро написать AT (при этом, без никаких /r/n) и через таймаут, модуль ответит OK.
    • Версия HC-05 отвечает на скорости 38400, при этом нужно передавать AT\r\n. Но, кроме того, нужно подтянуть вывод “mode” к питанию – это переводит модуль в командный режим.

    У меня оказался модуль HC-06, и я подумал, что проблемы с зависанием связаны с этим. Для перепрошивки модуля, кустарно собрал программатор:programmator

    Питание взял от того-же переходника (в ft232r есть стабилизатор на 3.3 вольта). Я немного упростил ту схему, что гуляет в интернетах. Вот, что получилось:

    sch

    Подключать нужно 1:1, то есть MOSI к SP_MOSI, итп.

    Дальше я нашел компьютер с LPT портом и установил BlueLab. Скачать его можно вот тут, правда придется зарегистрироваться.

    После установки голуболаба, нужно прописать путь к нему.

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

    Сам процесс прошивки прост до безобразия – возьмите вот этот архив:

    И запустите update.bat, он

    • Считает калибровочные данные из модуля
    • Запишет новую прошивку
    • Запишет калибровочные данные

    Модуль перепрошился отлично и начал отвечать на команды HC-05, но проблема с терминалом не исчезла. Как оказалось, во всем виноват сам терминал. Я использовал терминал bray’а. Я не знаю, что он там делает при инициализации, но при попытке отослать любой символ в порт, он наглухо вис.

    Я взял другой терминал – termite и… все заработало. Получается, я зря перепрошивал модуль – новые AT команды мне не нужны. Возможно, вам пригодится.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

wp-puzzle.com logo