AudioSwitcher-似乎不需要自动化的自动化


前言


我在家有几套好的苏联扬声器系统。 但是这种技术已经很老了,根本无法通过遥控器或自动打开,而是不断地接近声音放大器,然后偷偷地打开/关闭它。 我解决了这个问题。 最初,买了Arduino,并完成了项目,但是工作质量不适合我,因此该项目已重做STM32F103C8。 结果,我得到了一个具有4个音频输入,1个音频输出,220V输入和220V输出的设备。 如果有至少一个活动音频输入,则电压会出现在220V输出处,从而包括一个声音放大器,并且活动音频通道会传输到输出。

发展挑战


看起来很简单:如果ADC接收的信号不为0,则认为该通道为活动通道。 几乎所有情况都是如此,但是仅当您打开音频源并关闭其声音时,它才起作用。 关闭时,不同的设备会产生不同的干扰,因为它们没有完全断电。 而且,如果声音来源不好,则微控制器可能会在声音关闭时拾取噪音,而且声音很强。 而这恰恰是源干扰,STMka在我的外部声卡上看不到干扰,此外,它的安静声音为0。

你自己怎么做?


让我们首先决定我们需要什么。 我不会写成本,因为 这很大程度上取决于您的位置。

我们需要什么:

  • 电路板
  • 程序员ST-Link v2
  • 1个STM32f103C8芯片
  • 4个继电器,用于将输入音频通道切换到输出
  • 1个继电器,用于切换220V以打开放大器
  • AC-DC降压转换器220V-5V(可以从旧电话中获取)
  • 电源线和连接器,用于为我们的设备和放大器供电
  • 出口
  • 电阻器,电容器和其他小物件

自然,我们需要音频线和带插孔的minijack插头。

我想重点介绍继电器的选择...如果选择220V继电器时一切都非常清楚:它应该能够切换220V交流电压并受3.3V的控制。 声音继电器的选择不是那么简单。 并非每个继电器,即使是固态继电器,也不会在输出端产生干扰,这对我们来说非常重要。 我住在明斯克,找不到合适的东西,而且价格也不便宜,因此从一家中国知名商店订购了4台PVT322A继电器。 也许在您所在的地区,您可以找到更便宜的东西。

方案和接线


自从我们开始以来,我们将继续研究硬件功能。 在您可以在Eagle文件夹的存储库中找到的图表中,需要为继电器选择限流电阻(R4-7)。 就我而言,是30欧姆。 还有一个L1线圈:选择任何可以消除高频噪声的滤波器。

您可以在PCBWAY或JLCPCB上订购电路板。 他们的价格很低,我从JLCPCB订购,他们只给我开了2美元。 订购印刷电路板时,您将需要gerber文件,您可以在同一文件夹中找到所有文件,也可以自己生成。

让我们继续进行软件部分


我不会谈论如何将编程器连接到计算机,安装编程环境和驱动程序,因为 这些说明很多,并且非常容易使用。 在我的电路上为程序员提供了输出。 我使用了Visual Studio 2017 + VisualGDB。 从同一存储库下载项目后我们可以打开项目。 立即转到Settings.cpp文件。

Settings.cpp
#define DEBUG0 0//init USART and send all measurement values #define DEBUG1 1//init USART and send information about recognition music or not #define DEBUG2 0//just init USART #define MaxEqualToZeroValue 3 //the value which equal or less is equated to zero #define MaxAvarageForNoise (float)0.4//this is max avarage of measurement values so that the sound is considered noise for NOT active channel #define MaxAvarageForActiveNoise (float)0.06//this is max avarage of measurement values so that the sound is considered noise for active channel #define CountOfConsecutiveZeroValueForNoise 250//if count of consecutive zero values bugger it that sound is equated to noise #define MinCountOfZeroValue 550//it's minimum count of zero values to equate to music(not consecutive) #define USE_LED 1 #define LED_GPIO_PERIPH RCC_APB2Periph_GPIOC #define LED_GPIO_GROUP GPIOC #define LED_GPIO_PIN GPIO_Pin_13 #define USE_AMP 1 #define AMP_GPIO_PERIPH RCC_APB2Periph_GPIOB #define AMP_GPIO_GROUP GPIOB #define AMP_GPIO_PIN GPIO_Pin_12 


该文件中的所有设置均已记录在案,但无论如何我们将在每个设置处停止。

 #define DEBUG0 0 #define DEBUG1 1 #define DEBUG2 0 

如果我们将一个单元分配给DEBUG0,我们的设备将停止执行任何操作,除了它将以SerialPortPlotter可以通过UART“消化”的格式输出从音频输入接收的值。

如果您分配了DEBUG1单元,那么该设备将已经可以正常使用,但是会显示一些有关UART工作的信息。 所有这些都是调试所必需的。

分配DEBUG2仅会给您初始化UART。 如果您不明白为什么会这样,那就不要:-)

 #define MaxEqualToZeroValue 3 

接下来,我们有一个参数,其对应的值或小于等于零的值将被视为零。 如前所述,某些声音源质量较差且非常嘈杂。

 #define MaxAvarageForNoise (float)0.4 

如果音频通道当前处于非活动状态(即当前未切换到输出的通道),并且此通道上一个测量周期的平均测量值小于此参数的值,则认为该通道没有声音。

 #define MaxAvarageForActiveNoise (float)0.06 

仅对于当前活动的通道,此参数与上一个参数几乎相同。 事实是,当通道处于活动状态并且放大器正在工作时,音频通道的电压会下降。 而且,如果您忽略此设置,则即使电线未连接到任何设备,设备也会认为声音正常。

 #define CountOfConsecutiveZeroValueForNoise 250 

此参数仅用于优化CPU消耗。 如果设备连续达到预定的零个数,则认为该信号不是声音。

 #define MinCountOfZeroValue 550 

这是一个重要的设置。 有些设备在关闭时会产生奇怪的噪音,但我强调了其中的一个共同因素:它们很少会降为零值。 这就是为什么我必须输入此参数的原因。 如果每个测量周期的零值数量小于指定值,则该信号被视为噪声。

 #define USE_LED 1 #define LED_GPIO_PERIPH RCC_APB2Periph_GPIOC #define LED_GPIO_GROUP GPIOC #define LED_GPIO_PIN GPIO_Pin_13 #define USE_AMP 1 #define AMP_GPIO_PERIPH RCC_APB2Periph_GPIOB #define AMP_GPIO_GROUP GPIOB #define AMP_GPIO_PIN GPIO_Pin_12 

对于已经对微控制器进行编程的人来说,此块是非常容易理解的。 他选择LED所处的引脚,并选择输出到放大器控制继电器。 如果您不更改我的方案,则不需要这些参数。

让我们继续以下设置:

通过在函数的开头打开main.cpp文件
 int main() 
您将找到一堆变量的定义。

让我们更详细地讨论这一点。 有许多参数负责微控制器的硬件配置。 我们不会碰他们。

 const uint8_t channelsCount = 2; 

这是要使用的音频输入通道的数量。

 const uint8_t countOfIterationsForSwitch = 5; 

更改主动/被动状态所需的测量周期数。

 const uint8_t ADCSampleTime = ADC_SampleTime_239Cycles5; 

此参数负责测量的质量。 它设置为最大,我不建议更改它。

 const uint16_t measurementsDuration = 2000; 

这是将执行一个测量周期的时间(以毫秒为单位)。

 const uint32_t measurementFrequencies[] = { 1000, 1000, 1000, 1000 }; 

我不知道为什么,但是我实现了一个功能,使我可以测量每个通道具有不同频率的输入通道。 也许有人会需要此功能。

结论


好,仅此而已。 我已经描述了所有必要的设置。 剩下的只是组装电路,编译项目,将固件填充到微控制器中而感到高兴。

总而言之,我想说的是,您不能只是将输入音频线“不卡在”任何东西中,而是需要将其插入任何设备或以连接所有触点的迷你插孔的形式插入。


如果您的声源非常好,则可以设置较低的设置,但是切换声音状态可能需要将其关闭(而不是从电源插座)。 也许有一天,我将添加一个指向该案例的3D模型的链接,但是到目前为止,我没有3D打印机,并且案例目前如此。 但这只是暂时的:3D打印机已经在运行了:-)


这是我的第一篇文章,我将很高兴接受任何合理的批评。 我知道这不是杰作,但我已尽力了。

感谢您的阅读。

UPD1:在文章中添加了原理图和接线图。

UPD2:向存储库添加了原理图和接线图像,并在代码中添加了新注释。

Source: https://habr.com/ru/post/zh-CN467511/


All Articles