通过蓝牙->arduino->DAC->3.5mm 分线板->耳机发送音频时发出噼啪声。不知道原因
Crackly audio when sending audio via bluetooth->arduino->DAC->3.5mm breakout board->headphones. Do not know the cause
我混合编写了 python 代码和 arduino 代码来完成这项工作。 我正在向 HC-05 蓝牙 module/arduino uno 发送一组数字(音频)(它们都设置为 通过串口以 115200 波特进行通信,至少这是我为两者设置的(Serial.begin(x) for arduino 和通过 AT 命令 for HC-05)范围从 0-4095 为来自 python 的字符串通过蓝牙(bluetoothsocket(RFCOMM))。它们在 arduino 中逐个字符地接收并读入一个数组,该数组将 char 数组转换为单个原始无符号整数。到那里 我可以确认字符已被接收并明确构造成整数。那些整数值通过I2C(SDA(A4)/ SLC( A5) arduino 上的引脚。在网页上 (https://learn.adafruit.com/mcp4725-12-bit-dac-tutorial/using-with-arduino) 它说要提高传输速度你在 arduino 脚本中写这个 "TWBR = 12; // 400 khz",我猜。否则 DAC 将传输在 100kHz;所以我将 DAC 的传输速度设置为 400kHz。当我连接 DAC 输出 t o 3.5mm breakout/earbuds 我只听到噼啪声,绝对没有"sound"。耳塞在我的笔记本电脑上工作得很好,所以问题出在其他地方。 DAC 肯定会输出一个电压(网页上的三角波文件有效),我尝试了两个 3.5mm 分线板(可能是劣质焊接工作?)。 有没有人知道问题可能是什么或者我可以采取哪些步骤来找出错误是什么?我的猜测是传输 rates/bit 传输不一致,但这就是我想通过询问找出的。
在 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);
}
}
注意:忽略 LED 代码行,那只是为了了解我 运行 程序中的数据流。
有很多原因会导致音频出现噼啪声,尤其是在此类设置中(我相信您已经知道)。
几件事:
- 虽然在示例中您 link 它说要写
TWBR = 12
,但如果您查看 source code of the library 它会检查 #define TWBR
宏。所以我会改变你的代码,让 #define TWBR 12
在你的 setup()
函数之前。
- 您多久接收一次蓝牙数据?当您没有收到任何数据时,您似乎没有处理正在发生的事情,DAC 只会冻结您上次写入的任何值
- 确保您调用的地址正确 -> 您没有在设置中提及 A0 是否连接到 VCC。
First, be sure to call begin(addr) where addr is the i2c address
(default is 0x62, if A0 is connected to VCC its 0x63)
旁注:
- 根据我的经验,人们尝试 avoid using
atol()
. If you look at adafruit's examples 他们使用 pgm_read_word()
。
- 12 位对于音频播放来说不是很高的音频分辨率,因此大多数音频都会失真(非常基本的数字声音除外)
- 确保您从 Python 发送的音频可以播放(我不知道您的测试用例是什么)
最后可能总是焊接,但我认为这不太可能。
我混合编写了 python 代码和 arduino 代码来完成这项工作。 我正在向 HC-05 蓝牙 module/arduino uno 发送一组数字(音频)(它们都设置为 通过串口以 115200 波特进行通信,至少这是我为两者设置的(Serial.begin(x) for arduino 和通过 AT 命令 for HC-05)范围从 0-4095 为来自 python 的字符串通过蓝牙(bluetoothsocket(RFCOMM))。它们在 arduino 中逐个字符地接收并读入一个数组,该数组将 char 数组转换为单个原始无符号整数。到那里 我可以确认字符已被接收并明确构造成整数。那些整数值通过I2C(SDA(A4)/ SLC( A5) arduino 上的引脚。在网页上 (https://learn.adafruit.com/mcp4725-12-bit-dac-tutorial/using-with-arduino) 它说要提高传输速度你在 arduino 脚本中写这个 "TWBR = 12; // 400 khz",我猜。否则 DAC 将传输在 100kHz;所以我将 DAC 的传输速度设置为 400kHz。当我连接 DAC 输出 t o 3.5mm breakout/earbuds 我只听到噼啪声,绝对没有"sound"。耳塞在我的笔记本电脑上工作得很好,所以问题出在其他地方。 DAC 肯定会输出一个电压(网页上的三角波文件有效),我尝试了两个 3.5mm 分线板(可能是劣质焊接工作?)。 有没有人知道问题可能是什么或者我可以采取哪些步骤来找出错误是什么?我的猜测是传输 rates/bit 传输不一致,但这就是我想通过询问找出的。
在 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);
}
}
注意:忽略 LED 代码行,那只是为了了解我 运行 程序中的数据流。
有很多原因会导致音频出现噼啪声,尤其是在此类设置中(我相信您已经知道)。
几件事:
- 虽然在示例中您 link 它说要写
TWBR = 12
,但如果您查看 source code of the library 它会检查#define TWBR
宏。所以我会改变你的代码,让#define TWBR 12
在你的setup()
函数之前。 - 您多久接收一次蓝牙数据?当您没有收到任何数据时,您似乎没有处理正在发生的事情,DAC 只会冻结您上次写入的任何值
- 确保您调用的地址正确 -> 您没有在设置中提及 A0 是否连接到 VCC。
First, be sure to call begin(addr) where addr is the i2c address (default is 0x62, if A0 is connected to VCC its 0x63)
旁注:
- 根据我的经验,人们尝试 avoid using
atol()
. If you look at adafruit's examples 他们使用pgm_read_word()
。 - 12 位对于音频播放来说不是很高的音频分辨率,因此大多数音频都会失真(非常基本的数字声音除外)
- 确保您从 Python 发送的音频可以播放(我不知道您的测试用例是什么)
最后可能总是焊接,但我认为这不太可能。