- Лоботрясы

Поиск
Перейти к контенту

Главное меню:

Датчики и модули

Читать в Яндекс.Подписках



    Мучаем Bluetooth-модули. Часть 3 - Практический пример с HC-05.
Просмотров: 36512
     Итак, даже несмотря на то, что сегодня второй день Нового года, я немного выбьюсь из общего числа праздно лежащей лицом в салате публики и таки закончу своё повествование о Bluetooth-модулях. Модули, имеющиеся у меня в наличии, были успешно опознаны как HC-05. Изначально, не зная этого, но однозначно приписывая их к одному из модулей серии HC-03...HC-06 я сделал небольшую (а точнее - две) платку-переходник, которую можно использовать как для работы с HC-04/HC-06, так и HC-03/HC-05. Эта универсальность выражается только в том, что сигнальные светодиоды и согласующая цепочка вывода KEY были предусмотрены для обоих случаев распиновки Bluetooth-модулей. Как я уже упоминал в 1-й части, вопрос перепрошивки модулей (например, HC-06 в HC-05) я изначально не рассматривал, почему и родились такие вот платы-переходники:
     Первая плата заточена под питание 3,3 Вольта, а вторая - 5,5 Вольт (имеет линейный стабилизатор напряжения AMS1117 на 3,3 В):
 
 
     А теперь, собственно, их схемы:
 
 
 
 
     Т.к. данные печатные платы-переходники предназначены как для модулей HC-04/HC-06, так и HC-03/HC-05, немного отличающихся распиновкой, то на печатных платах предусмотрены небольшие участки, которые при ненадобности их для данной версии Bluetooth-модуля легко перерезаются ножом (или скальпелем - у кого какие пристрастия...). На схеме эти участки показаны линией небольшой ширины (на печатной плате их увидеть тоже не проблема :-). Для того чтобы знать что резать, опять отсылаю к 1-й части! Хотя, скорее всего, и без хирургического вмешательства модуль будет функционировать нормально, но на всякий пожарный...
     Печатные платы сделаны в Proteus и представлены ниже для скачивания
     Теперь пройдусь немного по настройке Bluetooth-модуля. Хотя данной информации в интернете хоть ешь одним местом, таки решил поделиться своим небольшим опытом в энтом деле, т.к. из-за кривой работы парочки попавшихся мне терминальных программ я уже было подумал о неисправности своего модуля.
     Как вы уже поняли, для настройки Bluetooth-модуля путём ввода в него АТ-команд нам понадобится программа-терминал (в качестве оной я рекомендую вам программу Termite - надёжная и лёгкая в настройке) и переходник USB-UART (в существование физического COM-порта сейчас верят только уфологи :-)
     Рисунок главного окна терминальной программы приводить не буду - скачаете и увидите сами, а вот приведу фото она настроек, вызываемое нажатием меню Settings.
     Если у вас Bluetooth-модуль HC-04/HC-06, то не забудьте в настройках поставить галочку напротив Append nothing, чтобы после ввода АТ-команды не передавать никакого окончания. А настройки, приведённые на рисунке, соответствуют модулям HC-03/HC-05, один из которых я и истязаю...
     Далее, ориентируясь на список AT-команд из 1-й части описаия Bluetooth-модулей, вы можете установить своё имя и пароль на модуль, да и вообще, побаловаться с настройками. Только не забудьте при подключении модуля к переходнику USB-UART подать на вывод KEY сигнал высокого напряжения (лог. "1" т.е.), чтобы модуль перешёл в режим АТ-команд (скорость UART в этом случае - 38400 (8N1)). Главное, по умолчанию модули HC-03 и HC-05 уже настроены на режим Slave, что необходимо для дальнейшего примера работы с ними. А как подключить USB-UART к модулю bluetooth, я думаю вы догадаетесь :-)
     Также в сети интернет мне попалась довольно полезная программка, позволяющая настроить конфигурацию bluetooth модулей HC-03/HC-04/HC-05/HC-06 без применения терминальных программ - скачать её и почитать особенности работы с ней можно здесь. Внешний вид данной программки:     
     Теперь подробнее о примере работы с Bluetooth-модулем HC-03/HC-05. Поиграться с высокими технологиями я решил на микроконтроллере ATmega32 своей оладочной платы, благо, я этот микроконтроллер знаю как облупленного (правда, в дальнейшем буду создавать рабочий проект на STM32, по мере изучения всех нюансов его работы...). Смысл тестовой программы такой: со своего любимого смартфона (естественно, на Android) я подключаюсь к Bluetooth-модулю, вхожу в скачанную через Play Маркет программу Bluetooth Terminal (там их несколько на выбор), нахожу в ней свой модуль и печатаю кодовую комбинацию символов (ключевое слово, а можно и просто символы - всё по вашему хотению и щучьему велению). И если набранное "слово" совпадает с записанными в программе микроконтроллера эталонными ключевыми фразами, то микроконтроллер выполняет определённое заданное действие - чего то там включает, выключает или отправляет вам на смартфон какое-то сообщение. Схему подключения bluetooth-модуля к своей отладочной плате я приводить не буду, т.к. дело совсем не в ней, а в программе, а вот в дебрях исходного кода, который прилагается в архиве ниже, я думаю, вы найдёте интересующие вас порты ввода-вывода...
     Пример работы с модулем HC-05 создан в среде CodeVisionAVR (на IAR не перейду уже никогда, даже не просите!). В целом, программа очень проста и представляет собой две основные части: модуль (программный, естественно) работы с интерфейсом UART и основная программа, в цикле которой происходит чтение принятых через Bluetooth-модуль сообщений и выполнение определённых (заданных пользователем) операций. Код работы с интерфейсом UART оформлен в виде отдельной библиотеки, и при необходимости может быть легко изменён под любой AVR-овский микроконтроллер. Работа с UART организована через два кольцевых буфера (FIFO) - принятых и передаваемых данных. Данная библиотека полностью не моя, т.к. большинство рабочих функций и  вышеназванные кольцевые буферы были сгенерированы автоматически при использовании функции CodeWizardAVR при генерации данного проекта. Однако я внёс в этот код свои небольшие изменения, полностью переориентировав его на работу с Bluetooth-модулем. Также в файле uart.c данной библиотеки уже присутствуют функции обработки прерываний по приёму и по окончании передачи очередного символа через UART.
     Отправляемая по Bluetooth через программу-терминал вашего смартфона строка обязательно должна иметь окончание '\n' (оно же -  LF, или 0Ah в шестнадцатеричном представлении - символ перевода строки), по наличию которого программа на микроконтроллере определяет поступление команды, и начинает её сравнивать с эталонными (задаваемыми пользователем) строками. Неважно, имеет ли отправляемая через смартфон строка окончание CRLF или LF; выбрать тип конечного символа при отправке строки можно в настройках терминальной программы (пример с весёлыми картинками будет внизу).
     
     Заголовочный файл uart.h в самом его начале имеет следующие настройки, которые доморощенный программист может поменять в своих целях:
#define Fck     16000000L // Частота кварца
long BAUD = 9600; // По умолчанию скорость - 9600 бит/с

#define RX_BUFFER_SIZE 24 //Размерность приёмного буфера
#define TX_BUFFER_SIZE 8 //Размерность передающего буфера

     Данный файл также описывает следующие макросы и прототипы функций, доступные уже в файле uart.c.    
//===============================================================
//                                          Сброс флага принятия строки
//===============================================================
#define USART_reset_string_flag()      (res_recieve=0)
//===============================================================
//                                            Очистка приёмного буфера
//===============================================================
#define USART_reset_rx_counter()      (rx_counter=rx_wr_index=rx_rd_index=0); (rx_buffer_overflow=0)

//===============================================================
//                                                Инициализация UART
//===============================================================
void USART_Init(void);
//===============================================================
//                               Получить символ с приёмного буфера USART
//===============================================================
char USART_getchar(void);
//===============================================================
//                                   Проверка приёма строки через USART
//===============================================================
char USART_check_string(void);
//===============================================================
//                             Запись символа в передаточный буфер USART
//===============================================================
void USART_putchar(char c);
//===============================================================
//                                  Функция отправки RAM-строки по USART
//===============================================================
void USART_puts (char *str);
//===============================================================
//                                 Функция отправки FLASH-строки по USART
//===============================================================
void USART_putsf(flash char *str); 
     И - основная программа, проверяющая принятую комбинацию символов. При совпадении принятой микроконтроллером строки с одной из эталонных, микроконтроллер отправит через bluetooth-модуль сообщение - "OK!", а в моём примере ещё и подтвердит это событие выводом на LCD-дисплей названия принятой команды. В программе предусмотрена защита от переполнения приёмного буфера UART, которая, в случае возникновения сего прискорбного факта, очистит приёмный буфер и отправит на смартфон ругательное сообщение "Buffer Overflow!". Также, я на всякий случай предусмотрел ситуацию, при которой приём команд, отправляемых пользователем, происходит быстрее их обработки (считывания), что, в принципе, при небольших скоростях обмена данными по UART и высокой частоте работы микроконтроллера очччень маловероятно.
#include <mega32.h>
#include <string.h>
#include <delay.h>
#include <stdlib.h>
#include "uart.h"
#include "hd44780.h"

// Эталонные сообщения, с которыми будут сравниваться поступающие по Bluetooth (через UART) команды!
flash char str1[]="key1";
flash char str2[]="key2";

char data_buffer[RX_BUFFER_SIZE]; //Рабочий буфер
char data; //Переменная для сохранения прочитанного их кольцевого буфера байта
char count; //Счётчик записываемых в рабочий буфер символов
char res; //Переменная для сохранения очередного прочитанного символа с UART

//***************************************************************
//                   Функция очистки приёмного буфера
//***************************************************************
void buffer_clear (char *str, char size)
{
     char i;
     for(i=0; i<size; i++)
     {
          *str++=0;
     }
}
//***************************************************************

void main(void)
{
     USART_Init(); //Инициализация UART
     LCD_init (); //Инициализация LCD 20х4

     #asm("sei")

     while (1)
     {
          res=USART_check_string(); //Проверка приёма строки
          if(res==1)
          {
               while ((data=USART_getchar())!=0x0A) //Читаю символы с приёмного буфера, пока не встречу конец строки 0x0A
               {
                    if(data!='\r') //Если есть символ CR, то пропускаем его
                    {
                         data_buffer[count++]=data;
                    }
               }
               data_buffer[count]=0;//Конец строки
               count=0;
               USART_reset_string_flag(); //Сброс флага поступления строки
          }
          if((res>=2)||rx_buffer_overflow) //Приём данных (строк) происходит быстрее их обработки (считывания)
          {
               if(res>=2)     USART_putsf("Data Overflow!");
               if(rx_buffer_overflow)     USART_putsf("Buffer Overflow!");
               USART_reset_rx_counter(); //Очистка приёмного буфера
               USART_reset_string_flag(); //Сброс флага приёма строки
          }
          if(res==1) //Если команда совпадает, выполняем определённое действие
          {
               if(!strcmpf(data_buffer, str1))     { LCD_gotoxy(2, 0); LCD_putsf("KEY1");  USART_putsf("OK!");} ;
               if(!strcmpf(data_buffer, str2))     { LCD_gotoxy(2, 0); LCD_putsf("KEY2");  USART_putsf("OK!");};
          }
          buffer_clear     (data_buffer, sizeof(data_buffer));
     };
}
     Как вы уже догадались, данная программа не является полностью законченным проектом работы с Bluetooth-модулями, но может быть использована в качестве базы для приёма и проверки управляющих команд (строк), что, в принципе, мной и ставилось как цель всего этого баловства.
     И - фотографии в подтверждение работоспособности приведённого кода. Первые три фото - это подключение к своему проекту в железе посредством программы Bluetooth Terminal; меню настроек, где нас интересует позиция NewLine Code (send) и пример отправленной команды (key1) с полученным одобрением от микроконтроллера :-) Фото с позиций контраста и цветопередачи получились немного печальными - мои дикие извинения (а переделывать неохота - пиво уже греется!), и из-за этого на третьем фото не виден главный нюанс - для того, чтобы команда была отправлена с символом конца строки, обязательно в конце команды нужно нажать кнопочку Enter!!! Конечно, такая работа с терминальной программой не есть красивое и идеальное решение, поэтому в будущем или мотивирую одного своего знакомого создать мне удобную программу с набором необходимых кнопочек на Android, либо же сам попытаюсь сварганить нечто подобное с помощью App Inventor.
     Подопытные:
      Всё, пошёл пить пиво :-)
     
     Мучаем Bluetooth-модули. Часть 1 - HC-03, HC-04, HC-05, HC-06 
 
 
Назад к содержимому | Назад к главному меню