Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия Следующая версия справа и слева
main:upgkits:soundrobo [2020/05/26 20:03]
smartadmin создано
main:upgkits:soundrobo [2020/05/26 20:18]
smartadmin
Строка 1: Строка 1:
 ====== Управление звуком ====== ====== Управление звуком ======
 +===== Описание =====
 +В этом проекте мы будем управлять роботом с помощью звуков,​ например,​ хлопков. Количество хлопков в ладоши будет подсчитывать датчик звука, размещённый на роботе. Каждому количеству хлопков будет присвоена своя команда. Итак, это будут следующие команды:​
 +  - (один) хлопок - остановиться
 +  - (два) хлопка - двигаться вперёд
 +  - (три) хлопка - двигаться назад
 +  - (четыре) хлопка - двигаться вправо
 +  - (пять) хлопков - двигаться влево
  
 +===== Дополнительные модули =====
 +Предполагается что у Вас уже есть набор "​Смарт РОБО",​ и вы собрали его по инструкции в руководстве пользователя. Тогда дополнительно понадобится:​
 +
 +^ Что нужно ​                                                                                                              ​^ ​ Кол-во,​ шт  ^
 +| [[https://​smartelements.ru/​collection/​datchiki-i-sensory/​product/​modul-datchika-zvuka|Датчик звука]] |  1           |
 +| [[https://​smartelements.ru/​collection/​moduli/​product/​modul-adresnyh-svetodiodov-h4|Модуль адресных светодиодов]] |  2           |
 +| [[https://​smartelements.ru/​collection/​aksessuary/​product/​komplekt-neylonovyh-krepleniy|Комплект нейлоновых креплений]] |  1           |
 +| [[https://​smartelements.ru/​collection/​provoda-i-kabeli/​product/​shleyf-mama-mama-h3-20-sm|Шлейф "​мама-мама"​ х3, 20 см]] |  1           |
 +
 +
 +===== Библиотеки =====
 +  * [[http://​files.smartelements.ru/​know_libs/​robotSE.zip|Библиотека robotSE (для робота)]]
 +===== Порядок действий =====
 +==== Шаг 1. Пересоберите робота ====
 +  - С помощью отвёртки,​ входящей в комплект набора,​ снимите с платформы модуль ИК-приёмника
 +  - С помощью отвёртки,​ входящей в комплект набора,​ прикрепите на место модуля ИК-приёмника - [[https://​smartelements.ru/​collection/​datchiki-i-sensory/​product/​modul-datchika-zvuka|Датчик звука]]
 +  - Присоедините датчик звука с помощью трёхпроводного шлейфа к аналоговому выводу А3 мотор шилда.
 +  - С помощью отвёртки,​ входящей в комплект набора,​ и нейлоновых креплений (одна гайка, один винт и одна стойка) прикрепите в свободное крайнее отверстие (справа от ИК-приёмника) [[https://​smartelements.ru/​collection/​moduli/​product/​modul-adresnyh-svetodiodov-h4|Модуль адресных светодиодов]]
 +  - С помощью отвёртки,​ входящей в комплект набора,​ и нейлоновых креплений (одна гайка, один винт и одна стойка) прикрепите в свободное крайнее отверстие (слева от ИК-приёмника) [[https://​smartelements.ru/​collection/​moduli/​product/​modul-adresnyh-svetodiodov-h4|Модуль адресных светодиодов]]
 +  - Присоедините один из модулей адресных светодиодов с помощью трёхпроводного шлейфа к выводам D11 мотор шилда (вывод модуля Din).
 +  - Соедините между собой модули адресных светодиодов трёхпроводным шлейфом (D out первого с D in второго).
 +
 +==== Шаг 2. Количество хлопков ====
 +Для начала загрузите на контроллер скетч, который определяет количество хлопков и выводит значение на индикатор. ​
 +Как правильно хлопать? ​
 +Представим себе звук хлопка на упрощённом графике:​
 +{{ ::​soundgraph.png?​nolink |}}
 +
 +Рассмотрим по точкам:​
 +  * На датчике мы всегда получаем информацию по окружающему шуму
 +  * В какой-то момент,​ начиная хлопок,​ уровень шума повышается (А - Б)
 +  * Далее, происходит сам хлопок,​ в этот момент уровень шума преодолевает критическую отметку (Б - В)
 +  * Затем происходит затухание шума
 +
 +Следует заметить такую особенность:​ так как датчик фиксирует данные постоянно,​ то после момента преодоления порога шума (примерно 80 единиц),​ нам следует остановить приём датчиком значений в какое-то время (на графике это участок Б-В), чтобы не поймать "​остаток"​ текущего хлопка. Будем примерно считать что это 150 мс.
 +
 +Проверить как робот будет определять количество хлопков можно с помощью скетча:​
 +<file Arduino>
 +#include <​SevenSegmentTM1637.h>​ //​Подключение библиотеки для работы с дисплеем.
 +
 +const int PIN_SOUND = A2;    //​Вывод для подключения датчика звука
 +
 +int clap_q = 0; //​Переменная,​ хранящая количество хлопков
 +unsigned long time_long = 1000; //​Время ожидания следующего хлопка
 +
 +SevenSegmentTM1637 display(13, 12); //​Создание объекта дисплея. (CLK, DIO)
 +
 +//​Определение количества хлопков
 +void claps_quantity()
 +{
 +  int val = analogRead(PIN_SOUND);​ //​чтение значения с датчика
 +  if (val > 80) //если значение больше 80
 +  {
 +    delay(150); //дать время для того чтобы звуковая волна погасла
 +    clap_q += 1; //​прибавить количество хлоков
 +    unsigned long new_time = millis() + time_long; //​зафиксировать время ожидания нового хлопка
 +    while (millis() < new_time) //пока идёт это время
 +    {
 +      claps_quantity();​ //​снова зайти в эту функцию
 +    }
 +  }
 +}
 +
 +void setup()
 +{
 +  display.begin(); ​          //​Инициализация дисплея.
 +  display.setBacklight(100);​ //​Установка яркости 100%.
 +  display.print("​INIT"​); ​    //​Вывод надписи INIT на дисплей.
 +  delay(1000); ​              //​Задержка величиной 1 с.
 +  display.clear(); ​          //​Очистка дисплея.
 +}
 +
 +void loop()
 +{
 +  clap_q = 0; //​Сброс количества хлопков
 +  claps_quantity();​ //​Подсчёт количества хлопков
 +
 +  if (clap_q > 0) { //Если их больше 0
 +    display.clear();​ //​Очистить индикатор
 +    display.print(clap_q);​ //​Вывести количество хлопков
 +    display.blink();​ //​Помигать
 +  }
 +}
 +
 +</​file>​
 +
 +После того как скетч будет загружен на контроллер,​ хлопайте в ладоши и смотрите как на индикаторе выводится количество распознанных хлопков. Каждый следующий хлопок считается только если он произведён не позднее чем в течении 1 секунды после предыдущего.
 +
 +==== Шаг 3. Установите библиотеки ====
 +Установите в Arduino IDE библиотеку,​ которая представлена по ссылке выше. О том как устанавливаются библиотеки описано в руководстве пользователя,​ входящем в комплект,​ либо посетите соответствующий [[main:​info:​libs|раздел Базы Знаний]].
 +
 +
 +
 +==== Шаг 4. Загрузите скетч на контроллер ====
 +Теперь добавим в скетч функции,​ отвечающие за движение робота. ​
 +
 +<file Arduino>
 +#include <​robotSE.h> ​           //​Подключение библиотеки для работы с платформой.
 +#include <​SevenSegmentTM1637.h>​ //​Подключение библиотеки для работы с дисплеем.
 +
 +const int PIN_SOUND = A2;    //​Вывод для подключения датчика звука
 +
 +int clap_q = 0; //​Переменная,​ хранящая количество хлопков
 +unsigned long time_long = 1000; //​Время ожидания следующего хлопка
 +
 +robotSE robot; //​Создание объекта робота
 +
 +SevenSegmentTM1637 display(13, 12); //​Создание объекта дисплея. (CLK, DIO)
 +
 +//​Определение количества хлопков
 +void claps_quantity()
 +{
 +  int val = analogRead(PIN_SOUND);​ //​чтение значения с датчика
 +  if (val > 80) //если значение больше 80
 +  {
 +    delay(150); //дать время для того чтобы звуковая волна погасла
 +    clap_q += 1; //​прибавить количество хлоков
 +    unsigned long new_time = millis() + time_long; //​зафиксировать время ожидания нового хлопка
 +    while (millis() < new_time) //пока идёт это время
 +    {
 +      claps_quantity();​ //​снова зайти в эту функцию
 +    }
 +  }
 +}
 +
 +void setup()
 +{
 +  display.begin(); ​          //​Инициализация дисплея.
 +  display.setBacklight(100);​ //​Установка яркости 100%.
 +  display.print("​INIT"​); ​    //​Вывод надписи INIT на дисплей.
 +  delay(1000); ​              //​Задержка величиной 1 с.
 +  display.clear(); ​          //​Очистка дисплея.
 +}
 +
 +void loop()
 +{
 +  clap_q = 0;               //​Сброс количества хлопков
 +  claps_quantity(); ​        //​Подсчёт количества хлопков
 +
 +  if (clap_q > 0) {         //​Если их больше 0
 +    display.clear(); ​       //​Очистить индикатор
 +    display.print(clap_q); ​ //​Вывести количество хлопков
 +    display.blink(); ​       //​Помигать
 +  }
 +
 +  if (clap_q == 1) {        //Если был один хлопок
 +    robot.move_stop(); ​     //​Остановка робота
 +    display.print("​STOP"​); ​ //​Вывести надпись
 +  } else if (clap_q == 2) { //Если было два хлопка
 +    robot.move_forward(); ​  //​Двигаться вперёд
 +    display.print("​FOWD"​); ​ //​Вывести надпись
 +  } else if (clap_q == 3) { //Если было три хлопка
 +    robot.move_back(); ​     //​Двигаться назад
 +    display.print("​BACK"​); ​ //​Вывести надпись
 +  } else if (clap_q == 4) { //Если было четыре хлопка
 +    robot.move_right(); ​    //​Двигаться вправо
 +    display.print("​RIGH"​); ​ //​Вывести надпись
 +  } else if (clap_q == 5) { //Если было пять хлопков
 +    robot.move_left(); ​     //​Двигаться влево
 +    display.print("​LEFT"​); ​ //​Вывести надпись
 +  }
 +}
 +</​file>​
 +
 +==== Шаг 5. Результат ====
 +Управляйте роботом с помощью хлопков. В зависимости от полученной команды (количества хлопков) робот будет двигаться в определённом направлении.