Управление звуком

Описание

В этом проекте мы будем управлять роботом с помощью звуков, например, хлопков. Количество хлопков в ладоши будет подсчитывать датчик звука, размещённый на роботе. Каждому количеству хлопков будет присвоена своя команда. Итак, это будут следующие команды:

  1. (один) хлопок - остановиться
  2. (два) хлопка - двигаться вперёд
  3. (три) хлопка - двигаться назад
  4. (четыре) хлопка - двигаться вправо
  5. (пять) хлопков - двигаться влево

Дополнительные модули

Предполагается что у Вас уже есть набор Минибот, и вы собрали его по инструкции в руководстве пользователя. Тогда дополнительно понадобится:

Что нужно Кол-во, шт
Датчик звука 1

Библиотеки

Порядок действий

Шаг 1. Пересоберите робота

  1. С помощью отвёртки, входящей в комплект набора, снимите с платформы модуль ИК-приёмника
  2. С помощью отвёртки, входящей в комплект набора, прикрепите на место модуля ИК-приёмника - Датчик звука
  3. Присоедините датчик звука с помощью трёхпроводного шлейфа к выводам A2 мотор шилда.

Шаг 2. Количество хлопков

Для начала загрузите на контроллер скетч, который определяет количество хлопков и выводит значение на индикатор. Как правильно хлопать? Представим себе звук хлопка на упрощённом графике:

Рассмотрим по точкам:

  • На датчике мы всегда получаем информацию по окружающему шуму
  • В какой-то момент, начиная хлопок, уровень шума повышается (А - Б)
  • Далее, происходит сам хлопок, в этот момент уровень шума преодолевает критическую отметку (Б - В)
  • Затем происходит затухание шума

Следует заметить такую особенность: так как датчик фиксирует данные постоянно, то после момента преодоления порога шума (примерно 80 единиц), нам следует остановить приём датчиком значений в какое-то время (на графике это участок Б-В), чтобы не поймать «остаток» текущего хлопка. Будем примерно считать что это 150 мс.

Проверить как робот будет определять количество хлопков можно с помощью скетча:

#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(); //Помигать
  }
}

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

Шаг 3. Установите библиотеки

Установите в Arduino IDE библиотеку, которая представлена по ссылке выше. О том как устанавливаются библиотеки описано в руководстве пользователя, входящем в комплект, либо посетите соответствующий раздел Базы Знаний.

Шаг 4. Загрузите скетч на контроллер

Теперь добавим в скетч функции, отвечающие за движение робота.

#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");  //Вывести надпись
  }
}

Шаг 5. Результат

Управляйте роботом с помощью хлопков. В зависимости от полученной команды (количества хлопков) робот будет двигаться в определённом направлении.