- Разработка учебного стенда для демонстрации голосового управления

Разработка учебного стенда для демонстрации голосового управления с помощью Андроид устройства

Практика для студентов. Мясищев А.А.

На рисунке 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г.