首页 > 分享 > 开源!升级你的桌面宠物(接入语音模块)

开源!升级你的桌面宠物(接入语音模块)

原视频:好,升级你的桌面宠物!_哔哩哔哩_bilibili

必读:此开源文章为第一篇(开源!自制一个桌面宠物(STM32CUBEMX HAL库 PWM波 小项目)_stm32桌宠-CSDN博客)的续作,第一篇所制作的桌面宠物仅能通过手机app进行蓝牙遥控,而升级版的桌面宠物已如视频中可以语音和蓝牙同时控制。因两版本大体结构和原理相似,故本文不再重复第一篇文章的内容。重在开源更新后的stm32代码和语音模块的程序设计,以及整体结构的简单介绍。

开源协议严禁商用;以视频或其他形式发布到互联网上的(包括成果和资料等),必须署名作者“有出息的男孩_”。

 注意:语音模块我使用的是ASRPRO(核心板和开发板都可以,开发板更方便),利用自带的两个串口,实现和单片机、蓝牙模块的通信。使用这种ASRPRO核心板

的小伙伴需注意,请仔细看核心板原理图的电源设计部分是否有缺陷,5V口要额外需串接一个4.7欧姆的电阻防止浪涌和尖峰导致芯片烧毁。

这是官方公告: 

软件运行框图: 

STM32程序修改: 

原本不需要修改,但是我无论怎么试,语音模块都发不了正确的数据格式,那就干脆给让32多加点判断类型。

例如:

原程序判断为

if(move_mode == 8){//前进

加入语音模块的指令‘8’ ,修改为

if(move_mode == 8 || move_mode == '8'){//前进

修改后的整个main文件:

#include "main.h"

#include "tim.h"

#include "usart.h"

#include "gpio.h"

#include <stdio.h>

#include "oled.h"

#include "bmp.h"

uint8_t move_mode = 0;

uint8_t flag = 0;

#define move_delay 150

#define move_speed 4

void SystemClock_Config(void);

void Rbt_Init(void);

uint16_t angle(uint8_t angle);

void Rbt_attention(void);

void move_forward(void);

void move_behind(void);

void move_right(void);

void move_left(void);

void move_swing(void);

void move_stretch(void);

void move_sleep(void);

void move_dance(void);

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

if(move_mode == 8 || move_mode == '8'){

OLED_Clear();

OLED_DrawBMP(0,0,128,8,BMP2);

}

else if(move_mode == 2 || move_mode == '2'){

OLED_Clear();

OLED_DrawBMP(0,0,128,8,BMP2);

}

else if(move_mode == 4 || move_mode == '4'){

OLED_Clear();

OLED_DrawBMP(0,0,128,8,BMP4);

}

else if(move_mode == 6 || move_mode == '6'){

OLED_Clear();

OLED_DrawBMP(0,0,128,8,BMP3);

}

else if(move_mode == 'A' || move_mode == '7'){

OLED_Clear();

OLED_DrawBMP(0,0,128,8,BMP2);

}

HAL_UART_Receive_IT(&huart1, &move_mode, 1);

}

int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_TIM2_Init();

MX_USART1_UART_Init();

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);

Rbt_Init();

HAL_UART_Receive_IT(&huart1, &move_mode, 1);

HAL_Delay(500);

OLED_Init();

OLED_Clear();

OLED_DrawBMP(0,0,128,8,BMP6);

while (1)

{

if(move_mode == 8 || move_mode == '8'){

OLED_DrawBMP(0,0,128,8,BMP2);

move_forward();

printf("forwardrn");

HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

flag=0;

}

else if(move_mode == 2 || move_mode == '2'){

OLED_DrawBMP(0,0,128,8,BMP2);

move_behind();

printf("behindrn");

HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

flag=0;

}

else if(move_mode == 4 || move_mode == '4'){

move_left();

printf("leftrn");

HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

flag=0;

}

else if(move_mode == 6 || move_mode == '6'){

OLED_DrawBMP(0,0,128,8,BMP3);

move_right();

printf("rightrn");

HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

flag=0;

}

else if(move_mode == 5 || move_mode == 'C' || move_mode == '1'){

OLED_DrawBMP(0,0,128,8,BMP1);

Rbt_attention();

printf("stoprn");

HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

flag=0;

}

else if(move_mode == 'A' || move_mode == '7'){

OLED_DrawBMP(0,0,128,8,BMP2);

move_swing();

printf("swingrn");

HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

flag=0;

}

else if(move_mode == 'B' || move_mode == '9'){

if(flag==0){

OLED_DrawBMP(0,0,128,8,BMP2);

move_stretch();

printf("stretchrn");

OLED_DrawBMP(0,0,128,8,BMP5);

HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

flag=1;

}

}

else if(move_mode == 'D' || move_mode == '3'){

if(flag==0){

move_sleep();

printf("sleeprn");

OLED_DrawBMP(0,0,128,8,BMP6);

flag=0;

}

}

else if(move_mode == '0'){

move_dance();

printf("dancern");

HAL_Delay(200);

OLED_DrawBMP(0,0,128,8,BMP2);

HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

}

}

}

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

{

Error_Handler();

}

}

void Rbt_Init(void)

{

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(15));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(160));

HAL_Delay(100);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(167));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(20));

HAL_Delay(100);

}

uint16_t angle(uint8_t angle)

{

return angle*2000/180+500;

}

void Rbt_attention(void)

{

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90));

HAL_Delay(100);

}

void move_forward(void)

{

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(135));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(45));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(45));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(135));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(135));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(45));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(45));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(135));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90));

HAL_Delay(move_delay);

}

void move_behind(void)

{

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(45));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(135));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(135));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(45));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(45));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(135));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(135));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(45));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90));

HAL_Delay(move_delay);

}

void move_right(void)

{

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(45));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(45));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(135));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(135));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90));

HAL_Delay(move_delay);

}

void move_left(void)

{

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(135));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(135));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(45));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(45));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90));

HAL_Delay(move_delay);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90));

HAL_Delay(move_delay);

}

void move_swing(void)

{

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(130));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(130));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(50));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(50));

HAL_Delay(200);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(50));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(50));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(130));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(130));

HAL_Delay(200);

}

void move_stretch(void){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90));

if(TIM2->CCR1<angle(155) && TIM2->CCR3>angle(25)){

for(uint8_t i=0;i<70;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90+i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90-i));

HAL_Delay(move_speed);

}

HAL_Delay(1000);

for(uint8_t i=0;i<70;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(160-i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(20+i));

HAL_Delay(move_speed);

}

for(uint8_t i=0;i<65;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90+i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90-i));

HAL_Delay(move_speed);

}

for(uint8_t i=0;i<20;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90-i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90+i));

HAL_Delay(move_speed);

}

HAL_Delay(1000);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(140));

HAL_Delay(1000);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(178));

HAL_Delay(500);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(140));

HAL_Delay(500);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(178));

HAL_Delay(500);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(140));

HAL_Delay(500);

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(70));

}

}

void move_sleep(void){

if(TIM2->CCR3<angle(160) && TIM2->CCR1>angle(20)){

for(uint8_t i=0;i<75;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90-i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90+i));

HAL_Delay(move_speed);

}

}

if(TIM2->CCR2<angle(160) && TIM2->CCR4>angle(20)){

for(uint8_t i=0;i<75;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90+i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90-i));

HAL_Delay(move_speed);

}

}

}

void move_dance(void)

{

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90));

if(TIM2->CCR1<angle(160) && TIM2->CCR2<angle(160)){

for(uint8_t i=0;i<75;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(90+i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(90+i));

HAL_Delay(move_speed);

}

for(uint8_t i=0;i<75;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,angle(165-i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,angle(165-i));

HAL_Delay(move_speed);

}

}

if(TIM2->CCR3>angle(20) && TIM2->CCR4>angle(20)){

for(uint8_t i=0;i<75;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(90-i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(90-i));

HAL_Delay(move_speed);

}

for(uint8_t i=0;i<75;i++){

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,angle(15+i));

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4,angle(15+i));

HAL_Delay(move_speed);

}

}

}

void Error_Handler(void)

{

__disable_irq();

while (1)

{

}

}

#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)

{

}

#endif /* USE_FULL_ASSERT */

语音模块程序设计 :

使用天问block进行开发,积木编程。

1.设置一个全局变量,用于运动指令的存储

 2. 配置语音

3.配置系统初始化,打开两个串口,打开定时器

4.配置语音指令对应的操作

 5.配置定时器任务,用于蓝牙模块数据的接收和运动指令的发送

欢迎加入技术交流群: 897255910                 /            若被拒绝或长时间进不去请B站私信我喔

相关知识

开源!升级你的桌面宠物(接入语音模块)
推荐开源项目:L2dPetForMac —— 宠物养成与桌面伴侣
开源之魅:桌面宠物软件在WPF应用中的无缝集成
AI智能语音宠物语言识别软件下载
语音识别
C#开源桌宠模拟器:WPF中内置互动虚拟宠物
推荐开源项目:DesktopPet
Slash/基于pyqt5的原神桌面宠物
赛博宠物:桌面娱乐机器人的新革命
一款非常萌的桌面工具

网址: 开源!升级你的桌面宠物(接入语音模块) https://m.mcbbbk.com/newsview465812.html

所属分类:萌宠日常
上一篇: 狗狗剃毛剃到一半溜了,宠物店发出
下一篇: 《狗狗博客第一季》高清完整版免费