STM32 f103搭配LM386声音传感器实现简单音乐识别

发布时间:2023-03-07  

1.前言

2019年12月初,有一个中国机器人技能大赛中的双足机器人比赛项目,意思是机器人识别音乐跳对应节奏的舞蹈,五首音乐随机抽三首歌曲,音乐停,机器人停。

新比赛,新项目,难度自然有,坑也不少。希望这篇文章能给大家带来一点帮助。废话不多说,进入正题。


2.效果

(健康歌)每100ms采样一次,歌曲前5秒内共测50次数据,重复12组


(卡路里) 重复7组


可以看出一首歌经过多次测值,其采样值数组呈现出有规律的特征;不同的歌曲的特征也有较好的区分度。达到了区分歌曲的效果。下面讲讲具体实现步骤。


3.思路

  1. href="">做什么:识别不同音乐,识别声音有无。

  2. href="">怎么做:a.利用传感器判断出音乐或声音(网上资料极少); b.利用手机app听歌识曲,返回对应值(app感觉太难) ; c.检测到声音就随机跳(下策,保命方案); d.遥控(作弊);   e.人在旁边说出歌曲有关的词语,语音模块识别(干扰大)

  3. ref="">我的选择:a+c

  4. ref="">技术路线:

4.硬件

找到一块具有模拟量输出功能的声音传感器模块,我用的是下面这块,感觉不错,其他的没尝试过。将f103芯片的A1脚与模块的AOUT引脚相连(奇怪的是我与DOUT相连也会得到和AOUT差不多的模拟量值,很迷,有大佬懂的话麻烦指出一下问题所在)。



5.软件

利用正点原子的adc.c文件来处理模拟量值,并最终返回给Get_Adc_Average()函数


x

1
//初始化ADC
2
//这里我们仅以规则通道为例
3
//我们默认将开启通道0~3
4
void Adc_Init(void)
5
{
6
ADC_InitTypeDef ADC_InitStructure;
7
GPIO_InitTypeDef GPIO_InitStructure;
8
//使能ADC1通道时钟
9
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );
10
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
11
//PA1 作为模拟通道输入引脚
12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入引脚
14
GPIO_Init(GPIOA, &GPIO_InitStructure);
15

16
ADC_DeInit(ADC1); //复位ADC1
17

18
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
19
//ADC工作模式:ADC1和ADC2工作在独立模式
20
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//模数转换工作在单通道模式
21
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//模数转换工作在单次转换模式
22
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
23
//转换由软件而不是外部触发启动
24
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
25
ADC_InitStructure.ADC_NbrOfChannel = 1;//顺序进行规则转换的ADC通道的数目
26
ADC_Init(ADC1, &ADC_InitStructure);
27
//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
28

29

30
ADC_Cmd(ADC1, ENABLE);//使能指定的ADC1
31

32
ADC_ResetCalibration(ADC1);//使能复位校准
33

34
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
35

36
ADC_StartCalibration(ADC1); //开启AD校准
37

38
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
39

40
//ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能
41
}
42

43
//获得ADC值
44
//ch:通道值 0~3
45
u16 Get_Adc(u8 ch)
46
{
47
//设置指定ADC的规则组通道,一个序列,采样时间
48
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
49
//ADC1,ADC通道,采样时间为239.5周期
50

51
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能
52

53
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
54

55
return ADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果
56
}
57

58
u16 Get_Adc_Average(u8 ch,u8 times)
59
{
60
u32 temp_val=0;
61
u8 t;
62
for(t=0;t63
{
64
temp_val+=Get_Adc(ch);
65
delay_ms(5);
66
}
67
return temp_val/times;
68
}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>