通过蓝牙 - > arduino-> DAC-> 3.5mm分线板 - >耳机发送音频时发出惊人的音频。不知道原因

问题描述 投票:0回答:1

我写了一个混合的python代码和arduino代码来使这项工作。我正在向HC-05蓝牙模块/ arduino uno发送一组数字(音频)(这些都设置为通过115200波特的串行通信,至少这是我为两者设置的(Serial.begin(x)for arduino和HC-05的AT命令,范围从0到4095,作为来自python的字符串,通过蓝牙(bluetoothsocket(RFCOMM))。它们在arduino中逐字符接收,并读入一个数组,将char数组转换为单个原始unsigned int。到那里我可以确认接收到字符并且明确地构造成整数。这些整数值通过I2C(arduino上的SDA(A4)/ SLC(A5)引脚传递到12位DAC。网页(https://learn.adafruit.com/mcp4725-12-bit-dac-tutorial/using-with-arduino)它说要增加传输速度你在arduino脚本中写这个“TWBR = 12; // 400 khz”,我猜。否则DAC将以100kHz发送;所以我设置了DAC的传输速度达到400kHz。当我将DAC输出连接到3.5mm的分线/耳塞时,我只能听到噼里啪啦,绝对没有“声音”。耳机在我的笔记本电脑上运行得很好,所以问题就是其他问题。 DAC绝对输出一个电压(来自网页工作的三角波文件),我尝试了两个3.5mm的分线板(可能是劣质的焊接工作?)。有没有人知道问题可能是什么,或者我可以采取哪些步骤来找出错误是什么?我的猜测是传输速率/位传输不在某处,但这就是我想通过询问找到的东西。

在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代码行,这只是为了在运行程序时了解数据流。

bluetooth arduino serial-port i2c baud-rate
1个回答
0
投票

导致音频噼啪声的原因有很多,特别是在这些设置中(我相信你已经知道了)。

有几件事:

  1. 虽然在你链接的例子中说写TWBR = 12,如果你看看source code of the library它会检查#define TWBR宏。所以我会在你的#define TWBR 12函数之前更改你的代码以使setup()
  2. 你多久收一次蓝牙数据?当您没有收到数据时,看起来您正在处理正在发生的事情,DAC将会冻结您上次写入的任何值
  3. 确保您正在拨打正确的地址 - >您没有提及A0是否在您的设置中连接到VCC。

首先,请务必调用begin(addr),其中addr是i2c地址(默认为0x62,如果A0连接到VCC,则为0x63)

附注:

  • 根据我的经验,人们尝试使用avoidatol()。如果你看看adafruit's examples,他们会使用pgm_read_word()代替。
  • 12位音频播放的音频分辨率不是很高,因此大多数音频都会失真(非常基本的数字声音)
  • 确保您从Python发送的音频是可播放的(我不知道您的测试用例是什么)

最后它总是焊接,但我认为这不太可能。

© www.soinside.com 2019 - 2024. All rights reserved.