В этом уроке по Arduino мы покажем, как использовать мобильное приложение для Android и модуль Bluetooth HC-05 для голосового управления светодиодом.
Для этого урока нам понадобится минимум комплектующих. После того как вы сделаете урок - вы сможете усложнить схему и дополнить её устройствами по своему вкусу.
Стандартный модуль Bluetooth HC-05 имеет шесть контактов. Однако в этом проекте мы будем использовать только 4.
Мы будем использовать вывод VCC, вывод GND, вывод TXD и вывод RXD. Вывод VCC модуля bluetooth подключается к + 3,3 В от Arduino. Вывод GND модуля подключается к GND Arduino (земля). Штырь TX модуля bluetooth соединяется с цифровым выводом 0 (RXD), а контакт RXD подключается к цифровому выходу 1 (TXD).
Следующим шагом в создании светодиодов, управляемых голосом, является подключение светодиодов к Arduino через макет.
Сначала подключите короткий конец светодиода к земле. Затем подключите длинный конец каждого из светодиодов к резистору 330 Ом. Наконец, подключите сопротивление тока от светодиодов к цифровым контактам на Arduino.
В этом проекте мы будем подключать один светодиод к цифровому выводу 2, другой - к цифровому выходу 3, а последний светодиод - к цифровому выходу 4.
Для этого проекта мы можем подавать питание на Arduino через любой источник питания + 5 В. Вы можете использовать USB-порт со своего компьютера для питания Arduino, но в этом проекте мы будем использовать портативную батарею 5В. Прежде чем подключать источник питания к вашему Arduino, убедитесь, что GND Arduino подключен к земле макетной платы.
Код для нашего проекта ниже.
Вы можете начать тестировать свой проект, загрузив приложение для Android - BT Voice Control для Arduino (BT Voice Control for Arduino), созданное SimpleLabsIN.
После того как вы скачали и установили приложение на свой телефон на базе Android нажмите на строку меню в правом верхнем углу и выберите «Подключить робота». В появившемся новом окне выберите модуль Bluetooth HC-05 и подключите его.
Теперь, когда вы говорите с помощью определенных команд из кода на свое устройство через приложение, определенные светодиоды должны включаться и выключаться. Посмотрите внимательнее на код, где указаны команды и поставьте свои. Например, вместо "*switch on red" можно просто указать "red". Так команды будут быстрее, короче и понятнее.
Итоговый результат можно посмотреть на видео ниже.
Желаем вам успешных проектов! Не забывайте оставлять комментарии на проект в нашей
Привет, Гиктаймс!
Как видно из названия речь в этой статье пойдет о распознавании цифр на микроконтроллере. Сразу хочу оговориться, что в данной статье не будет приведен исходный код, рассматриваться технология или алгоритм распознавания, скажу лишь, что используются идеи системного подхода. Некоторые из них изложены в наших статьях ( , и вот ). Это связано с тем, что наш подход тянет на оригинальность, но требует уточнения некоторых вопросов. Кто-то может сказать: «очередная статья про программирование микроконтроллеров». Отнюдь нет, поиск подобных проектов не дал каких-то внятных результатов, за исключением этого видео . Из обсуждений на форумах понятно одно: идея получения подобного устройства (камера + микроконтроллер = результат распознавания на выходе, а не просто снятая картинка) приходила многим, но оставалась без реализации. Да и распознавание, по общему мнению, требует много вычислительных ресурсов и микроконтроллеры для этого не подходят, в частности про Arduino были высказывания, что это вообще невозможно. Если стало интересно прошу под кат.
Что бы не возникало очевидных вопросов, ответим на них:
Ещё
Затем встал вопрос как эту камеру позиционировать над объектом съемки. Тут нам очень помог старый сломанный микроскоп, который лежал без дела. С уважением сняли с него механизм управления предметным столиком. Этот механизм нам позволил перемещать камеру лишь по двум осям, тут же пришла мысль использовать направляющую лазерной головки от CD привода. Все это закрепили на корпусе от многострадального CD привода. В итоге мы получили классный механизм позиционирования камеры.
Ещё
Итого: так называемая камера у нас есть, механизм позиционирования есть, осталось положить бумажечку с циферкой и получить изображение с камеры. Тут то и начались «проблемы». Так как характеристики «мышинного» оптического сенсора весьма скудны для использования его в качестве камеры, стали импровизировать с подсветкой.
Ещё
Стало понятно, что просто подсветить не получиться важна интенсивность, направление внешний свет тоже вносит коррективы. Пришлось включать в работу еще одну «ардуинку», что бы управлять интенсивностью подсветки ( естественно можно было и по другому управлять, но в последствии и не только подсветкой, а еще переключением цифр на индикаторе ). В итоге оказалось, что съемка на просвет гораздо лучше. А если например использовать в качестве цели светящийся семи сегментный индикатор то сенсор его видит вообще отлично. Так, что теперь у нас в качестве объектов съемки индикатор и полоса с белыми цифрами залитая черным фоном.
слева изображение в градациях серого полученное с индикатора (такое изображение мы получаем с сенсора), справа бинаризованное.
Ещё
ранний вариант установки
Немаловажную роль в нашей установке играет, так называемый блок распознавания (на картинке выше). Как видно, он состоит из Arduino Uno и всем известного wifi передатчика ESP8266 . Поясняю, wifi передатчик нам нужен для того, что бы результат распознавания увидеть на планшете. Приложение на планшете отправляет запрос, «ардуинка», получая запрос, «снимает» изображение с сенсора мыши, затем бинаризует его. После бинаризации происходит распознавание, а после его завершения формируется ответ. В ответе мы посылаем результат распознавания и 41 байт для построения бинаризованного изображения на экране планшета, так сказать, для наглядности.
Если оглянуться, то на «на ардуинку» возложен неплохой функционал: и работа с камерой, и распознавание, и работа с esp8266. Что не могло не отразится на работе - пришлось бороться с нехваткой памяти. Вот уж не думал, что когда либо придется отвоевывать каждый байт памяти.
С радостью ответим на вопросы.
Пришла как-то идея сделать голосовое управление Arduino, но одного Arduino мало, т.к. для системы умного дома нужно еще и общение с компьютером и его системами.Для того, чтобы в дальнейшем было проще ориентироваться по тексту, я прикладываю все исходники, в которых уже прописаны голосовые команды, подключение к плате Arduino, скетч для платы Arduino, голосовое подтверждение фраз и все остальное, что сейчас уже есть и работает: исходники . После скачивание папку GoogleTTS помещаем в библиотеки Processing"a. Скетч для Arduino лежит в папке GoogleTTS/ArduinoSerial. Все писалось на Processing 3.0a4, доступный в пре-релизе на официальном сайте .
За обработку непосредственно текстовых фраз отвечает секция:
void voicer(String s) { // Выполняется командой voicer("текст")
println(s); // применяется для мониторинга текста
File f = new File(sketchPath + "/" + s + ".mp3"); // Проверка файла
// Если файл уже есть - проигрывть файл
if(f.exists()){
println("Файл уже есть! Проигрываю Файл!");
player = minim.loadFile(s + ".mp3");
player.play();
}
// Если файла еще нет - создаем его
else {
println("Файла еще нет! Создаю!");
googleTTS(s, "ru");
player = minim.loadFile(s + ".mp3");
player.play();
}
}
Пример реализации распознавания и голосового подтверждения:
void commands()
{
if (result.equals("компьютер")) { // Ищем соответствие
voicer("Слушаю"); // Получаем голосовое подтверждение
// Выполняющая команда при получении соответсвия
}
}
He is alive!
Для Windows пользователей:
String myPort = new Serial(this, "Ваш COM-порт", 9600);
myPort.bufferUntil("\n");
И отправим туда команду при найденном голосовом соответствии:
void commands() {
if (result.equals("включи свет")) { // Если голосовая фраза распозналась как "включи свет", то выполняем запрос
myPort.write("High"); // Отправляет команду High в Serial подключение
voicer("Включаю свет"); // Голосовое подтверждение о выполнении команды
} else if (result.equals("выключи свет")) {
myPort.write("Low"); // Отправляет команду Low в Serial подключение
voicer("Выключаю свет"); // Подтверждение
// Выполняющая команда при получении соответсвия
}
}
Теперь займемся платой Arduino. Нам нужно слушать Serial порт и при нахождении команды из списка, выполнять требуемое действие согласно команде. Скетч очень прост:
int led = 13; // Пин светодиода на плате
void setup() {
Serial.begin(9600); // Инициализируем серийное подключение
pinMode(led, OUTPUT); // Пин светодиода передает данные
}
void loop() {
int i=0; // переменная для загона строки в буффер
char buffer; // массив буфера для загона в него строки
if(Serial.available()){ // Ппроверяем серийный порт на наличие данных
delay(100);
//загоняем прочитанное в буфер
while(Serial.available() && i< 99) {
buffer = Serial.read();
}
//закрываем массив
buffer="\0";
String val = buffer;
if (val == "High") { // Если получили значение High
Serial.println("Led is On"); // Отправляем в Serial подтверждение получения
digitalWrite(led, HIGH); // Включаем светодиод
}
if (val == "Low") { // Если получили значение Low
Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения
digitalWrite(led, LOW); // Выключаем светодиод
}
}
}
Все. Проверяем.
Самая основная проблема - голосовая фраза не проговаривается целиком. Пропадают последние буквы. Хотя звуковой файл приходит с сервера Google в нормальном виде. Как я понимаю ситуацию: проблема аудио-плеера, но где именно пока не ясно.
- Уже писал, что у Google Speech API есть ограничение на 50 запросов в сутки, но по факту получается больше. В любом случае этого мало. Планирую прописать локальное распознавание главной команды и только после ее распознавания, остальной текст отправлять на обработку Google"у. Ищу решение.
- Думаю не помешает отправка команд на Ethernet-шилд Arduino, т.к. некоторые системы могут находиться на приличном расстоянии от главного компьютера и Serial подключение тут уже не подойдет. Займусь этим решение на днях, т.к. нет у меня в наличии роутера для подключения к нему Arduino с Ethernet-шилдом.
На этом собственно все! Прошу строго не судить за строки кода! Я только начал изучать этот плацдарм и буду крайне признателен, если вы меня ткнете носом в то, как делать не нужно и покажете как нужно. Так же буду рад, если к этому проекту подключатся другие заинтересованные лица - всегда открыт к общению!
В данном проекте я совместил детектор распознавания лиц (face detection) и следящую (tracking system) систему.
Вкратце суть проекта: вебкамера, установленная на поворотном механизме подключена к компьютеру под управлением операционной системы Windows и с установленным программным обеспечением OpenCV . Если программа обнаруживает в поле зрения вебкамеры лицо, то вычисляется центр лица. Координаты X и Y передаются в контроллер Arduino, который подключен к компьютеру по USB. В свою очередь, контроллер Arduino по принятым командам управляет двумя сервомоторами: по координате X и по координате Y, т.о. обеспечивается следящая система.
Библиотеку OpenCV (Open Source Computer Vision Library) можно скачать . Библиотека мультиплатформенная, в настоящее время существует под следующие ОС: Windows, Linux, Android, Mac OS и даже iOS. Библиотека обеспечивает обработку изображений в режиме реального времени. Написана на С/С++.
Т.о. данный проект представляет собой смесь soft и hard решений. Обработка изображения ведется на компьютере, а управление серво осуществляется при помощи контроллера.
Итак, что я использовал для проекта:
Программное обеспечение:
Arduino IDE 1.0 for Windows
Microsoft Visual C++ 2010 Express SP1
Serial C++ Library for Win32 (от Thierry Schneider)
Железо:
компьютер с ОС Windows 7 SP1
Arduino Uno или совместимый + БП
2 сервопривода
USB вебкамера
Итак, поехали.
Шаг 1. Установка программного обеспечения
1) Если у вас ОС Windows, то скачайте файл OpenCV-2.3.1-win-superpack.exe (или более позднюю версию) и установите библиотеку.
2) Скачайте и установите Microsoft Visual C++ 2010 Express. Если у вас 64-битная версия Windows, то также необходимо будет скачать Windows SDK (но для 64 версии могут быть проблемы, я так и не смог заставить работать OpenCV под Windows 7 x64).
Процесс настройку OpenCV для Visual C++ читайте на официальном сайте.
Шаг 2. Крепление камеры и сервомоторов
Я не стал делать конструкцию "долговечной", потому как после достижения конечной цели я все разбираю для следующего проекта.
Вебкамеру я прикрепил к сервомотору оси Х, а его, в свою очередь закрепил на сервомоторе оси Y. И всю эту конструкцию закрепил в струбцине от "третьих рук".
Шаг 3. Подключение
Подключение сервомоторов:
Желтый вывод от серво оси Х подключается к выводу 9 контроллера Arduino
Желтый вывод от серво оси Y подключается к выводу 10 контроллера Arduino
Красный вывод Vcc от серво подключается к выводу 5V
Черный вывод GND от серво подключается к выводу GND контроллера Arduino
Подключение вебкамеры:
Вебкамера подключается к компьютеру по USB интерфейсу. Программа C++ идентифицирует вебкамеру по номеру USB-порта. Возможно, потребуется указать порт в программе.
Подключение контроллера Arduino UNO:
Контроллер также подключается к компьютеру через USB-интерфейс. В системе появляется виртуальный COM-порт, который необходимо внести в код программы на C++.
Для того, чтобы в дальнейшем было проще ориентироваться по тексту, я прикладываю все исходники, в которых уже прописаны голосовые команды, подключение к плате Arduino, скетч для платы Arduino, голосовое подтверждение фраз и все остальное, что сейчас уже есть и работает: исходники . После скачивание папку GoogleTTS помещаем в библиотеки Processing"a. Скетч для Arduino лежит в папке GoogleTTS/ArduinoSerial. Все писалось на Processing 3.0a4, доступный в пре-релизе на официальном сайте .
За обработку непосредственно текстовых фраз отвечает секция:
void voicer(String s) { // Выполняется командой voicer("текст")
println(s); // применяется для мониторинга текста
File f = new File(sketchPath + "/" + s + ".mp3"); // Проверка файла
// Если файл уже есть - проигрывть файл
if(f.exists()){
println("Файл уже есть! Проигрываю Файл!");
player = minim.loadFile(s + ".mp3");
player.play();
}
// Если файла еще нет - создаем его
else {
println("Файла еще нет! Создаю!");
googleTTS(s, "ru");
player = minim.loadFile(s + ".mp3");
player.play();
}
}
Пример реализации распознавания и голосового подтверждения:
void commands()
{
if (result.equals("компьютер")) { // Ищем соответствие
voicer("Слушаю"); // Получаем голосовое подтверждение
// Выполняющая команда при получении соответсвия
}
}
He is alive!
Для Windows пользователей:
String myPort = new Serial(this, "Ваш COM-порт", 9600);
myPort.bufferUntil("\n");
И отправим туда команду при найденном голосовом соответствии:
void commands() {
if (result.equals("включи свет")) { // Если голосовая фраза распозналась как "включи свет", то выполняем запрос
myPort.write("High"); // Отправляет команду High в Serial подключение
voicer("Включаю свет"); // Голосовое подтверждение о выполнении команды
} else if (result.equals("выключи свет")) {
myPort.write("Low"); // Отправляет команду Low в Serial подключение
voicer("Выключаю свет"); // Подтверждение
// Выполняющая команда при получении соответсвия
}
}
Теперь займемся платой Arduino. Нам нужно слушать Serial порт и при нахождении команды из списка, выполнять требуемое действие согласно команде. Скетч очень прост:
int led = 13; // Пин светодиода на плате
void setup() {
Serial.begin(9600); // Инициализируем серийное подключение
pinMode(led, OUTPUT); // Пин светодиода передает данные
}
void loop() {
int i=0; // переменная для загона строки в буффер
char buffer; // массив буфера для загона в него строки
if(Serial.available()){ // Ппроверяем серийный порт на наличие данных
delay(100);
//загоняем прочитанное в буфер
while(Serial.available() && i< 99) {
buffer = Serial.read();
}
//закрываем массив
buffer="\0";
String val = buffer;
if (val == "High") { // Если получили значение High
Serial.println("Led is On"); // Отправляем в Serial подтверждение получения
digitalWrite(led, HIGH); // Включаем светодиод
}
if (val == "Low") { // Если получили значение Low
Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения
digitalWrite(led, LOW); // Выключаем светодиод
}
}
}
Все. Проверяем.
Самая основная проблема - голосовая фраза не проговаривается целиком. Пропадают последние буквы. Хотя звуковой файл приходит с сервера Google в нормальном виде. Как я понимаю ситуацию: проблема аудио-плеера, но где именно пока не ясно.
- Уже писал, что у Google Speech API есть ограничение на 50 запросов в сутки, но по факту получается больше. В любом случае этого мало. Планирую прописать локальное распознавание главной команды и только после ее распознавания, остальной текст отправлять на обработку Google"у. Ищу решение.
- Думаю не помешает отправка команд на Ethernet-шилд Arduino, т.к. некоторые системы могут находиться на приличном расстоянии от главного компьютера и Serial подключение тут уже не подойдет. Займусь этим решение на днях, т.к. нет у меня в наличии роутера для подключения к нему Arduino с Ethernet-шилдом.
На этом собственно все! Прошу строго не судить за строки кода! Я только начал изучать этот плацдарм и буду крайне признателен, если вы меня ткнете носом в то, как делать не нужно и покажете как нужно. Так же буду рад, если к этому проекту подключатся другие заинтересованные лица - всегда открыт к общению!