基于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进一步的开发,不仅仅做一个功能,也不显得单调。
 


以下是此次活动开始的时候发的几个帖子:
原文地址:https://www.cnblogs.com/xiaofeng6636/p/3987308.html