当前位置:   article > 正文

毕业设计——基于STM32的智能家具系统(语音识别控制、步进电机、舵机)_毕设智能家居的远程语音控制推荐买什么开发版

毕设智能家居的远程语音控制推荐买什么开发版

智能家具系统分为两个不同版本系列:

①系列一:手机app远程控制、远程检测温湿度显示在app,(云平台)!!!!                   https://blog.csdn.net/m0_59113542/article/details/123737710

②系列二:语音识别控制-------本文章

硬件采购链接:

一、项目介绍

功能:离线语音识别模块SU-03T识别到我们不同的语音命令,改变不同引脚电平的状态,stm32读取引脚电平状态,完成相关的外设驱动。

本系统采用的SU-03T 是一款低成本、低功耗、小体积的离线语音识别模组,能快速应用于智能家 居。

目前市面上多用LD3320语音识别模块,这里先说一下我们为什么SU-03T,而不采用LD3320。

①:LD3320淘宝价格120左右,                SU-03T淘宝价格20左右

②:LD3320是c语音编程,                        SU-03T刷词条,只需简单配置

(这个各有各的好处,c语言编程,麻烦但是比较灵活,,,刷词条,简单,但是有一定的局限性)

③:识别率:!!!!!!!!!!!最重要的一点!!!!!!!!!!

语音识别,玩的不就是识别率吗

虽然现在用LD3320的比较多,但是它的语音识别率。emmm........还真的不敢恭维,我第一次用的时候,怎么喊都不管用,还以为是硬件坏了,捣鼓了一下午才发现,你得慢慢的说,语速得很慢。比如:打~~开~~灯~~光~~,这这这这......

而SU-03T,虽然便宜,但是很神奇,其识别率真的YYDS。

这个时候肯定有人不信了,说:“啊,,这人是不是商家的托啊,怎么可能便宜的还好用”!!本人还真不是托,只是一个踩过多次坑的孩子。我劝大家去淘宝买家秀看看,别看卖家秀,看买家秀!!!!!!!!!!!!LD3320很多买家秀都喊两次才能识别,而SU-03T离很远却能识别!!!!!神奇!!!!!

二、项目原理

智能家具吗,我们不可能真的去改造家里的家具(有钱的当我没说,楼主是很穷),所以我们采用模拟的方式,用单步电机加上一条履带模拟窗帘,舵机模拟开关门,LED灯模拟家里的灯,风扇.....大家还可以发挥想象,加一些其他的外设。

接下来就是各个外设的驱动:                                                                                                            首先是语音识别模块:SU-03T,可以初始化引脚电平,假如说为低吧,当识别到语音的时候可拉高电平,将stm32的某些引脚设置为下拉输入模式,与SU-03T的引脚相连,这不就完成了吗,,so  easy。

舵机是用PWM控制角度的,PWM不同的占空比对应不同的角度。

步进电机在前面的文章有详细的讲解及代码  链接:步进电机的原理及驱动

LED、与风扇就不多说了,无非就是将GPIO的输出高 输出低的问题!

三、程序实现

Servo_motor.c  舵机驱动

  1. #include "Servo_motor.h"
  2. #include "delay.h"
  3. //高级定时器1pwm输出初始化
  4. //arr:自动重装值(周期) psc:时钟预分频数
  5. void tim1_pwmInit(uint16_t arr, uint16_t psc)
  6. {
  7. GPIO_InitTypeDef GPIO_InitStructure;
  8. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  9. TIM_OCInitTypeDef TIM_OCInitStructure;
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 使能定时器1的外设时钟
  11. RCC_APB2PeriphClockCmd(TIM1_CH1_GPIO_CLK, ENABLE); //使能GPIO外设时钟使能
  12. //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  13. GPIO_InitStructure.GPIO_Pin = TIM1_CH1_PIN; //TIM_CH1
  14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16. GPIO_Init(TIM1_CH1_PORT, &GPIO_InitStructure);
  17. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
  18. TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频(预分频系数,如系统时钟为72Mhz,psc为7199,则分频后为72M/(7199+1)=10k ~~~0.1ms,,也就是说一个周期0.1ms,,,,在×arr就得到定时时间了)
  19. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  20. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  21. TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  22. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  23. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  24. //TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值(占空比)
  25. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
  26. TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  27. TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能
  28. TIM_Cmd(TIM1, ENABLE); //使能TIM1
  29. }
  30. void servo_init(void)
  31. {
  32. tim1_pwmInit(SERVO_TIM_ARR,SERVO_TIM_PSC);
  33. TIM_SetCompare1(TIM1,150); //使舵机恢复到中间位置
  34. }
  35. //0.5ms--0° 2.5ms--180°
  36. void servo_angle(uint16_t angle)
  37. {
  38. uint16_t pulse;
  39. //针对舵机可转角度限辐
  40. if(angle <= 5)
  41. angle = 5;
  42. if(angle >= 175)
  43. angle = 175;
  44. //将角度值转换为脉冲值
  45. pulse = (uint16_t)(50 + angle * 100/90.0); //此转换公式需根据pwm的arr及psc配置来做相应变化
  46. TIM_SetCompare1(TIM1, pulse);
  47. }
  48. void servo_debug(void)
  49. {
  50. uint8_t i;
  51. for(i = 0; i < 10; ++i)
  52. {
  53. delay_ms(500);
  54. servo_angle(80); //中间位置
  55. delay_ms(500);
  56. servo_angle(175);
  57. }
  58. }

Servo_motor.h

  1. #ifndef __Servo_motor_H
  2. #define __Servo_motor_H
  3. #include "stm32f10x.h"
  4. // 72M / (719 + 1) = 0.1M 故记一个数的时间为10us 定时周期:(1999 + 1* 10us = 20ms
  5. #define SERVO_TIM_ARR 1999
  6. #define SERVO_TIM_PSC 719
  7. #define TIM1_CH1_GPIO_CLK RCC_APB2Periph_GPIOA
  8. #define TIM1_CH1_PORT GPIOA
  9. #define TIM1_CH1_PIN GPIO_Pin_8
  10. void servo_init(void);
  11. void servo_angle(uint16_t angle);
  12. void servo_debug(void);
  13. void tim1_pwmInit(uint16_t arr, uint16_t psc);
  14. #endif //__TIMER_H

ASR.c语音识别

  1. #include "ASR.h"
  2. //初始化PB5和PE5为输出口.并使能这两个口的时钟
  3. //LED IO初始化
  4. void ASR_Init(void)
  5. {
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. RCC_APB2PeriphClockCmd(ASR_LED_CLK, ENABLE); //使能PG端口时钟
  8. GPIO_InitStructure.GPIO_Pin = ASR_LED_PIN |ASR_FS_PIN |ASR_stepper_motor_PIN |ASR_Servo_motor_PIN; //PA.1、PA.2 端口配置
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //输入下拉
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  11. GPIO_Init(ASR_LED_PORT, &GPIO_InitStructure);
  12. GPIO_ResetBits(ASR_LED_PORT, ASR_LED_PIN);
  13. GPIO_ResetBits(ASR_FS_PORT, ASR_FS_PIN);
  14. GPIO_ResetBits(ASR_stepper_motor_PORT, ASR_stepper_motor_PIN);
  15. GPIO_ResetBits(ASR_Servo_motor_PORT, ASR_Servo_motor_PIN);
  16. }

ASR.h

  1. #ifndef __ASR_H
  2. #define __ASR_H
  3. #include "sys.h"
  4. //led
  5. #define ASR_LED_PIN GPIO_Pin_1
  6. #define ASR_LED_PORT GPIOA
  7. #define ASR_LED_CLK RCC_APB2Periph_GPIOA
  8. //风扇
  9. #define ASR_FS_PIN GPIO_Pin_2
  10. #define ASR_FS_PORT GPIOA
  11. #define ASR_FS_CLK RCC_APB2Periph_GPIOA
  12. //步进电机(窗帘)
  13. #define ASR_stepper_motor_PIN GPIO_Pin_3
  14. #define ASR_stepper_motor_PORT GPIOA
  15. #define ASR_stepper_motor_CLK RCC_APB2Periph_GPIOA
  16. //开关门
  17. #define ASR_Servo_motor_PIN GPIO_Pin_4
  18. #define ASR_Servo_motor_PORT GPIOA
  19. #define ASR_Servo_motor_CLK RCC_APB2Periph_GPIO4
  20. #define LED_read PAin(1)// PA1
  21. #define FS_read PAin(2)// PA2
  22. #define BJ_read PAin(3)// PB3
  23. #define KM_read PAin(4)// PB4
  24. void ASR_Init(void);//初始化
  25. #endif

main.c

  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"
  6. #include "step_motor.h"
  7. #include "Servo_motor.h"
  8. #include "ASR.h"
  9. int main(void)
  10. {
  11. static u8 BJ_flag;
  12. delay_init(); //延时函数初始化
  13. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  14. uart_init(9600); //串口初始化为115200
  15. ASR_Init();
  16. LED_Init(); //LED端口初始化
  17. KEY_Init(); //初始化与按键连接的硬件接口
  18. servo_init();
  19. Step_Motor_GPIO_Init();
  20. servo_angle(80); //私服电机初始角度(关门状态)
  21. //STEP_MOTOR_OFF();
  22. while(1)
  23. {
  24. //判断语音开关灯
  25. if(LED_read == 1)
  26. {
  27. LED0=0; //开灯
  28. LED1=1;
  29. }
  30. else
  31. {
  32. LED0=1; //关灯
  33. LED1=0;
  34. }
  35. //语音判断开关风扇
  36. if(FS_read == 1)
  37. {
  38. FS=1;
  39. }
  40. else
  41. {
  42. FS=0;
  43. }
  44. //判断语音开关窗帘
  45. if((BJ_read == 1)&&(BJ_flag == 0))
  46. {
  47. motorNcircle(64,(bool)1); //步进电机正传
  48. BJ_flag=1;
  49. }
  50. else if((BJ_read == 0)&&(BJ_flag == 1))
  51. {
  52. //STEP_MOTOR_OFF();
  53. motorNcircle(64,(bool)0); //步进电机反传
  54. BJ_flag=0;
  55. }
  56. //判断语音开关门
  57. if(KM_read == 1)
  58. {
  59. servo_angle(175);
  60. delay_ms(500);
  61. }
  62. else
  63. {
  64. servo_angle(80);
  65. delay_ms(500);
  66. }
  67. }
  68. }

步进电机的程序就不在这里重复了,上面那个链接里有。  

完整工程链接:AI智能语音识别模块离线语音控制模块语音识别芯片声控模块SU-03T-淘宝网 (taobao.com)

欢迎大家指正交流,有空可以一起讨论代码啊。

制作不易,感谢大家支持,感谢!!!!!!

  --------------一个正在努力的人

感觉未分享清楚、有疑惑

咨询问题、了解具体内容、需要帮助者 可私信联系

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/893450
推荐阅读
相关标签
  

闽ICP备14008679号