Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

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

UPDATE: 29.11.15
Многие читатели спрашивали про подключение Bluetooth устройств. Я много шарюсь по сайтам с электроникой и довольно часто видел заметки про модули HC-05. К сожалению в нашей деревне нет ни одного магазина, куда можно просто придти и купить его. Есть вариант заказать у китайцев, но не люблю ждать и связываться с Почтой Росии. Были и другие модули, но подходящей задачи не было, поэтому не хотелось разбираться в чем их отличие. Тема в общем то не горела, поэтому лениво поглядывал иногда, в итоге случайно на витрине зацепил Bluetooth to Serial модуль. Сомнений не было, надо брать.

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

Начнем с общих сведений, на текущий момент во всех современных устройствах используется Bluetooth 4.0. Он может быть «классическим» и «низкопотребляющим»(LE). То что ваше устройство поддерживает BT4.0, не говорит о том, что оно поддерживает BT4.0LE. Если один из девайсов поддерживает только классический, а второй только низкопотребляющий, то они будут не совместимы. Кроме того, могут быть софтовые проблемы с отсутствием поддержки низкопотребляющего режима. Тем не менее, сейчас распространены модули с DualMode, которые могут работать в обоих режимах.

На практике, в наличии было 2 телефона, 1 ноут, 1 донгл(усб флешка) с BT4.0 на борту. Все прекрасно видели девайсину, которая поддерживает только BT4.0LE. При этом совместимость ранних версий сохранена, ибо труба с BT2.0, видит трубу с блютузом 4 и наоборот.

Что еще нужно знать. Существует 2 варианта:
— брать пустой голый чип, например CC2540, докупать программатор, искать на сайте производителя примеры или писать полностью свое программное обеспечение, разводить печатку с обвязкой.
— брать модуль содержащий стек и профили, обвязку (антенну), например тот же HC-05.

Думаю ни у кого нет сомнений, что второй вариант больше подходит радиолюбителям. Достаточно подключить питание и у вас… например беспроводной последовательный (COM) порт. Передавать данные через который можно как по обычному UART.

Почему последовательный порт? Потому что это наиболее простой способ передачи данных. Для этого вам нужно просто кидать байты в уарт, никаких библиотек и прочего гемора. Но не все так просто, ваш модуль может не уметь работать как COM порт. Все зависит от того, какие профили реализованы внутри модуля/микросхемы. Если модуль не поддерживает профиль SPP(serial port protocol), то у вас не будет интерфейса куда подключиться. Причем оба соединяющихся девайса должны поддерживать SPP. Это значит, что нельзя взять рандомную bt гарнитуру, которая поддерживает профиль передачи звука A2DP и ожидать от нее последовательного порта. Я очень надеюсь, что у меня дойдут руки разобраться во всех хитросплетениях других профилей.

Итак, считаем что нам пока достаточно ком порта, ищите модуль который поддерживает этот профиль. Как уже было сказано выше, самый распространенный вариант это HC-05 или ему подобный, но имейте в виду HC не одинаковые. Мой шилд назывался Bluetooth Bee V2.0+EDR 3Mbps Modulation.
ble_bee

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

Подключил модуль он радостно замигал, поискал его телефоном, компом, он не нашелся. В моем понимании он должен был сразу быть доступен и после подключения стать Com портом, ну или хотя бы по какому нить уровню на GPIO. Ну думаю беда, говно подсунули. Пришлось открывать даташит и читать))) Оказалось что проверить модуль можно AT командами, т.е. просто подключаешься по UART к нему и шлешь нужные байты, но чтобы я не слал он отвечал ERROR. Пришлось внимательно читать даташит. Оказалось что начало посылки начинать должно обязательно с 0x0D 0x0A, а затем уже нужные команды. В итоге завелся.

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

Выбор быть мастером или слейвом
\r\n+STWMOD=0\r\n слейв
\r\n+STWMOD=1\r\n мастер

Честно говоря работа в режиме мастера меня не сильно интересовала, ибо конечная задача подключиться либо к компику, либо к мобилке.

Можно настроить скорость, по дефолту для моего модуля 38400, для вашего она может быть другой, гуглите
\r\n+STBD=115200\r\n Переключить на 115200
Поддерживаемые скорости: 9600, 19200,38400,57600,115200,230400,460800.

Обнаружение
\r\n+INQ=1\r\n Включено
\r\n+INQ=0\r\n Выключено

Авто подключение к последнему спаренному устройству
\r\n+STAUTO=0\r\n Запрещено
\r\n+STAUTO=1\r\n Разрешено

Разрешить спаренному устройству подключение. Если разрешить то достаточно 1 раз спарить устройства.
\r\n+STOAUT=0\r\n Запретить
\r\n+STOAUT=1\r\n Разрешить

Авто подключение когда мастер в доступном радиусе, слейв подключается автоматом в течение 30 минут
\r\n+LOSSRECONN=0\r\n Запретить
\r\n+LOSSRECONN=1\r\n Разрешить

Установка имени устройства
\r\n+STNA=MyModule\r\n

Установка пин кода
\r\n+RTPIN=0000\r\n

Прочитать адрес устройства
\r\n+RTADDR\r\n

Проверка статуса
\r\n+BTSTA:xx\r\n
xx status:
0 — Инициализация
1 — Готов
2 — Обнаружение включено
3 — Соединение
4 — Соединен

После каждой правильной команды модуль отвечает OK и возвращает статус. Пример ответа модуля.
bluetooth_term

Исходники. Даже не знаю что написать… например printf(«\r\n+STNA=MyModule\r\n»). В целом работа с модулем примитивна: врубаем модуль, шлем по команду на обнаружение:
\r\n+INQ=1\r\n

Ищем трубой или компом, спариваемся 🙂 Вводим пин. Усе. На компе появляется новый Com порт. К нему цепляемся и только после этого(!) мы подключены. Когда подключились по ком порту, модуль из режима AT команд переходит в режим виртуального COM порта, т.е. чтобы мы ему не слали, он будет гнать по юарту, даже ат команды.

Про цифры. Токопотребление измерялось так: включил последовательно пину VCC мультиметр, измерения по постоянному току. Когда модуль был уже спарен, но данные не передавались модуль жрал 3-5 мА. В моменты передачи данных 35-40мА.

По поводу скорости, я не заметил каких то тормозов, все работает так, как с обычным Com портом, наблюдались потери байтов порядка 10%, при объемах передачи более 100кБ, детально пока не разбирался, но есть подозрения, что проблема не модуле. Для работы с мобилки есть куча приложений, например Bluetooth Terminal, я тестил — работает, просто ищешь модуль, подключаешься, кидаешь байты. Хотите — пишите свое приложение для мобилки. Как? Да хз, видел что есть исходники, но пока задач разобраться не стоит, а особого интереса к андроиду не питаю.

Теперь перейдем к low energy, который как обещанно должен работать от батарейки годами — «работа от батарейки в течение года возможна при не более 5 посылках за день». Отрыто из даташитов Bluegiga: максимально за раз можно передать не более 20 байт, после каждой передачи нужно подождать не менее 2 секунд.

Наконец то мне попал в руки HC-08, так что инфа проверена.
hc-08

Увы для него оказалось справедливо все тоже самое, что и для модуля Bluegiga, похоже что это отличительная черта всех BLE устройств — низкая скорость, маленький объем передаваемых данных = низкое энергопотребление. Все что превышает размер 20байт, не отсылается/»обрезается»/тупо теряется. После отсылки нужно выжидать таймаут, зависящий от скорости передачи. Однако токопотребление порадовало, измерения проводились также мультиметром по входу модуля, стабильно 9мА в режиме слейва. Также отличительная особенность в том, что модуль доступен постоянно, его не нужно переводить АТ командами в режим обнаружения.

Думаю общее представление о технологии понять можно. Будет ли продолжение темы пока не понятно. Надеюсь да.

22 комментария: Подключение Bluetooth модуля

  • Подскажи уважаемый как ты подружил hc-08 и телефон? В моём случае телефон видит его в списке но при нажатии согласования тупит некоторое время и выдаёт невозможно подключить неверный пароль или пин код. При этом пароль не установлен на модуле. На ат команды реагирует адекватно. Помоги советом что делать?

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

  • Блин! Вот именно ат команды на установку или смену пароля на этом модуле нет. Ладно спасибо что подсказал. Буду копать.

  • насколько я знаю у этих модулей пароль обязателен. проверьте с другим девайсом. может проблема конкретного телефона

  • Добрый день! Не могли ли бы вы мне подсказать как подружить bluetooth module HC-06 с датчиком DS18B20; Так чтобы датчик по bluetooth пересылал температуру на программу на пк или на Android. Хочу написать програмку для ATmega8 на Codevision которая бы принимала данные с датчика и пересылала на выход UART где там сигнал пересылался бы по bluetooth модулю.
    Так как ниже по ссылке. только на Code Vision
    https://www.14core.com/wiring-the-ds18s20-1-wire-temperature-sensor-with-hc06-on-android-with-microcontroller/

  • возьмите урок с температурным датчиком, для работы с BT не нужно ничего, он как «удлинитель» уарта. Просто кидайте значение температуры в UART и все.

  • Добрый вечер! Делаю как ниже так в терминале выводятся запятые «,» что я не так делаю ?


    #include
    #include

    // 1 Wire Bus functions port PB2
    #asm
    .equ __w1_port=0x18 ;PORTB
    .equ __w1_bit=2
    #endasm

    #include
    #include
    #include

    float temper;

    void main(void)
    {
    // initsializatsia UART
    UCSRA=0x00;
    UCSRB=0x08;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;
    // initsializatsia UART

    w1_init();
    ds18b20_init(0,-20,50,DS18B20_12BIT_RES);

    while(1)
    {
    temper=ds18b20_temperature(0);

    UDR=temper; // port PD0(RXD) PD1(TXD)

    delay_ms(1500);
    };
    }

  • вместо UDR=temper;
    пишите printf("temperature = %f\r\n", temper);
    и проверьте чтобы скорости уарта на модуле и на микроконтроллере совпадали

  • Так выводит на терминал «temperature=» каждые 1500мс.
    А где тут вообще UART;

  • Не на терминал, а в поток. Если используется codevision, то там по умолчанию поток выводится в уарт.

  • Что значит в поток? Это шина данных микроконтроллера откуда передается сигнал ко всем комплектующим (в том числе UART) ?

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

  • А скажите пожалуйста по идее должно же выводиться на терминал в протеусе все то что записывается в переменной temper?

  • да

  • Так у меня выводятся буквы ААААААА

  • значит что то не так)

  • Добрый вечер! После недели раздумываний и эксперементов я наконецто дошел до истины 😀
    Я просто пытался переменную float впихнуть в функцию printf() с параметрами integer.
    А какой функцией преобразовать float в integer?
    И еще одно функция выводит 2 вещи.. 1) строку «temperature =» 2) переменную

    Например printf(«temperature = %f\r\n», temper); выведит temperature= и значение переменной temper.
    Можно ли посылать толко переменную?
    Мне нужно чтобы программа которая читает с com порта принимала правильно значение температуры и отображала график.

  • надо понять что ждет программа которая читает компорт, если она ждет 4 байта float то это один разговор

  • И еще один вопросик если не сложно 🙂 может ли блутус модуль HC06 передать принятую информацию с uart например на комютер через блутус ? Или он только принимает?

  • может

  • А почему я на STM32 включал Printf то не работала передача данных .А включил sprintf заработало?

  • printf передает данные в «поток», на что настроен поток в микроконтроллере, это не регламентируется, на что настроите туда и будет выводить. для этого нужно переопределить функцию putc

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

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

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика