Различия
Здесь показаны различия между двумя версиями данной страницы.
Следующая версия Следующая версия справа и слева | |||
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. Результат ==== | ||
+ | Управляйте роботом с помощью хлопков. В зависимости от полученной команды (количества хлопков) робот будет двигаться в определённом направлении. |