уже давно и прочно вошёл в нашу жизнь в качестве удобного протокола связи различных устройств: мобильных телефонов, ноутбуков, КПК, гарнитур, мышей, клавиатур… Список можно ещё долго продолжать. Обычно эту технологию интегрируют в свои продукты крупные производители электроники в виде малюсенькой микросхемы в корпусе BGA или QFN. А как быть нам, простому электронному люду, не владеющими тёмными силами создания 4-слойных плат и кунг-фу микромонтажа? Для этого есть
от наших китайских собратьев.
Этот модуль представляет собой плату размером 2.7x1.4 см, с 34 выводами с шагом 1.5 мм, расположенных по периметру платы, и имеет на одном из торцов антенну:
На плате расположен чип BC417 от компании Cambridge Silicon Radio, который обеспечивает аппаратную поддержку стека Bluetooth 2.0+EDR (Enhaced Data Rate), а также флэш-память ES29LV800DB-70WGI от Excel Semiconductor на 8 Мбит (1 МБ), хранящая прошивку и настройки.
С оригинальной китайской прошивкой модуль умеет работать в двух режимах: простого «радиоудлинителя » и управления AT-командами. В первом случае всё предельно просто — включаешь модуль, подключаешься к нему с компа или иного устройства, умеющего делать COM-порт по Bluetooth, и шлёшь в этот порт данные. Во втором режиме можно управлять модулем посредством AT-команд вида «AT+КОМАНДА» — например, команда «AT+NAME?» позволяет узнать имя модуля, но об этом позже.
Для того, чтобы подключить модуль, проясним назначение выводов:
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 В, так что можно запитать модуль стандартным для напряжением 5 В, подключив питание к выводу, обозначенному 5V. Принципиальная схема платы:
А вот ещё исходники в формате DipTrace: и .
Итак, плата готова, приступим к работе с модулем. Ставим breakout в макетную плату и подключаем следующим образом:
3.3v — к 3.3 В от Arduino
GND — к GND Arduino
RX — к TX Arduino
TX — к RX Arduino
Включаем Arduino с подключенным модулем. Если в вашем компьютере нет встроенного Bluetooth-контроллера, воспользуйтесь Bluetooth USB-донглом вроде этого:
Теперь займёмся программной частью. Для начала зальём в Arduino такой скетч:
enum { LED_PIN = 13 };
enum LedState { LED_ON, LED_OFF, LED_BLINK };
LedState led_state;
void setup()
{
led_state = LED_OFF;
pinMode(LED_PIN, OUTPUT);
Serial.begin(38400);
}
void loop()
{
if (Serial.available())
{
char command = Serial.read();
switch (command)
{
case '1': led_state = LED_ON; break;
case '0': led_state = LED_OFF; break;
case '*': led_state = LED_BLINK; break;
default:
{
for (int i = 0; i < 5; ++i)
{
digitalWrite(LED_PIN, HIGH);
delay(50);
digitalWrite(LED_PIN, LOW);
delay(50);
}
}
}
}
switch (led_state)
{
case LED_ON: digitalWrite(LED_PIN, HIGH); break;
case LED_OFF: digitalWrite(LED_PIN, LOW); break;
case LED_BLINK:
{
static unsigned long start_millis = 0;
if (millis() - start_millis >= 300)
{
start_millis = millis();
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}
}
}
}
Windows 7
Кликните правой кнопкой мыши на значке Bluetooth в трее:
В появившемся списке устройств выбираем наш модуль и жмём Далее:
В следующем окне выберите вариант ввода PIN-кода вручную:
Введите код «1234» и нажмите Далее:
Если авторизация пройдёт успешно, то вы увидите следующее окно:
Откройте список Bluetooth-устройств и зайдите в свойства модуля:
На вкладке «Службы» поставьте галочку напротив профиля последовательного порта и нажмите ОК:
Windows установит нужный драйвер и покажет облачко с соответствующим сообщением и названием порта:
Теперь вам понадобится программа-терминал с хорошей настраиваемостью. Неплохим вариантом будет лёгкая и бесплатная (даже для коммерческого использования) программа . Установите её, запустите и нажмите 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-кодом. В случае успеха вы увидите такое окно:
H-C-2010-06-01 — это имя нашего устройства (может быть также «HC-05»). Создаём устройство для работы по протоколу RFCOMM:
$ sudo rfcomm bind /dev/rfcomm0 00:11:04:29:02:55
Всё, теперь можно обмениваться данными через виртуальный COM-порт /dev/rfcomm0. Можно прямо в консоли:
$ stty -F /dev/rfcomm0 38400 # устанавливаем скорость порта
$ echo -n '1' > /dev/rfcomm0 # пишем туда символ '1', без символов перевода строки
Также можно воспользоваться замечательной программой cutecom: в поле Device введите /dev/rfcomm0, в списке Baud rate поставьте скорость 38400, внизу окна в списке выберите вариант No line end. Теперь жмите Open device и шлите через поле Input символы:
Модуль должен зажигать светодиод L в ответ на символ '1', тушить на '0' и мигать им на '*'.
AT-команды
Чтобы задействовать такие функции модуля, как опрос «соседних» Bluetooth-устройств, установку другой скорости UART и прочие, необходимо использовать AT-команды, описанные в этом . Сразу предупреждаю: этот даташит очень китайский — многие вещи просто не описаны, для некоторых команд не описано даже их поведение, оформление кривое, куча ошибок из-за невнимательного 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, которую можно скачать в или клонировать с на GitHub. В библиотеке я реализовал все функции модуля, документация по библиотеке лежит в директории doc.
И напоследок: возможность перепрошивки аналогичного модуля обсуждали , ну и в сообществе easyelectronics есть небольшая .
но реализовать стабильную работу пока не получилось. Может есть у кого готовый рабочий пример поиска bluetooth устройства и подключения к нему как к RFCOMM на J2ME?
PuTTY — отличная программа, но, как по мне, она лучше для SSH, да и настраивать Termite оказалось куда проще.
За ссылки спасибо, они очень пригодятся, когда захочу порулить Bluetooth-девайсом с мобилы, ибо Java я знаю на уровне «это как C++, только проще, надёжнее и с батарейками».
Насчёт стабильной работы, кстати — то ли у меня руки кривые, то ли это технология такая, то ли драйвера и софт… Но чтоб этот синий зуб завёлся с первого раза и без гемора — такого у меня не было (:
Могу добавить мини-faq «как сделать первое приложение для мобилы с Java (J2ME)» на примере простейшего приложения скачивающего и отображающего содержимое веб странички.
1. Скачать/установить Java Platform (JDK) ;
2. Скачать/установить Java ME SDK ;
(рекомендую ставить эти пакеты на виртуальную машину, т.к. они сильно оч засоряют систему)
(+ есть какие-то проблемы с эмулятором на XP SP3 и WIN7; рекомендую XP SP2)
3. Запустить среду разработки Java ME SDK;
4. Создать новый проект File->New Project -> MIDP Application -> [x] Create Hello MIDLet -> Finish;
5. Скопировать этот (~70 строчек кода) и скомпилировать его через F6;
Должен запуститься эмулятор с приложением, а в папке dist проекта должны появиться файлы MobileApplication1.jad и MobileApplication1.jar, которые можно закачать на мобилку и запустить их оттуда.
Для работы с Bluetooth нужно примерно строчек 5-10 написать, вся инфа вроде есть в ссылках выше, но без самого модуля и тестирования трудно сделать все без ошибок.
Если кто сделает приложение для связи с Arduino, буду очень признателен помощи или исходнику, пишите на webaff.ru@gmail точка com.
Но почему вы пишете об этом здесь, в теме о Bluetooth-модуле, если есть форум? (вверху страницы )
К тому же, уведомление о новом комментарии в этой теме получил, наверное, только я.
В общем, ошибка говорит о том, что Arduino не подключена или avrdude не может подключиться к плате по иным причинам. Впрочем, я не телепат, так что проверьте ваш USB-шнур (шнуры от всяких дешёвых китаедевайсов часто глючат), а уж если точно дело не в шнуре, пишите на форум в подходящий раздел, указав:
— Модель платы (Arduino Uno/Mega/или_что_у_вас_там)
— Версию IDE (0022 или недавно вышедшая 1.0)
Ну и загляните в пункт меню Tools→Serial port и посмотрите, какие там есть COM-порты. Обычно, если это первая Arduino, когда-либо подключеная к компу, то у неё имя порта будет COM3.
Извиняюсь за глупый вопрос (сегодня прям день какой-то: почувствуй себя неумехой..), для управления модулем AT-командами нужно: PIO11 соединить с питанием (3.3), RX модуля к TX Arduino, TX модуля к RX Arduino, из платы ардуино вынуть мк (чтобы плата стало просто uart-usd-переходником), подключить usb-кабель, в настройках терминала выставить скорость на которой работал модуль и завершение строки CR+LF. Так ведь?
А то не отвечает модуль на команды, и не могу понять почему…
Я не очень понял, как это у вас ничего не работает, если вы уже выяснили, что скорость 9600. Как у вас это получилось, в таком случае? (:
У меня только два предположения: либо не подключена GND, либо скорость выставлена неверно. Имейте ввиду, что скорость в режиме удлинителя и в режиме AT-команд может отличаться.
Дак то скорость выяснил просто перебором, в режиме удлинителя uart.
Уже разобрался — at-команды заработали (день вчера такой видать был). По невнимательности не туда подключался: craftduino в режиме переходника usb-uart rx/tx нужно было подключать uart-разъему… =))
Подскажите а как передавать данные с HC-05. На приём все работает, передавать не хочет. В setup написал: Serial.begin(9600). В loop: Serial.print(«text»); delay(3000). RX модуля соеденил с TX ардуино, TX с RX соответственно. Ни в какую не передает через модуль. Отображает только в SerialMonitor'e среды разработки ардуины.
Если работает на приём — значит, у вас есть другой модуль, передающий что-то первому, я правильно понимаю? Объясните, пожалуйста, внятно и подробно суть проблемы, и, желательно, с приведением фотки модулей, подключенных к Arduino.
А почему бы и нет? В виндовый комп ставишь USB Bluetooth-донгл, через который коннектишся к HC-05. В системе появляется виртуальный COM-порт, а по нему уже гоняешь данные, какие хочешь. На принимающей стороне должны быть МК, HC-05, SD/MicroSD-карта, и должен быть написан код для обмена данными по UART с компом, с библиотеками для работы по SPI с картой и для работы с файловой системой FAT32 на карте. Про SD я ещё и .
Должен признаться, что библиотека не настолько полезна, насколько я себе представлял — иной раз проще напрямую AT-командами воспользоваться. Но пример я , к использованию модуля в режиме master (инициатор подключения).
Столкнулся с проблемой — не получаю ответов на AT команды от модуля.
Модуль: ,
насколько я понимаю аналогичен Вашему.
Подключаюсь следующим образом:
1. Вытаскиваю МК.
2. Подключаю BT модуль: питание, Rx и Tx на 1 и 0 вывод Arduino (Freedruino).
3. Подвожу POI11 на +5В
Подключаю ардуину к компьютеру по USB — открываю Serial Monitor (Termite.exe), конец строки LR+LF
и пробую разные скорости.
Ответов не получаю.
Вот здесь:
предлагают не вынимать МК из ардуины, а залить на нее прошивку USB UART моста и подключать Rx, Tx
BT к 8 и 9 портам ардуины соответственно.
Пробовал так — нет ответов.
Если можно — через skype обсудить (skype:wyfinger)
Если я правильно понимаю то Вы подключаете Rx модуля к Rx ардуины, а надо Rx модуля к Tx ардуины. Плюс ко всему модуль у Вас не HC-05 а HC-04 или HC-06, это следует из описания по Вашей ссылке: 3) Found name called «LINVOR» device. У меня самого таких 2 и 1 HC-05. А так как это HC-04 то у него и скорость 9600 и команды без СR+LF. хорошо написано. Если что, пишите здесь, свяжемся по скайпу.
Да нет, я подключаю как нужно: Rx вывод BT на 1 (Tx) ногу Ардуино и Tx вывод BT на 0 ногу Ардуино.
В режиме UART удлинителя все работает. Скорость 9600.
Пытался найти режим AT команд на разных скоростях и с разным завершением строки — безрезультатно.
Буду экспериментировать в субботу (нет времени, много работы), пока собираю идеи и решения.
Ошибочка вышла, у меня нано и Rx и Tx отличаются от обычных, у меня тоже была проблема с АТ командами, мешал Blue Soleil, решил переустановкой системы без него.
Подскажите пожалуйста столкнулся с проблемой. Получилось настроить модуль и все работает как в написано в статье, но только если питание подается через USB подключаю блок питания и модуль ни как не реагирует. В чем может быть проблема?
Я даже поясню: в примере в статье, что очевидно, стабилизатор не используется (он для запитки от больших, чем 3.3 В, напряжений), он просто размещён на плате для удобства.
Подключил все правильно на команды AT приходит ответ но вот при попытке установления новых параметров возвращает ошибку.
Т.е пишу AT->OK, AT+NAME->+NAME:HC-05, AT+NAME=MyBT->ERROR:(2)или AT+ORGL->ERROR:(2). В datasheeе сказано PSKEY write error. Пробовал ставить изменять окончания CR+LF не помогает, указывать параметры в кавычках, через ":", но один фиг при попытке изменить какойнибуть параметр ERROR:(2).
Вместо RB-BTHC ваше название соответственно.
Без всяких дополнительных симоволов. Если проблему в итоге нельзя будет решить, тогда мы произведём замену.
У нас модули из этой партии работают — мы на их основе делаем платы.
Доброго времени суток!
Кто-нибудь пробовал ставить нестандартную (например 10400 кбит/с) скорость порта RS232 на блютуз модуле? Такая возможность есть?
Комментарии (47)
RSS свернуть / развернутьЯ жду похожий модуль для связи Arduino и обычного мобильного телефона через J2ME приложение.
Из ссылок нагуглил подробные статьи
www.mobilab.ru/articles/63/
www.mobilab.ru/articles/64/
www.mobilab.ru/articles/65/
но реализовать стабильную работу пока не получилось. Может есть у кого готовый рабочий пример поиска bluetooth устройства и подключения к нему как к RFCOMM на J2ME?
webaff
За ссылки спасибо, они очень пригодятся, когда захочу порулить Bluetooth-девайсом с мобилы, ибо Java я знаю на уровне «это как C++, только проще, надёжнее и с батарейками».
Насчёт стабильной работы, кстати — то ли у меня руки кривые, то ли это технология такая, то ли драйвера и софт… Но чтоб этот синий зуб завёлся с первого раза и без гемора — такого у меня не было (:
burjui
1. Скачать/установить Java Platform (JDK) ;
2. Скачать/установить Java ME SDK ;
(рекомендую ставить эти пакеты на виртуальную машину, т.к. они сильно оч засоряют систему)
(+ есть какие-то проблемы с эмулятором на XP SP3 и WIN7; рекомендую XP SP2)
3. Запустить среду разработки Java ME SDK;
4. Создать новый проект File->New Project -> MIDP Application -> [x] Create Hello MIDLet -> Finish;
5. Скопировать этот (~70 строчек кода) и скомпилировать его через F6;
Должен запуститься эмулятор с приложением, а в папке dist проекта должны появиться файлы MobileApplication1.jad и MobileApplication1.jar, которые можно закачать на мобилку и запустить их оттуда.
Для работы с Bluetooth нужно примерно строчек 5-10 написать, вся инфа вроде есть в ссылках выше, но без самого модуля и тестирования трудно сделать все без ошибок.
Если кто сделает приложение для связи с Arduino, буду очень признателен помощи или исходнику, пишите на webaff.ru@gmail точка com.
webaff
karabaralex
burjui
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x00
Когда пытаюсь залить скетч, вылезает эта сообщенька, ругает меня. В программировании ардуины я полный ноль, где искать ошибку — не знаю. Подскажите :(
VanillaRatty
К тому же, уведомление о новом комментарии в этой теме получил, наверное, только я.
В общем, ошибка говорит о том, что Arduino не подключена или avrdude не может подключиться к плате по иным причинам. Впрочем, я не телепат, так что проверьте ваш USB-шнур (шнуры от всяких дешёвых китаедевайсов часто глючат), а уж если точно дело не в шнуре, пишите на форум в подходящий раздел, указав:
— Модель платы (Arduino Uno/Mega/или_что_у_вас_там)
— Версию IDE (0022 или недавно вышедшая 1.0)
Ну и загляните в пункт меню Tools→Serial port и посмотрите, какие там есть COM-порты. Обычно, если это первая Arduino, когда-либо подключеная к компу, то у неё имя порта будет COM3.
burjui
blackhand999
Zoltberg
Видать не на всех модулях по-дефолту установлены 38400, на модуле который мне пришел оказалось 9600.
nick0x01
burjui
А то не отвечает модуль на команды, и не могу понять почему…
nick0x01
У меня только два предположения: либо не подключена GND, либо скорость выставлена неверно. Имейте ввиду, что скорость в режиме удлинителя и в режиме AT-команд может отличаться.
burjui
Уже разобрался — at-команды заработали (день вчера такой видать был). По невнимательности не туда подключался: craftduino в режиме переходника usb-uart rx/tx нужно было подключать uart-разъему… =))
nick0x01
Krio
burjui
Krio
Krio
burjui
Sergey
burjui
Модуль: ,
насколько я понимаю аналогичен Вашему.
Подключаюсь следующим образом:
1. Вытаскиваю МК.
2. Подключаю BT модуль: питание, Rx и Tx на 1 и 0 вывод Arduino (Freedruino).
3. Подвожу POI11 на +5В
Подключаю ардуину к компьютеру по USB — открываю Serial Monitor (Termite.exe), конец строки LR+LF
и пробую разные скорости.
Ответов не получаю.
Вот здесь:
предлагают не вынимать МК из ардуины, а залить на нее прошивку USB UART моста и подключать Rx, Tx
BT к 8 и 9 портам ардуины соответственно.
Пробовал так — нет ответов.
Если можно — через skype обсудить (skype:wyfinger)
wyfinger
Sergey
В режиме UART удлинителя все работает. Скорость 9600.
Пытался найти режим AT команд на разных скоростях и с разным завершением строки — безрезультатно.
Буду экспериментировать в субботу (нет времени, много работы), пока собираю идеи и решения.
wyfinger
Sergey
Zoltberg
Sergey
Sergey
slavak
burjui
slavak
vworld
Там какие-то необычные 3.3 В, что ли? (:
burjui
vworld
burjui
burjui
пожелание — увидеть в магазине готовую сборку…
vworld
DES
burjui
DES
Т.е пишу AT->OK, AT+NAME->+NAME:HC-05, AT+NAME=MyBT->ERROR:(2)или AT+ORGL->ERROR:(2). В datasheeе сказано PSKEY write error. Пробовал ставить изменять окончания CR+LF не помогает, указывать параметры в кавычках, через ":", но один фиг при попытке изменить какойнибуть параметр ERROR:(2).
pofigist
burjui
pofigist
Попробуйте записать так:
UARTSend(«AT+NAMERB-BTHC\r\n», 17);
Lockdog
Без всяких дополнительных симоволов. Если проблему в итоге нельзя будет решить, тогда мы произведём замену.
У нас модули из этой партии работают — мы на их основе делаем платы.
Lockdog
Кто-нибудь пробовал ставить нестандартную (например 10400 кбит/с) скорость порта RS232 на блютуз модуле? Такая возможность есть?
GbInok
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.