通过蓝牙-> arduino-> DAC-> 3.5mm接线板->耳机发送音频时,声音不清晰。不知道原因

时间:2018-07-24 04:47:15

标签: bluetooth arduino serial-port i2c baud-rate

我编写了python代码和arduino代码的组合来完成这项工作。 我正在向 HC-05蓝牙模块/ arduino uno 发送一组数字(音频)(它们都设置为通过串行方式以115200波特的速率进行通信< / strong>,至少这是我为arduino和通过HC-05的AT命令设置的(Serial.begin(x)),范围为0-4095,它们是从python到蓝牙(bluetoothsocket(RFCOMM))的字符串。会在arduino中逐个字符地被接收并读入一个数组,该数组会将char数组转换为单个原始的unsigned int。到此为止我可以确认接收到char,并且肯定将其构造为整数整数值通过I2C传递到12位DAC中(arduino上的SDA(A4)/ SLC(A5)引脚。)在网页(https://learn.adafruit.com/mcp4725-12-bit-dac-tutorial/using-with-arduino)上表示要增加我猜你在arduino脚本中写为“ TWBR = 12; // 400 khz”的传输速度,否则DAC将以100kHz传输; 所以我将传输速度设置为DAC为400kHz 。当我将DAC输出连接到3.5mm分支/耳塞时,我只听到crack啪声,绝对没有“声音” 。耳塞可以在我的笔记本电脑上正常工作,所以问题出在其他方面。 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代码行,只是为了在运行程序时对数据流有所了解。

1 个答案:

答案 0 :(得分: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)

旁注:

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

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