Звук хриплый при отправке звука через bluetooth->arduino->DAC->3.5mm Breakout Board-> наушники. Не знаю причину

Я написал смесь кода Python и кода Arduino, чтобы сделать эту работу. Я отправляю массив чисел (аудио) на модуль bluetooth HC-05 / arduino uno (они оба настроены для связи через последовательный порт со скоростью 115200 бод, по крайней мере это то, что я установил для обоих (Serial.begin(x) для arduino и через AT-команды для HC-05) в диапазоне от 0 до 4095 в виде строк из python через bluetooth (bluetoothsocket(RFCOMM)). Они принимаются символьно в arduino и считываются в массив, который преобразует массив char в один оригинальный без знака int. До этого я могу подтвердить, что символы были получены и определенно построены в целые числа. Эти целочисленные значения передаются в 12-разрядный ЦАП через контакты I2C (SDA (A4) / SLC (A5) на Arduino. на веб-странице ( https://learn.adafruit.com/mcp4725-12-bit-dac-tutorial/using-with-arduino) сказано, что для увеличения скорости передачи вы пишете это "TWBR = 12; // 400 khz"в сценарии arduino, я предполагаю. В противном случае ЦАП будет передавать на частоте 100 кГц, поэтому я установил скорость передачи на 400 кГц для ЦАП. ProjectSyndicate ru Я подключаю выход ЦАП к разъему 3,5 мм / наушникам. Я слышу только треск, абсолютно никакого "звука". На моем ноутбуке наушники работают очень хорошо, поэтому проблема в другом. ЦАП определенно выдает напряжение (треугольный волновой файл с веб-страницы работает), и я попробовал две 3,5-мм платы для подключения (может быть, плохая пайка?). Кто-нибудь имеет представление о том, что может быть проблема или шаги, которые я мог бы предпринять, чтобы найти, что ошибка? Я предполагаю, что где-то скорость передачи / передачи битов не совпадают, но это то, что я пытаюсь выяснить, спрашивая.

На стороне Python код более или менее выглядит так:

    *initializing socket, setting to non-blocking socket,etc..

for i in range((1000)):  #just to test, the file Id like to send is maybe 300,000 strings
    HC05_socket.send(soundchars[i])

И это код Arduino:

#define ledPinr 4
#include <Wire.h>
#include <Adafruit_MCP4725.h>

Adafruit_MCP4725 dac;

int wait =10000;  //

void setup() {
  // put your setup code here, to run once:
pinMode(ledPinr, OUTPUT);
  digitalWrite(ledPinr, LOW);
Serial.begin(115200);
dac.begin(0x62); 
TWBR = 12; // 400 khz  done in library
Serial.setTimeout(wait);   // for now
}

void loop() {
  // Read serial input:
 char val[4]; // length 4  for 12-bit resolution


if (Serial.available()){
digitalWrite(ledPinr, LOW);


    Serial.readBytesUntil(',', val, 4);  


 int num = atol(val);

dac.setVoltage(num, false);
Serial.print(num);

}


if (Serial.available()==0){
digitalWrite(ledPinr, HIGH);
}

}

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

1 ответ

Решение

Есть много причин, которые могут привести к потрескиванию звука, особенно в таких установках (как я уверен, вы знаете).

Пара вещей:

  1. Хотя в приведенном вами примере это говорит, чтобы написать TWBR = 12, если вы посмотрите на исходный код библиотеки, она проверяет наличие #define TWBR макро. Так что я бы изменил ваш код, чтобы иметь #define TWBR 12 до вашего setup() функция.
  2. Как часто вы получаете данные Bluetooth? Не похоже, что вы обрабатываете то, что происходит, когда вы не получаете данных, ЦАП просто замораживает то значение, которое вы написали последним
  3. Убедитесь, что вы звоните по правильному адресу -> вы не упомянули, подключен ли A0 к VCC в вашей настройке.

Во-первых, обязательно вызовите begin(addr), где addr - это адрес i2c (по умолчанию 0x62, если A0 подключен к VCC, его 0x63)

Примечания стороны:

  • По моему опыту люди стараются избегать использования atol(), Если вы посмотрите на примеры Adafruit, они используют pgm_read_word() вместо.
  • 12 бит не очень высокое разрешение звука для воспроизведения звука, поэтому большинство аудио будет искажено (кроме очень простых цифровых звуков)
  • Убедитесь, что аудио, которое вы отправляете с Python, воспроизводимо (я не знаю, каков ваш тестовый пример)

В конце концов, это всегда может быть пайка, но я думаю, что это вряд ли.

Другие вопросы по тегам