Воспроизведение файлов *.wav через Arduino

audio sound wave

Я тренирую поведение мышей. Для этого у меня есть коробка, управляемая Arduino. Звуки воспроизводятся с помощью Mp3-плеера, управляемого с помощью Arduino. Однако mp3-плеер недостаточно хорош для моих нужд.

Мне нужны два чистых звука длительностью 10 мс и частотами 5000 Гц и 1000 Гц. (Я предпочитаю чистые синусоидальные волны, но могу пойти на компромисс в пользу треугольника или, на данный момент, даже квадрата). Проблема в том, что mp3 недостаточно быстрый, а громкость слишком низкая для продолжительности 10 мс. Когда я попытался построить схему усиления, она стала слишком шумной.

Я пытался использовать функцию «Тон», но она снова не подходит для звуков длительностью 10 мс. особенно на частоте jigj/

Я создал волновые файлы в Matlab. ПК воспроизводит файл в нужной громкости без носа. Однако я не знаю, как заставить Arduino воспроизводить файлы с компьютера.

Есть ли относительно простой способ сделать это без использования дополнительного оборудования? Если сейчас, есть ли КАКОЙ-нибудь способ сделать это?

или другой вариант: есть ли возможность Arduino воспроизводить файлы из генератора волн? (они есть у меня в лаборатории)

Спасибо!

, 👍-1

Обсуждение

что не так с тоном()? для меня это издает приятные высокие сигналы, @Juraj

Когда я воспроизвожу звук частотой 10000 Гц и длительностью 10 мс, я слышу только щелчок. Я не слышу звук. Это важно, поскольку в эксперименте, который я провожу, мыши должны слышать и различать частоты от 5000 до 10000 Гц. Mp3 был хорош в течение 200 мс, но не в течение 10 мс. Компьютер делает очень хорошую работу, но для управления им мне нужен Arduino., @user135172


2 ответа


1

Два варианта:

  1. Написать программное обеспечение для ПК, которое будет реагировать на последовательные команды, отправляемые Arduino, или
  2. Используйте более мощную плату типа Arduino с ЦАП и выполните волновой синтез.

Arduino Due и многие другие меньшие платы на базе ARM (например, платы M0) являются хорошими кандидатами для варианта 2, поскольку они быстрее, чем традиционные Arduino, и имеют встроенный ЦАП. Однако правильный чип кодека I2S, подключенный к мощному MCU, будет предпочтительным методом высококачественного воспроизведения.

Обратите внимание, что ваша система усиления имеет решающее значение. Многие дешевые усилители обычно ограничивают более высокие частоты. Вам нужен усилитель с хорошей ровной характеристикой, превышающей максимальную частоту, которую вы хотите воспроизвести. Просто собрать любую старую схему усиления, вероятно, будет недостаточно. Большинство решений на базе операционных усилителей имеют коэффициент (Продукт пропускной способности ), что уменьшает полосу пропускания по мере увеличения усиления.

,

Да, возможно закажу более мощный модуль.. Спасибо!, @user135172


1

Этот код создаст устойчивый выходной сигнал частотой 20 кГц. Отрегулируйте продолжительность, чтобы она отражала период ваших частот.

byte triggerOut = 19;

unsigned long currentMicros;
unsigned long nextMicros;
unsigned long duration = 25UL; // переворачиваем каждый импульс 50 мкс = 20 кГц
unsigned long elapsedMicros;

void setup() {
  pinMode (triggerOut, OUTPUT);
}
void loop() { 
  while (1) {
    currentMicros = micros();
    elapsedMicros = currentMicros - nextMicros;
    if (elapsedMicros >= duration) {
      nextMicros = nextMicros + duration;
      PINC = PINC | 0b00111111; // переключаем вывод D19, записывая его в порт ввода.
    }
  }
}

Добавьте несколько строк, чтобы начать вывод после нажатия кнопки, и подсчитайте количество циклов, чтобы выводить только нужную вам продолжительность времени. 10 000 кГц = период 0,1 мс, 10 мс/0,1 мс = 100 циклов.

Разделите выходное напряжение от 0 до 5 В до 1 В и включите динамик с автономным питанием компьютера, чтобы создать нужный уровень шума.

,

Я попробую это. Спасибо!, @user135172