Звук хриплый при отправке звука через 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 ответ
Есть много причин, которые могут привести к потрескиванию звука, особенно в таких установках (как я уверен, вы знаете).
Пара вещей:
- Хотя в приведенном вами примере это говорит, чтобы написать
TWBR = 12
, если вы посмотрите на исходный код библиотеки, она проверяет наличие#define TWBR
макро. Так что я бы изменил ваш код, чтобы иметь#define TWBR 12
до вашегоsetup()
функция. - Как часто вы получаете данные Bluetooth? Не похоже, что вы обрабатываете то, что происходит, когда вы не получаете данных, ЦАП просто замораживает то значение, которое вы написали последним
- Убедитесь, что вы звоните по правильному адресу -> вы не упомянули, подключен ли A0 к VCC в вашей настройке.
Во-первых, обязательно вызовите begin(addr), где addr - это адрес i2c (по умолчанию 0x62, если A0 подключен к VCC, его 0x63)
Примечания стороны:
- По моему опыту люди стараются избегать использования
atol()
, Если вы посмотрите на примеры Adafruit, они используютpgm_read_word()
вместо. - 12 бит не очень высокое разрешение звука для воспроизведения звука, поэтому большинство аудио будет искажено (кроме очень простых цифровых звуков)
- Убедитесь, что аудио, которое вы отправляете с Python, воспроизводимо (я не знаю, каков ваш тестовый пример)
В конце концов, это всегда может быть пайка, но я думаю, что это вряд ли.