В предыдущей статье на нашем сайте мы рассмотрели основы последовательной связи в микроконтроллерах PIC, а в данной статье мы рассмотрим подключение к микроконтроллеру PIC Bluetooth модуля HC-06, что позволяет сделать проекты на основе данных микроконтроллеров беспроводными. Если вы начинающий в освоении микроконтроллеров PIC, то также рекомендуем прочитать статью про начало работы с ними, установку в них битов конфигурации и мигание светодиодом с их помощью.
Bluetooth модуль HC-06, который мы будем использовать в данном проекте, является простым и популярным устройством, которое позволит передавать данные с нашего микроконтроллера PIC на мобильное приложение или компьютер по беспроводному каналу связи. Связь между микроконтроллером PIC и Bluetooth модулем HC-06 будет осуществляться с помощью модуля USART (модуль универсального синхронно-асинхронного приемопередатчика), присутствующего в микроконтроллере. Вместо модуля HC-06 в данном проекте можно также использовать модуль HC-05. Как и в предыдущем проекте здесь мы также будем использовать асинхронный 8-битный режим работы последовательного порта, но здесь мы модифицируем код программы таким образом, чтобы можно было осуществлять обмен данными с Bluetooth модулем.
В данном проекте мы будем управлять включением/выключением светодиода, подключенного к микроконтроллеру PIC, с помощью команд со смартфона. Для этого мы будем использовать Android приложение Bluetooth Terminal, которое может передавать и принимать данные по Bluetooth. Если с помощью приложения мы будем передавать символ ‘1’, то светодиод будет включаться, а если ‘0’ – выключаться.
Структурная схема работы проекта показана на следующем рисунке.
Ранее на нашем сайте мы рассматривали подключение Bluetooth модуля HC-05 (HC-06) к следующим микроконтроллерам (платам):
- к микроконтроллеру AVR;
- к плате Arduino;
- к плате Raspberry Pi Pico;
- к NodeMCU ESP8266;
- к плате STM32 Blue Pill.
Также на нашем сайте вы можете посмотреть все проекты с использованием Bluetooth.
Необходимые компоненты
Аппаратное обеспечение
- Микроконтроллер PIC16F877A (купить на AliExpress).
- Держатель микросхем на 40 контактов (купить на AliExpress).
- Программатор PICkit 3 (купить на AliExpress).
- Кварцевый генератор 20 МГц (купить на AliExpress).
- Конденсаторы 33 пФ – 2 шт. (купить на AliExpress).
- Bluetooth модуль HC-05 или HC-06 (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Перфорированная плата.
- Соединительные провода.
- Смартфон на Android.
Программное обеспечение
- MPLABX.
- Bluetooth Terminal (мобильное приложение).
Bluetooth модуль HC-05
Данный модуль может функционировать в двух режимах: режим команд и режим данных. В режиме команд мы можем настраивать различные свойства Bluetooth соединения: имя, пароль, скорость передачи и т.д. Режим данных позволяет осуществлять обмен данными между модулем и микроконтроллером. Мы в данном проекте будем использовать только режим данных, свойства Bluetooth соединения будем использовать те, которые установлены в модуле по умолчанию. Имя устройства может быть HC-05 или HC-06 (в использованном нами модуле), пароль может быть 0000 или 1234, по умолчанию скорость передачи обычно выставлена 9600 бод/с.
Вешний вид обеих сторон Bluetooth модуля HC-05 показан на следующем рисунке.
HC-05 является Bluetooth модулем с последовательной связью. Его можно настроить с помощью AT команд. Он может работать в различных конфигурациях: Master (ведущий), Slave (ведомый), Loop back). В нашем проекте он будет использоваться в качестве ведомого устройства.
Технические характеристики Bluetooth модуля HC-05:
- типовая чувствительность: -80dBm;
- скорость передачи данных: 9600 бод, 8 бит данных, 1 стоповый бит, нет бита четности;
- pin код для автоматического соединения: “1234” или “0000”;
- 6 контактов;
- контакты Vcc и Gnd используются для подачи питания на модуль;
- контакты Tx и Rx используются для взаимодействия с микроконтроллером;
- контакт Enable для активации модуля, когда на нем low – модуль деактивирован (отключен);
- контакт State работает как индикатор состояния модуля. Когда модуль не соединен с другим Bluetooth устройством, светодиод мигает постоянно. Когда он соединен с другим Bluetooth модулем – светодиод мигает с постоянной задержкой 2 секунды.
Режимы индикации светодиода модуля:
- светодиод красного цвета на модуле показывает состояние Bluetooth модуля HC-05;
- когда модуль не подключен ни к какому устройству светодиод мигает непрерывно;
- когда модуль подключен к какому либо устройству светодиод мигает с некоторой задержкой.
Bluetooth модуль HC-06 работает от напряжения 5V, а его сигнальные контакты работают от напряжения 3.3V (в составе модуля есть встроенный регулятор напряжения на 3.3V). 6 контактов модуля мы будем использовать в режиме данных (Operating mode). Схема соединений модуля с микроконтроллером PIC приведена в следующей таблице.
№ п/п | Контакт модуля HC-06 | Наименование контакта PIC | Номер контакта PIC |
1 | Vcc | Vdd | 31 |
2 | Vcc | Gnd | 32 |
3 | Tx | RC6/Tx/CK | 25 |
4 | Rx | RC7/Rx/DT | 26 |
5 | State | NC | NC |
6 | EN (Enable) | NC | NC |
Теперь перейдем к программированию работы модуля.
Программирование микроконтроллера PIC для связи по Bluetooth
Первым делом нам необходимо инициализировать наш Bluetooth модуль. Его инициализация очень похожа на инициализацию модуля UART, но есть и некоторые изменения.
Инициализация Bluetooth
Почти все Bluetooth модули, доступные на рынке, работают с бодовой скоростью 9600 бод, поэтому точно такую же скорость нам необходимо установить для последовательного порта нашего микроконтроллера. Поскольку мы будем использовать кварцевый генератор на 20 МГц, то для установки скорости 9600 бод нам необходимо записать в регистр SPBRG значение 129 (SPBRG=129). Также обязательно установить в «l» бит BRGH чтобы задействовать высокие скорости передачи данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//******Initialize Bluetooth using USART********// void Initialize_Bluetooth() { //Set the pins of RX and TX// TRISC6=1; TRISC7=1; //Set the baud rate using the look up table in datasheet(pg114)// BRGH=1; //Always use high speed baud rate with Bluetooth else it wont work SPBRG =129; //Turn on Asyc. Serial Port// SYNC=0; SPEN=1; //Set 8-bit reception and transmission RX9=0; TX9=0; //Enable transmission and reception// TXEN=1; CREN=1; //Enable global and ph. interrupts// GIE = 1; PEIE= 1; //Enable interrupts for Tx. and Rx.// RCIE=1; TXIE=1; } //___________BT initialized_____________// |
Если ваш Bluetooth модуль работает на скорости, отличной от 9600, то значение регистра SPBRG вам необходимо установить исходя из следующей таблицы.
Загрузка данных в Bluetooth
В нашей программе для передачи и приема данных по Bluetooth мы запрограммируем три функции. Bluetooth модуль содержит в своем составе передающий и приемный буферы. Данные, которые принимает модуль, сохраняются в его буфере Tx. Данные не будут передаваться по беспроводному каналу связи (по воздуху) до тех пор пока на модуль не будет подан символ возврат каретки (carriage return). То есть, чтобы передать данные "по воздуху", нам необходимо записать их в буфер Rx модуля, а затем подать на модуль символ возврата каретки. Для этого мы используем разработанные для нашей программы функции.
Следующая функция позволяет записать один символ в буфер Rx модуля. Мы загружаем этот символ в регистр TXREG и ждем пока он не обработается проверяя в цикле флаги TXIF и TRMT.
1 2 3 4 5 6 7 8 |
//Function to load the Bluetooth Rx. buffer with one char.// void BT_load_char(char byte) { TXREG = byte; while(!TXIF); while(!TRMT); } //End of function// |
Следующая функция используется для загрузки строки в буфер Rx Bluetooth модуля. Строка разделяется на символы и каждый символ по очереди записывается в буфер с помощью функции BT_load_char().
1 2 3 4 5 6 7 |
//Function to Load Bluetooth Rx. buffer with string// void BT_load_string(char* string) { while(*string) BT_load_char(*string++); } //End of function/ |
Передача данных по Bluetooth
Пока мы только передали данные в буфер Rx модуля HC-06. Теперь нам необходимо передать их по беспроводному каналу связи (по воздуху) с помощью следующей функции.
1 2 3 4 5 6 7 |
//Function to broadcast data from RX. buffer// void broadcast_BT() { TXREG = 13; __delay_ms(500); } //End of function// |
В этой функции мы записываем в регистр TXREG значение 13, а это и есть десятичное представление символа возврата каретки в ASCII кодах. Также используется небольшая задержка перед передачей.
Считывание данных из Bluetooth
По аналогии с модулем UART запрограммируем функцию для считывания данных из Bluetooth.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//Function to get a char from Rx.buffer of BT// char BT_get_char(void) { if(OERR) // check for over run error { CREN = 0; CREN = 1; //Reset CREN } if(RCIF==1) //if the user has sent a char return the char (ASCII value) { while(!RCIF); return RCREG; } else //if user has sent no message return 0 return 0; } //End of function/ |
Если пользователь будет передавать нам данные, то эта функция будет их считывать. Результат, возвращаемый функцией, можно сохранить затем в отдельной переменной. Если пользователь ничего не передает, то функция будет возвращать 0.
Основная функция программы
В основной функции нашей программы мы вначале передадим пользователю приветственное сообщение и затем будем ждать команд от пользователя, в соответствии с которыми мы будем включать или выключать светодиод, подключенный к контакту RB3 микроконтроллера PIC.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
void main(void) { //Scope variable declarations// int get_value; //End of variable declaration// //I/O Declarations// TRISB3=0; //End of I/O declaration// Initialize_Bluetooth(); //lets get our bluetooth ready for action //Show some introductory message once on power up// BT_load_string("Bluetooth Initialized and Ready"); broadcast_BT(); BT_load_string("Press 1 to turn ON LED"); broadcast_BT(); BT_load_string("Press 0 to turn OFF LED"); broadcast_BT(); //End of message// while(1) //The infinite lop { get_value = BT_get_char(); //Read the char. received via BT //If we receive a '0'// if (get_value=='0') { RB3=0; BT_load_string("LED turned OFF"); broadcast_BT(); } //If we receive a '1'// if (get_value=='1') { RB3=1; BT_load_string("LED turned ON"); broadcast_BT(); } } } |
Полный код программы приведен в конце данной статьи.
Схема проекта
Схема подключения Bluetooth модуля HC-06 к микроконтроллеру PIC представлена на следующем рисунке.
Как видите, схема довольно проста. Необходимо всего лишь подать питание на Bluetooth модуль и соединить его контакт Tx с контактом 26 микроконтроллера, а контакт Rx – с контактом 25 микроконтроллера.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Тестирование работы проекта
Скачайте приложение Bluetooth Terminal из PlayMarket и установите его на свой смартфон. Подайте питание на собранную схему проекта – маленький светодиод на Bluetooth модуле при этом должен начать мигать, что свидетельствует о том, что на модуль подано питание и он находится в активном поиске соединения.
Включите Bluetooth на своем смартфоне, при этом в списке обнаруженных устройств вы должны увидеть HC-05 или HC-06. Попытайтесь установить с ним соединение – для этого необходимо будет ввести пароль. Введите пароль 1234 (в некоторых случаях он может быть 0000) и нажмите на OK как показано на следующем рисунке.
После того как соединение будет установлено, откройте приложение Bluetooth Terminal. Зайдите в его настройки и выберите в них пункт “Connect a device – Secure” как показано на рисунке ниже. После откроется всплывающее окно со списком подключенных устройств. Выберите среди них модуль HC-05 (HC-06).
После установления соединения светодиод на Bluetooth модуле, который до этого мигал, теперь должен гореть непрерывно. После этого мы в приложении Bluetooth Terminal должны получить приветственное сообщение от нашего микроконтроллера PIC.
После этого если вы введете в приложении ‘1’, то светодиод в схеме проекта загорится, а если ‘0’ – светодиод погаснет. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
// CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT enabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) //End of CONFIG registers #define _XTAL_FREQ 20000000 #include<xc.h> //******Initialize Bluetooth using USART********// void Initialize_Bluetooth() { //Set the pins of RX and TX// TRISC6=1; TRISC7=1; //устанавливаем бодовую скорость передачи в соответствии с таблицей на стр. 44 даташита// BRGH=1; //всегда используйте высокие скорости передачи при работе с Bluetooth, иначе он не будет работать SPBRG =129; //включаем асинхронный последовательный порт// SYNC=0; SPEN=1; // устанавливаем для него 8-битный режим работы RX9=0; TX9=0; // разрешаем передачу и прием// TXEN=1; CREN=1; // разрешаем глобальные прерывания и прерывания от периферийных устройств// GIE = 1; PEIE= 1; // разрешение прерываний для Tx и Rx// RCIE=1; TXIE=1; } //___________BT initialized_____________// //функция для загрузки в буфер Rx Bluetooth модуля одного символа// void BT_load_char(char byte) { TXREG = byte; while(!TXIF); while(!TRMT); } //End of function// // функция для загрузки в буфер Rx Bluetooth модуля строки символов // void BT_load_string(char* string) { while(*string) BT_load_char(*string++); } //End of function// //Function to broadcast data from RX. Buffer (передача данных по воздуху)// void broadcast_BT() { TXREG = 13; __delay_ms(500); } //End of function// //функция для считывания символа из буфера Rx Bluetooth модуля // char BT_get_char(void) { if(OERR) // check for over run error { CREN = 0; CREN = 1; //Reset CREN } if(RCIF==1) //if the user has sent a char return the char (ASCII value) { while(!RCIF); return RCREG; } else //если пользователь ничего не передал возвращаем 0 return 0; } //End of function/ void main(void) { //Scope variable declarations// int get_value; //End of variable declaration// //I/O Declarations// TRISB3=0; //End of I/O declaration// Initialize_Bluetooth(); //lets get our bluetooth ready for action //передаем приветственное сообщение при подаче питания на схему проекта// BT_load_string("Bluetooth Initialized and Ready"); broadcast_BT(); BT_load_string("Press 1 to turn ON LED"); broadcast_BT(); BT_load_string("Press 0 to turn OFF LED"); broadcast_BT(); //End of message// while(1) //бесконечный цикл { get_value = BT_get_char(); //Read the char. received via BT //если мы принимаем '0'// if (get_value=='0') { RB3=0; BT_load_string("LED turned OFF"); broadcast_BT(); } //если мы принимаем '1'// if (get_value=='1') { RB3=1; BT_load_string("LED turned ON"); broadcast_BT(); } } } |