基于STM32语音控制的MP3播放器
材料
STM32F103C8T6最小系统板、LD3320语音模块、Mini MP3 播放器模块、喇叭、读卡器、SD卡、面包板、按键、杜邦线、跳线若干
接线图说明
这里我也是网上找的图片虽然是Arduino的但是不影响STM32一样接的,底下也有直观的原理图
剩下的其实就简单了,下载歌曲然后按格式取名
一线串口 MP3 文件命名规则:
文件名须为 5 位数字,该五位数既是该文件的曲目号。选曲播放指令(0xb)靠此
数字来识别。 如下图所示。
如使用其它形式的命名,则无法使用选曲播放指令播放该文件,文件需要放在根
目录下,即打开盘符即可。
命令格式说明
例 1:设置音量为 20
步骤如下: 清空数字->音量 20->“设置音量”控制指令。
发送代码 0x0A->0x02->0x00->0x0C
使用单片机发送函数如下:
SendData(0x0a);
SendData(0x02);
SendData(0x00);
SendData(0x0c);
使用多字节控制指令前,最好先发送”清空数字”指令,再发送新的数字。
例 2:选曲目号 2 播放
步骤如下: 清空数字->曲目号->“选曲播放”控制指令。
发送代码 0x0A->0x02->0x0b
使用单片机发送函数如下:
SendData(0x0a);
SendData(0x02);
SendData(0x0b);
选曲目号 15 播放
SendData(0x0a);
SendData(0x01);
SendData(0x05);
SendData(0x0b);
例 3:开始播放
步骤如下: “开始播放”控制指令。
发送代码 0x11 。只需发送一个 0x11 即可。
使用单片机发送函数如下:
SendData(0x11);
上面这些商家的手册上都有不过防止大家不想看那么繁琐我就整理了一下,如果有遗漏请大家看商家的资料
代码
第一步就是 串口配置
我这里配置了串口1
void Serial_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);USART_Cmd(USART1, ENABLE);
}
串口发送函数
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
第二步按键配置
void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);
}uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);Delay_ms(20);KeyNum = 1;}if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);Delay_ms(20);KeyNum = 2;}return KeyNum;
}
最后主函数其实就是按照命令格式来我这里就做了个上一首和下一首
int main(void)
{OLED_Init();Key_Init();Serial_Init(); while (1){KeyNum = Key_GetNum();if (KeyNum == 1){Serial_SendByte(0x14);}if (KeyNum == 2){Serial_SendByte(0x15);}}
}
到这里基本就结束了
LD3320
接下去补充一下LD3320模块的内容,LD3320的内容商家给的资料就较为完善了,我这边就简单介绍一下使用
修改指令
LD3320可以带一级口令也可以不带,但这边为了一准确性个人建议是要一级指令的
下图就是具体修改指令的地方了
根据个人需求指令修改完毕之后,就可以去修改发送的数据了
就是当接收到关灯开灯之后发送的数据
这里画重点:这里的数据发送之后我也不知道什么原因它好像会有点不一样,所以我的建议是代码改完之后,用串口调试助手读一下发出来的数据,然后根据具体数据去写是STM32串口接收的判断代码,也可以避免大家后期有问题繁琐的调试。
接线图
这边是网上找的其他大佬的接线图大家参考一下
串口的TX和RX对应不要接错就可以
我调试的效果
LD3320
LD3320模块和MP3模块都调试完毕了
总结
最后只要把两个模块和单片机连接(通过一个串口就行,不理解可以看一看上面大佬的接线图),然后根据个人需求更改一下代码,一个基于STM32语音控制的MP3播放器就完成啦!
写的不太好,大家见谅。下一步是连上OLED屏显示歌曲名,后续会更新的!