Всего на сайте:
282 тыс. 988 статей

Главная | Электроника

Просмотров: 4378  Просмотрен 5

Итак, даже несмотря на то, что сегодня второй день Нового года, я немного выбьюсь из общего числа праздно лежащей лицом в салате публики и таки закончу своё повествование о 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.

Подопытные:

Всё, пошёл пить пиво :-)

http://lobotryasy.net/learning_bluetooth_part_1.php

 

Предыдущая статья:Мучаем Bluetooth-модули. Часть 2 - HC-07, HC-08, HC-09. Следующая статья:How the industrial Revolution did.. and did not.. change the English.
page speed (0.012 sec, direct)