zoukankan      html  css  js  c++  java
  • 基于R7F0C80212ESP的蓝牙婴儿早教机

    功能介绍
             通过操作手机上的蓝牙软件发送命令,播放不同的语音内容(儿歌、故事)等。可以一边码着代码,一边给孩子放点音乐,还可以进行扩展一下,控制机械手臂来摇一摇拨浪鼓啥的。当然,如果时间充裕,还是最好亲自陪陪孩子。
     
     
    整体框图
      本方案比较简单,主要以此次的板子作为控制中心,通过蓝牙与手机通信,手机发送不同的命令来控制语言ic的输出,再经过放大电路将语音信号放大,然后通过小喇叭输出,以下是整个方案的整体框图。
     
    资源介绍
        本方案中主要使用了以下资源:
    Ø  R7F0C80212ESP目标板
    Ø  HC05蓝牙模块
    Ø  语音IC
    Ø  三极管8050
    Ø  小喇叭
    Ø  安卓手机
    Ø  导线若干
     
    硬件实物连接图
    整体连接
     
    语言IC
    蓝牙模块HC05
     
    小喇叭
     
     
    代码
    1、控制语音输出部分
    1. <font face="宋体"><font color="#000000">/*
    2. **************************************************************
    3. * 函数名:Send_Voice
    4. * 描述  :通过控制语音ic发送语音至扬声器
    5. * 输入  :uint8_t Voice_Num  脉冲数
    6. * 输出  :无
    7. **************************************************************
    8. */
    9. void Send_Voice(uint8_t Voice_Num)
    10. {
    11.                 uint8_t i;
    12.         
    13.                 VC_RST= 1u;            //复位
    14.                 Delay_ms(10u);
    15.             VC_RST= 0u;
    16.                 Delay_ms(100u); 
    17.                 
    18.                 for(i=0u; i < Voice_Num;i++)
    19.                 {
    20.                           VC_DATA = 1u;        //脉冲数据为高
    21.                          Delay_us(100u);     //延时100US
    22.                           VC_DATA = 0u;        //脉冲数据为低
    23.                          Delay_us(100);     //延时100US
    24.                 }
    25.                 while(VC_BUSY == 1);
    26. } </font></font>
    复制代码
    2、蓝牙部分代码
           代码是移植原子的蓝牙代码,其中有部分进行了修改
    1. <font face="宋体"><font color="#000000">/*
    2. **************************************************************
    3. //初始化ATK-HC05模块
    4. //返回值:0,成功;1,失败.
    5. **************************************************************
    6. */
    7. uint8_t HC05_Init(void)
    8. {
    9.         uint8_t retry=10u,t;                           
    10.         uint16_t temp=1;
    11.         
    12.         while(retry--)
    13.         {
    14.                 HC05_KEY=1u;                                        //KEY置高,进入AT模式
    15.                 Delay_ms(10);
    16.                 SAU_SendMessage("AT ");        
    17.                 HC05_KEY=0u;                                        //KEY拉低,退出AT模式
    18.                 for(t=0;t<10;t++)                         //最长等待50ms,来接收HC05模块的回应
    19.                 {
    20.                         if(RX_STA&0X8000)break;
    21.                         Delay_ms(5);
    22.                 }        
    23.                 
    24.                 if(RX_STA&0X8000)  //接收到一次数据了
    25.                 {
    26.                          
    27.                         RX_STA=0; 
    28.                          if(rx_data[0]=='O'&&rx_data[1]=='K')
    29.                         {                        
    30.                                 temp=0;
    31.                          
    32.                                 break; 
    33.                         }
    34.                 }                  
    35.         }                    
    36.         if(retry==0)temp=1;        //检测失败
    37.         return temp;         
    38. }        
    39. /*
    40. **************************************************************
    41. //获取ATK-HC05模块的角色
    42. //返回值:0,从机;1,主机;0XFF,获取失败.                
    43. **************************************************************
    44. */
    45. uint8_t HC05_Get_Role(void)
    46. {                             
    47.         uint8_t retry = 15u;
    48.         uint16_t temp,t;
    49.         while(retry--)
    50.         {
    51.                 HC05_KEY=1;                                        //KEY置高,进入AT模式
    52.                 Delay_ms(10);
    53.                 SAU_SendMessage("AT ");        //查询角色
    54.                 for(t=0;t<20;t++)                         //最长等待200ms,来接收HC05模块的回应
    55.                 {
    56.                         Delay_ms(10);
    57.                         if(RX_STA&0X8000)break;
    58.                 }                
    59.                 HC05_KEY=0;                                        //KEY拉低,退出AT模式
    60.                 if(RX_STA&0X8000)        //接收到一次数据了
    61.                 {
    62.                         temp=RX_STA&0X7FFF;        //得到数据长度
    63.                         RX_STA=0;                         
    64.                         if(temp==13&&rx_data[0]=='+')//接收到正确的应答了
    65.                         {
    66.                                 temp=rx_data[6]-'0';//得到主从模式值
    67.                                 break;
    68.                         }
    69.                 }                
    70.         }
    71.         if(retry==0)temp=0XFF;//查询失败.
    72.         return temp;
    73. }         
    74. /*
    75. **************************************************************
    76. //ATK-HC05设置命令
    77. //此函数用于设置ATK-HC05,适用于仅返回OK应答的AT指令
    78. //atstr:AT指令串.比如:"AT+RESET"/"AT+UART=9600,0,0"/"AT+ROLE=0"等字符串
    79. //返回值:0,设置成功;其他,设置失败.                
    80. **************************************************************
    81. */
    82. uint16_t HC05_Set_Cmd(uint8_t* atstr)
    83. {                             
    84.         uint8_t retry = 15u;
    85.         uint16_t temp;
    86.         uint8_t i;
    87.         while(retry--)
    88.         {
    89.                 HC05_KEY=1u;                                        //KEY置高,进入AT模式
    90.                 Delay_ms(10);
    91.                  
    92.                 SAU_SendMessage(atstr);             //发送AT字符串
    93.                 HC05_KEY=0u;                                        //KEY拉低,退出AT模式
    94.                 for(i=0;i<20;i++)                         //最长等待100ms,来接收HC05模块的回应
    95.                 {
    96.                         if(RX_STA&0X8000)break;
    97.                         Delay_ms(5);
    98.                 }                
    99.                 if(RX_STA&0X8000)        //接收到一次数据了
    100.                 {
    101.                         temp=RX_STA&0X7FFF;        //得到数据长度
    102.                         RX_STA=0;                         
    103.                         if(temp==4&&rx_data[0]=='O')//接收到正确的应答了
    104.                         {                        
    105.                                 temp=0;
    106.                                 break;                         
    107.                         }
    108.                 }                
    109.         }
    110.         if(retry==0)temp=0XFF;//设置失败.
    111.         return temp;
    112. </font></font>
    复制代码

     
    蓝牙软件
           前段时间本来是准备学习做蓝牙上位机软件的,后来由于客户的原因,未能···,这次使用的软件是在网上下载的一个蓝牙串口软件,可以满足需求的,如果是推广应用的话,还得自己上手编写。以下是此次使用的蓝牙软件的一些图片:
    1、搜索蓝牙设备
    2、已经查找到了HC05蓝牙模块,并点击连接设备,密码1234
    3、连接成功,为了使用方便,这里使用键盘模式
    4、进入键盘模式,以下是已经设置的键盘
    至此,可以通过按相应的按键来发送不同的命令,将会听到不同的语言内容。
     
     
    总结
           拿到板子的第一时间就是安装软件,一路“next”、“OK”下来,终于算是安装好了。新建一个工程,发现没有此款MCU的型号,网上搜索了一下,找到了解决办法。由于之前也用过cubesuite+软件,记得它自带代码生成功能插件的,捣鼓了一下,终于把这小子找出来了。上官网下载了一个demo程序,进行了简单的调试,初步的体验也就完成了。
        由于对这款MCU第一次接触,在开发过程中参考了不少官方demo程序和网友的帖子,很多问题也就不是问题了。花了几个晚上和一个周末,将整个方案大概的完成了。后面有时间将对整个方案进行进一步的优化,或更改MCU进一步的开发,不仅仅做一个功能,也不显得单调。
     


    以下是此次活动开始的时候发的几个帖子:
  • 相关阅读:
    C# 使用Enumerable.Range 打印数字
    C#中的范围类型(Range Type)
    C# 编程中的堆栈(Stack)和队列(Queue)
    C# 委托(delegate、Action、Func、predicate)
    使用线程以及对信号量 AutoResetEvent和ManualResetEvent的理解
    SQL Sever触发器的基本语法与作用
    C#控制台程序使用Log4net日志组件
    初级委托详解(C# 用委托有什么好处? 它起什么作用?)
    獲取串口數據,設置串口
    MVC 下 打包多个word到压缩包
  • 原文地址:https://www.cnblogs.com/xiaofeng6636/p/3987308.html
Copyright © 2011-2022 走看看