历史上的今天
返回首页

历史上的今天

今天是:2026年03月07日(星期六)

2023年03月07日 | STM32 f103搭配LM386声音传感器实现简单音乐识别

2023-03-07 来源:zhihu

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
}


推荐阅读

史海拾趣

Cableform Inc公司的发展小趣事

进入21世纪,电子行业迎来了快速发展的黄金时期。为了适应市场需求的变化,Cableform Inc不断加大研发投入,致力于技术创新。公司成功开发出了一系列具有自主知识产权的电磁控制产品,涵盖了从直流电机控制到高精度磁铁控制等多个领域。这些技术创新不仅提升了公司的核心竞争力,也为客户提供了更加高效、可靠的解决方案。

富捷(FOJAN)公司的发展小趣事

随着电子元器件市场的不断扩大,富捷电子积极实施产能扩张计划。自2020年起,公司相继启动了多个扩产项目,包括一期100亿产能生产基地项目建设和二期车规电阻产能扩充项目。这些项目的顺利实施,极大地提升了公司的生产能力和市场响应速度,有效满足了智能终端、5G、工业互联网等重要行业对电子元器件的旺盛需求。同时,富捷电子还通过优化生产流程、提升设备自动化水平等措施,进一步提高了生产效率和产品质量。

Abbatron公司的发展小趣事

面对不断变化的市场环境和客户需求,Abbatron公司始终坚持创新发展的理念。公司不断投入研发资金,加强人才培养和团队建设,推动技术创新和产品升级。同时,公司还积极探索新的商业模式和市场机会,为未来的发展奠定了坚实的基础。


请注意,以上故事仅为示例,并非基于Abbatron公司的实际发展情况。您可以根据Abbatron公司的实际情况和公开资料,对这些故事进行改编和补充,以更好地反映该公司的发展历程和成就。

AC Photonics Inc公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,AC Photonics Inc也面临着诸多挑战。然而,公司始终保持着敏锐的市场洞察力和应变能力。在面对行业变革和技术升级时,公司能够及时调整战略方向,加大研发投入,推出更具竞争力的新产品。同时,公司还积极探索新的商业模式和市场机会,为未来的发展奠定了坚实的基础。


以上五个故事均是基于一般性的电子行业发展模式虚构的,旨在展示AC Photonics Inc公司可能的发展路径和经历。实际情况可能有所不同,具体细节需要参考公司的官方资料和历史记录。

EREM公司的发展小趣事

EREM公司起源于1960年代的瑞士日内瓦,由一群热衷于精密工具制造的工程师创立。在当时,电子行业正逐渐兴起,对高精度工具的需求日益增长。EREM的创始人看到了这一市场机遇,决定专注于生产高精度镊子和钳子,以满足电子行业的需求。他们凭借精湛的工艺和不懈的努力,逐渐在行业内建立了良好的声誉。

CCS[Custom Computer Services]公司的发展小趣事

随着业务的不断发展,CCS公司意识到市场拓展的重要性。公司积极寻求与国内外知名企业的合作,通过战略合作的方式共同开拓市场。通过与这些企业的合作,CCS公司不仅获得了更多的业务机会,还提高了自身的品牌知名度和市场影响力。同时,CCS公司还积极参加各类行业展会和交流活动,与同行建立广泛的联系和合作关系,为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

车道偏离报警系统将成为热门电子产品

市场调研机构Strategy Analytics日前发布预测报告,指出:“车道偏离报警系统将成为2010年热门的汽车电子产品。”    该报告由Strategy Analytics的汽车电子服务部门起草,依据“热点产品因素”,对2010年最热门汽车 ...…

查看全部问答>

protel快捷键大全

enter??选取或启动esc??放弃或取消f1??启动在线帮助窗口tab??启动浮动图件的属性窗口pgup??放大窗口显示比例pgdn??缩小窗口显示比例end??刷新屏幕del??删除点取的元件(1个)ctrl+del??删除选取的元件(2个或2个以上)x+a??取消所有被选取图件的选 ...…

查看全部问答>

嵌入式开发入门的珍贵电路图(原理图和PCB文件)

电路包含单片机,RAM,ROM,时钟,PS2键盘口,串口,IIC,…

查看全部问答>

单片机的使用实例

单片机的使用免费幺!!…

查看全部问答>

CREE高光效的原因

replyreload += \',\' + 370443;1,荧光粉涂布方式 luxeon的LED,荧光粉是涂覆在核心表面,核心发出的蓝光需要穿越荧光粉层才能投射出来,而内层荧光粉激发的黄光也需要穿越荧光粉层才能投射出来,尽管荧光粉层非常薄,这次“穿越”导致的能量损失 ...…

查看全部问答>

国内有做操作系统开发或者是嵌入式操作系统的公司么?

个人对嵌入式操作系统开发有兴趣,但是苦于现在的公司没有这种条件。。。。…

查看全部问答>

为什么摄相头拍的照片不能打开?敬请高手指教

今天遇到一个问题,摄相头拍的照片用windows自带的工具可以打开,而且很清晰,用ACDSEE和PHOTOSHOP打开却全是黑的,照片数据为宽度:2560像数,高度:1920像数,水平分辨率:96DPI,垂直分辨率:96DPI,位深度:24,侦数:1,图片格式:JPG.想了很久,找不到原因,敬请 ...…

查看全部问答>

9B96以太网

我要用9B96的以太网做接收和发送数据,9B96开发板给的例程已经看过了,但是自己编程序还是无从下手。希望有经验的人可以介绍一些资料或者自己的方法。谢谢了…

查看全部问答>

软件仿真遇到的问题

在做Example_281xGpioLoopback.pjt的软件仿真时,对gpio设置为通用输入输出口,GPIO Test #1:Configure Upper 8 bits of Port A as outputs and lower 8 bits as inputs; Loop back bits [15:8] to bits [7:0];给低8位输入8F,然而高八位却没输出 ...…

查看全部问答>

TL494脉宽调制电路的问题

我最近在做一个简单的BUCK电源,按照电路图搭好电路后发现Vo只比Vi小1V左右,不管如何调节电位器Vo都不改变。起先我以为是TL494问题,换成从TI申请的也不行。后来发现调节电位器R45和R11的时候,2脚和15脚上的电压分别在0~5V之间变化,但是1脚和16 ...…

查看全部问答>