В этом проекте мы будем управлять роботом с помощью звуков, например, хлопков. Количество хлопков в ладоши будет подсчитывать датчик звука, размещённый на роботе. Каждому количеству хлопков будет присвоена своя команда. Итак, это будут следующие команды:
Предполагается что у Вас уже есть набор Минибот, и вы собрали его по инструкции в руководстве пользователя. Тогда дополнительно понадобится:
Что нужно | Кол-во, шт |
---|---|
Датчик звука | 1 |
Для начала загрузите на контроллер скетч, который определяет количество хлопков и выводит значение на индикатор. Как правильно хлопать? Представим себе звук хлопка на упрощённом графике:
Рассмотрим по точкам:
Следует заметить такую особенность: так как датчик фиксирует данные постоянно, то после момента преодоления порога шума (примерно 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 секунды после предыдущего.
Установите в Arduino IDE библиотеку, которая представлена по ссылке выше. О том как устанавливаются библиотеки описано в руководстве пользователя, входящем в комплект, либо посетите соответствующий раздел Базы Знаний.
Теперь добавим в скетч функции, отвечающие за движение робота.
#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"); //Вывести надпись
}
}
Управляйте роботом с помощью хлопков. В зависимости от полученной команды (количества хлопков) робот будет двигаться в определённом направлении.