Часть 1 Здесь будет разбор старой версии и то, что я начал делать для новой.
Задумывал передвижного робота, который мог бы определить выстрел и его местонахождение, но для этого сначала нужно сделать сам детектор выстрела, и на основе него уже проектировать робота. Казалось всё просто: модули микрофонов с усилителями, микроконтроллер, и пара строчек кода, и готово! Но так было бы в идеальном мире, а в реальности моя система сначала просто молчала, а затем начались ложные срабатывания.
1. Условия задачи. (Что я хотел?)
- Уловить короткий импульсный звук на фоне.
- Устранить ложные срабатывания на разговор, фоновый шум и т.п..
- Определить расстояние до него, зная примерную громкость выстрела на расстоянии в 1 метр.
- При помощи триангуляции определить направление до звука. (Сначала использовал мультиплексор CD4051BE)
- Вывести информацию на дисплей.
Первый и главный вывод, который я сделал уже на этом этапе: если не можешь описать задачу письменно, не соберёшь и схему.
2. Разбор полётов. Где логика дала сбой?
Вот дерево моих предположений, и проверок в хронологическом порядке. Гипотезы номер 1 и номер 2 появились почти одновременно.
- Гипотеза №1: не хватает производительности AtMeg- овского процессора
- Сначала пытался решить увеличением числа Arduino
Но у такой схемы был существенный минус - так как данные передавались последовательно по микроконтроллерам, то проходило большое время между сигналом и выводом на дисплей. Также, как я узнал в скором будущем, соединение по serial нескольких микроконтроллеров подряд увеличивает количество точек отказа.
- Гипотеза №2: проблема в способе чтения микрофонов
- Каким способом я пытался читать полученные значения с микрофонов? Через аналоговый мультиплексор CD4051BE. Я считал, что это снизит нагрузку на микроконтроллер-(ы) и займёт меньше кода, чем опрашивание каждого микрофона одновременно и напрямую, но на самом деле мультиплексор хотя и снижал нагрузку на Arduino, но сильно тормозил время чтения, делало невозможным синхронное чтение данных со всех микрофонов сразу.
- Вывод: подключаем микрофоны напрямую к аналоговым портам Arduino Nano. Сработало
- Гипотеза №3: проблема в софте.
- Как я пытался отличить выстрел от фонового шума и других звуков? По пороговому значению амплитуды. Это было наивно...
- Вывод и "Ага!" - момент: Выстрел - это не просто громкий звук, это определённая частотная характеристика и форма импульса! Мой код этого «не знал». Нужно анализировать не уровень, а спектр (БПФ) или длину импульса. Это уровень сложности выше, и я его недооценил...
Итоги провала первой версии. Что дальше?
Эта версия не увенчалась готовым устройством, но она дала гораздо больше - систему мышления .
- Дроби задачу.Ищи сбой не в системе, а в конкретном узле.
- Физика первична. Прежде чем писать код, нужно тщательно изучить и понять природу явления (выстрел), которую ты собираешься поймать
- Знать свои границы и тщательно подбирать компоненты. Сейчас я уже жду новую плату STM32F103C8T6, которая подошла под мои задачи, но раньше я использовал те компоненты, какие у меня "завалялись".
Это и есть ” Твёрдая Логика„ - умение разложить задачу на понятные частички, извлечь из этого урок и сложить из них план для следующей, более осознанной попытки.
Сейчас я проектирую вторую версию, и вот, что пока мне удалось понять.
Проблема была не в моих «кривых» руках, а в фундаменте. И "Твёрдая Логика "помогла мне ее найти:
1. MAX4466 (микрофон): Без АРУ слабый звук далёкого выстрела терялся в шумах, а громкий "чих" - зашкаливал.
Вывод для системы: Нужен микрофон с автоматической регулировкой усиления (АРУ).
2. Arduino Nano: Для сложного анализа звука не хватило оперативной памяти и тактовой частоты. Вывод: для системы нужна более мощная плата с ядром ARM (Cortex-M3).
План операции. Выбор новой архитектуры.
Шаг 1. Меняем уши
Задача: Получить стабильный сигнал независимо от громкости.
Решение: MAX9814. У него есть встроенная АРУ, которая держит сигнал в оптимальном диапазоне. Это решает проблему "или тихо, или клиппинг"
Шаг 2. Меняем «мозг»
Задача: Обрабатывать сигналы в реальном времени, анализируя не только громкость, но и частоту/форму импульса.
Решение: STM32F103C8T6 Blue pill (на основе ARM Cortex-M3). В разных больше памяти и вычислительной мощности, поддержка аппаратных периферийных модулей для точного захвата аналогового сигнала и сложных вычислений.
Заключение
Что изменилось сейчас?
Фундамент перестроен. Новая система потихоньку приоткрывает свои будущие возможности.
Что будет в следующем выпуске?
В следующем выпуске я покажу написание нового, «умного» алгоритма обработки звука на STM32. Мы посмотрим на спектр сигнала и научим контроллер принимать решение.
Это и есть "Твёрдая Логика" - не бояться признать ошибку в архитектуре, найти узкие места и пересобрать систему на улучшенных принципах.
#электроника #робототехника #DIY #сделай_сам #детектор_выстрела