Подключение Bluetooth-модуля HC-05 к микроконтроллеру AVR ATmega8

В этой статье мы рассмотрим подключение Bluetooth-модуля HC-05 к микроконтроллеру ATmega8 (семейство AVR), а затем установим связь между смартфоном под управлением операционной системы Android и микроконтроллером ATmega8 с помощью Bluetooth-модуля, который будет использовать для связи с микроконтроллером универсальный асинхронный приемопередатчик (UART). Для контроля за успешностью процесса взаимосвязи будем использовать светодиод.

Подключение Bluetooth-модуля HC-05 к микроконтроллеру AVR ATmega8: внешний вид

Необходимые компоненты

Аппаратное обеспечение

Микроконтроллер ATmega8
Источник питания с напряжением 5 Вольт
Программатор AVR-ISP, USBASP или другой подобный
Bluetooth-модуль HC-05
Светодиод
10-пиновый FRC кабель
Соединительные провода
Макетная плата

Программное обеспечение

CodeVisionAVR (или другое подобное, например, Atmel Studio)
SinaProg – для загрузки программы в микроконтроллер ATmega8 с помощью программатора USBASP

Скачать CodeVisionAVR — http://www.hpinfotech.ro/cvavr_download.html.

Общие принципы работы Bluetooth-модуля HC-05

Bluetooth-модуль может работать в двух режимах:

  1. Режим управления (Command Mode).
  2. Режим функционирования (Operating Mode).

В режиме управления можно конфигурировать свойства Bluetooth-модуля такие как: имя источника сигнала Bluetooth, пароль, бодовая скорость и т.д. В режиме функционирования можно получать и передавать данные между Bluetooth-модулем и микроконтроллером, поэтому в данном проекте мы будем использовать режим функционирования. Для режима управления оставим его настройки по умолчанию. То есть имя устройства будет HC-05 (автор статьи использует HC-06), пароль будет 0000 или 1234, а скорость передачи будет равна 9600 бод/с.

Внешний вид Bluetooth-модуля HC-05

Модуль работает при напряжении питания 5В, а его сигнальные контакты оперируют напряжением 3.3В, поэтому регулятор данного напряжения (3.3В) присутствует в данном модуле. Следовательно, нам не нужно беспокоиться о стабильности этого напряжения. У модуля 6 выходных контактов, но в режиме функционирования используются только 4. Схема соединения контактов модуля приведена в следующей таблице.

  Pin on HC-05/HC-06 Pin name on MCU Pin number in PIC
1 Vcc

Vdd

31st pin
2 Vcc

Gnd

32nd pin
3 Tx RC6/Tx/CK 25th pin
4 Rx RC7/Rx/DT 26th pin
5 State NC NC
6 EN (Enable) NC NC

Создание проекта для ATmega8 в программной среде CodeVision

Аналогичные операции можно произвести и в других программных средах для программирования микроконтроллеров AVR, например, Atmel Studio.

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

Шаг 1. Создайте новый проект в CodeVision, выбрав пункт меню File -> New -> Project. В появившемся диалогом окне нажмите Yes.

Создание нового проекта в CodeVision

Шаг 2. Откроется CodeWizard. Кликните в ней на первой опции, то есть AT90, затем нажмите OK.

Выбор первой опции в CodeVision

Шаг 3. Выберите свой микроконтроллер, в нашем случае им будет Atmega8.

Выбор модели микроконтроллера в CodeVision

Шаг 4. Кликните на Ports (порты). В нашем проекте мы будем использовать Port C4 и C5 для управления светодиодом. Таким образом, необходимо сконфигурировать биты 4 и 5 как выходные кликнув на них, как показано на рисунке:

Выбор портов в CodeVision

Шаг 5. Мы будем использовать универсальный асинхронный последовательный приемопередатчик (USART) для Rx и Tx (приема и передачи данных). Поэтому необходимо выбрать настройки USART, в них кликнуть на настройки приема и оставить их по умолчанию.

Выбор параметров последовательного порта в CodeVision

Шаг 6. Выберите Program -> Generate, Save and Exit. Теперь более половины вашей работы по программированию микроконтроллера Atmega8 можно считать выполненной.

Выбор опций сохранения в CodeVision

Шаг 7. Создайте новую папку на рабочем столе чтобы записывать туда наши файлы.

Выбор директория для сохранения проекта

У нас будет 3 диалоговых окна (будут появляться последовательно одно за другим) для сохранения наших файлов.

Сделайте то же самое (что и на представленном рисунке) с двумя другими диалоговыми окнами – то есть сохраните предлагаемые ими файлы.

После этого рабочая область программы будет выглядеть следующим образом:

Фрагмент кода программы в CodeVision

Теперь большая часть работы по программированию микроконтроллера Atmega8 нами выполнена с использованием такой удобной программной среды как CodeVision. Но ели вы не хотите использовать данную программную среду, то вы можете запрограммировать работу с последовательным портом микроконтроллера вручную по аналогии с последовательностью действий в таких статьях на нашем сайте как:

взаимодействие двух микроконтроллеров AVR ATmega8 через UART;

связь AVR ATmega8 и Arduino Uno через универсальный асинхронный приемопередатчик (UART)

Работа схемы

Схема подключения Bluetooth-модуля HC-05 к микроконтроллеру AVR ATmega8 приведена на следующем рисунке.

Схема подключения Bluetooth-модуля HC-05 к микроконтроллеру AVR ATmega8

Подключите одну сторону FRC кабеля к программатору USBASP, а другую к контактам SPI микроконтроллера.

Назначение контактов FRC кабеля

Необходимо сделать следующие соединения:
1. Pin1 of FRC female connector -> Pin 17 ,MOSI of Atmega8
2. Pin 2 connected to Vcc of atmega8 i.e. Pin 7
3. Pin 5 connected to Reset of atmega8 i.e. Pin 1
4. Pin 7 connected to SCK of atmega8 i.e. Pin 19
5. Pin 9 connected to MISO of atmega8 i.e. Pin 18
6. Pin 8 connected to GND of atmega8 i.e. Pin 8

Соедините остальные компоненты на макетной плате в соответствии с представленной выше схемой.

Пояснение части кода программы

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

#include <io.h>
// глобальные переменные объявляются здесь
// стандартные функции ввода/вывода
#include <stdio.h>
void main(void)
{
char var; // локальные переменные объявляются здесь

Остальная часть кода программы достаточно проста и легка для понимания. Теперь давайте рассмотрим последние строки кода, в которых вы можете найти цикл while – в этом цикле сосредоточена главная часть кода программы, поскольку в нем мы непрерывно проверяем поступающие символы от Bluetooth-модуля и включаем/выключаем светодиод соответственно.

while (1)
{
scanf("%c",&var); // эта функция используется для проверки всех символов, поступающих от приложения android
if (var == 'a') // мы будем посылать символ ‘a’ с терминала Bluetooth чтобы включить светодиод и символ ‘b’ чтобы выключить светодиод
{
PORTC.5 = 1;
PORTC.4 = 0;
}
if (var == 'b')
{
PORTC.5 = 0;
PORTC.4 = 0;
}
}

Наша программа завершена. Теперь нам необходимо построить (build) наш проект. Кликните на иконке Build как показано на рисунке:

Скомпоновать проект

После создания проекта необходимо будет выполнить Debug->Exe чтобы сгенерировать HEX файл, который будет находиться в папке внутри той папки, которую вы создавали для хранения проекта. Этот HEX файл мы будем впоследствии загружать в микроконтроллер atmega8 с помощью программы Sinaprog.

Загрузка программы в Atmega8 с использованием Sinaprog

Мы будем загружать в микроконтроллер ранее сгенерированный Hex файл используя программу Sinaprog, поэтому мы должны открыть ее и выбрать в ней Atmega8 в выпадающем меню устройства (Device). Выберите HEX файл из папки Debug->Exe как показано на рисунке.

Выбор файла в Sinaprog

Теперь кликните на Program.

Запуск программирования микроконтроллера в Sinaprog

Ваш микроконтроллер запрограммирован. Теперь нам необходимо приложение Android чтобы подключиться к нашему модулю. Мы будем использовать “Bluetooth Terminal app” (можно использовать любое другое аналогичное) чтобы контролировать включение/выключение светодиода.

Работа схемы в действии

Приложение Android для контроля светодиода с использованием микроконтроллера AVR

Итак, как мы уже говорили, мы будем использовать “Bluetooth Terminal app” на нашем смартфоне чтобы сообщать модулю HC-05 команды (в нашем случае это просто символы) для управления светодиодом.

Это приложение можно скачать по следующей ссылке: https://play.google.com/store/apps/details?id=Qwerty.BluetoothTerminal&hl=en_IN

Вы можете запитать схему от вашего программатора usbasp, подключив его к компьютеру или можете использовать внешний источник напряжения 5В (не более !!!), подключив его к контакту Vcc Atmega8.

После установки приложения откройте его и подключите его к Bluetooth-модулю HC-05, используя пароль по умолчанию: 1234.

Установка приложения Android

Теперь пошлите символ ‘a’ и светодиод загорится. Пошлите ‘b’ – и светодиод потухнет.

Передача символов с помощью приложения Android

Теперь с помощью передачи символов ‘a’ и ‘b’ вы сможете управлять светодиодом по беспроводному каналу используя ваш смартфон. А если вы будете использовать голосовую клавиатуру с приложением Bluetooth, то вы сможете отдавать эти команды голосом, даже не набирая их на клавиатуре.

Исходный код программы на языке С (Си)

#include <io.h>
#include <stdio.h>
void main(void)
{
char var;
// здесь объявляем локальные переменные
// инициализация портов ввода/вывода
// инициализация порта А (Port A)
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In – на ввод данных
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// инициализация Port B
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In – на ввод данных
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// инициализация Port C
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In – на ввод данных
DDRC=(0<<DDC7) | (0<<DDC6) | (1<<DDC5) | (1<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=0 Bit4=0 Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// инициализация Port D
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In – на ввод данных
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// инициализация Timer/Counter 0
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x00;

// инициализация Timer/Counter 1
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// инициализация Timer/Counter 2
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// инициализация Timer(s)/Counter(s) Interrupt(s) (прерываний)
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

// инициализация внешних прерываний
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);

// инициализация USART
// Communication Parameters: 8 Data, 1 Stop, No Parity (8 бит данных, 1 стоповый бит, нет бита контроля четности)
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous (асинхронный режим)
// USART Baud Rate: 9600 (скорость 9600 бод/с)
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x33;

// инициализация аналогового компаратора
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);

// инициализация АЦП (ADC)
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

// инициализация SPI
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// инициализация TWI
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

while (1)
{
scanf("%c",&var);
if (var == 'a')
{
PORTC.5 = 1;
PORTC.4 = 0;
}
if (var == 'b')
{
PORTC.5 = 0;
PORTC.4 = 0;
}
}
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
74 просмотров


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

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