- Разработка учебного стенда для демонстрации голосового управления
Разработка учебного стенда для демонстрации голосового управления с помощью Андроид устройства
Практика для студентов. Мясищев А.А.
На рисунке 1 представлено фото стенда. Он построен на основе отладочного комплекса AVR-EASY-KIT. Для связи стенда с Андроид устройством (смартфоном, планшетом) используется Bluetooth HC-05.
Рис.2. Схема подключений светодиодных полосок и Bluetooth HC-05 к отладочному комплексу AVR-EASY-KIT
Схему соединений электронных компонентов в отладочном комплексе можно посмотреть ЗДЕСЬ.
Линейка красных светодиодов подключена через транзистор к порту PC1, белых - к порту PC2, синих - к порту PC3.
Программа для Андроид устройства (смартфона) написана с использованием языка визуального программирования App Inventor 2.
Ниже представлены графические иллюстрации программы.
Рис.1. Фотография стенда голосового управления устройствами
Система голосового управления работает следующим образом:
1. После включения стенда на смартфоне запускается приложение и выполняется подключение к Bluetooth устройству стенда;
2. В приложении смартфона нажимается кнопка "Нажми и говори" и произносится команда, например, "Включить синий". На светодиодной панели загорается светодиодная полоска синим цветом.
3. Для окончания голосового диалога произносится команда "Конец связи". Смартфон должен ответить "до свидание".
Аналогично включается и выключаются белые и красные светодиоды. При произнесении команды "температура", смартфон должен произнести значение температуры, которое высвечивается на индикаторе GLCD. Причем, распознавание голосовых команд выполняется как при работе с Интернет, так и без Интернет при использовании внутренней библиотеки, если Смартфон позволяет ее скачать и работать в режиме offline. Без Интернет распознавание хуже, поэтому иногда приходится повторять команды.
Программа для стенда написана так, что кроме управления температурным датчиком и светодиодными полосками на GLCD выводится изменяющаяся рекламная информация с показанием температуры, а также мигают по заданному алгоритму восемь светодиодов, подключенные к порту PB0,...,PB7. Управление GLCD и светодиодами порта PB выполняется функцией обработки прерывания по совпадению счетчика таймера TIME1.
Программа для микроконтроллера стенда написана на языке Wiring (Модифицированный С++ для контроллеров Ардуино). Ниже приведен текст программы.
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#include <mega32.h>
#include <OneWire.h>
#include <glcd.h>
#include <fonts/fixed.h>
#include <fonts/fixed1.h>
gText textTop = gText(textAreaTOP);
OneWire ds(14);
float te;
int s=0;
int t=0;
int ten,ten1,ten2;
char inByte; // входящие данные
void setup() {
te=temp();
GLCD.Init();
Serial.begin(9600); // инициализация порта для работы с bluetooth
DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7); // Порты микроконтроллера работают на выход
DDRC |= (1<<PC1)|(1<<PC2)|(1<<PC3); // Порты работают на выход
TCCR1A=0x00; // Задает режим работы Time 1, т.е.
TCCR1B=0x05; //Тактирование таймера CLK/1024
TCNT1H=0x00; // В этих регистрах происходит
TCNT1L=0x00; // счет
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x07; // Регистры сравнения А. Старший байт 0x07
OCR1AL=0x08; // Регистры сравнения. Младший байт 0x08
OCR1BH=0x00; // Регистры сравнения В.
OCR1BL=0x00;
TIMSK=0x10; // Разрешает прерывание по сравнению регистров для Time 1
}
ISR(TIMER1_COMPA_vect) // Функция обработки прерывания для вывода информации на экран и мигания диодами
{
TCNT1H=0; // Каждый раз обнуляем регистры счета
TCNT1L=0;
if(t==0&&s==0){
GLCD.Init();
textTop.SelectFont(new_Font); // выбор шрифтов
textTop.DefineArea( 5, 13, 127, 63, SCROLL_UP); // Выбор зоны распечатки
textTop.print("T="); textTop.print(te,1);textTop.println("C"); // Распечатка T=21.6C
}
if(t==1&&s==0){
GLCD.Init();
textTop.SelectFont(new_Font1);
textTop.DefineArea( 6, 10, 127, 63, SCROLL_UP);
textTop.println("Department@of");
textTop.println("Cybersecurity");
te=temp(); // Определение температуры
}
if(t==2&&s==0){
GLCD.Init();
textTop.SelectFont(new_Font);
textTop.DefineArea( 5, 13, 127, 63, SCROLL_UP);
textTop.print("T="); textTop.print(te,1);textTop.println("C");
}
if(t==3&&s==0){
GLCD.Init();
textTop.SelectFont(new_Font1);
textTop.DefineArea( 8, 0, 127, 63, SCROLL_UP);
textTop.println("@Khmelnitsky");
textTop.println("@@@national");
textTop.println("@@University");
}
if (s==1){ // Последовательное мигание 8-ю светодиодами
PORTB |= (1<<PB0);
_delay_ms(200);
PORTB &= ~(1<<PB0);}
if (s==2){
PORTB |= (1<<PB1);
_delay_ms(200);
PORTB &= ~(1<<PB1); }
if (s==3){
PORTB |= (1<<PB2);
_delay_ms(200);
PORTB &= ~(1<<PB2); }
if (s==4){
PORTB |= (1<<PB3);
_delay_ms(200);
PORTB &= ~(1<<PB3); }
if (s==5){
PORTB |= (1<<PB4);
_delay_ms(200);
PORTB &= ~(1<<PB4); }
if (s==6){
PORTB |= (1<<PB5);
_delay_ms(200);
PORTB &= ~(1<<PB5);}
if (s==7){
PORTB |= (1<<PB6);
_delay_ms(200);
PORTB &= ~(1<<PB6); }
if (s==8){
PORTB |= (1<<PB7);
_delay_ms(200);
PORTB &= ~(1<<PB7); }
if (s==9){ // Одновременное мигание 8-ю светодиодами три раза
PORTB=0xFF;
_delay_ms(100);
PORTB=0x00;
}
if (s==10){
PORTB=0xFF;
_delay_ms(100);
PORTB=0x00;
}
if (s==11){
PORTB=0xFF;
_delay_ms(100);
PORTB=0x00;
}
s++;
if (s==12) { s=0; t++;}
if(t==4&&s==0) {t=0;}
}
float temp() // Функция определения температуры
{
byte i;
byte data[10];
byte addr[8];
float celsius;
ds.search(addr);
ds.reset();
ds.select(addr);
ds.write(0x44,1);
delay(1000);
ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();}
int raw = (data[1] << 8) | data[0];
unsigned char t_mask[4] = {0x7, 0x3, 0x1, 0x0};
byte cfg = (data[4] & 0x60) >> 5;
raw &= ~t_mask[cfg];
celsius = (float)raw / 16;
return celsius;
}
void loop() { // Анализ пришедших с Bluetooth данных
if (Serial.available() > 0) { //если пришли данные
inByte = Serial.read(); // считываем байт
if(inByte == '0') {
PORTC &= ~(1<<PC1); // если 0, то выключаем RED
}
if(inByte == '1') {
PORTC |= (1<<PC1); // если 1, то включаем RED
}
if(inByte == '2') {
PORTC &= ~(1<<PC2); // если 2, то выключаем WHITE
}
if(inByte == '3') {
PORTC |= (1<<PC2); // если 3, то включаем WHITE
}
if(inByte == '4') {
PORTC &= ~(1<<PC3); // если 4, то выключаем BLUE
}
if(inByte == '5') {
PORTC |= (1<<PC3); // если 5, то включаем BLUE
}
if(inByte == '6') { // если 6, то считываем температуру и посылаем ее на bluetooth
Serial.print("Temperatura, "); ten=10*te; ten1=ten/10; ten2=ten%10;
Serial.print(ten1); Serial.print("i"); Serial.print(ten2); Serial.print(" ");
}
}
}
Для компиляции этой программы в программной среде Ардуино(здесь используется arduino-1.0.3) необходимо заменить файл boards.txt в каталоге c:\arduino-1.0.3-windows\arduino-1.0.3\hardware\arduino на файл, находящийся здесь. Также требуется для работы графического дисплея установить в каталоге c:\arduino-1.0.3-windows\arduino-1.0.3\libraries библиотеку glcd и изменить в ней файл c:\arduino-1.0.3-windows\arduino-1.0.3\libraries\glcd\config\ks0108_Arduino.h на файл с таким же именем, но приведенный здесь. В каталоге c:\arduino-1.0.3-windows\arduino-1.0.3\hardware\arduino\variants\ необходимо создать подкаталог m16 и разместить там файл pins_arduino.h. Этот файл описывает пины микроконтроллера ATmega16(ATmega32). После таких изменений в программной среде Ардуино можно будет выбрать платы на базе микроконтроллеров ATmega16, ATmega32.
На рисунке 2 представлена схема подключений светодиодных полосок и Bluetooth HC-05 к отладочному комплексу AVR-EASY-KIT.
Написано 14.12.2016г.