智能车进阶版

13 篇文章 7 订阅
4 篇文章 1 订阅
													智能车进阶版

基于STC8A8K64S4A12智能车设计

一、板载外设

1.1 红外接收头

1.2 红外避障接口

1.3 电机驱动电路

1.4 蓝牙接口

1.5 esp82266接口

1.6 NRF24L01接口

1.7 OLED电路

1.8 JQ8900接口

1.9 超声波接口

1.10 舵机接口

1.11 三个独立按键

1.12 两个LED灯

1.13 引出单片机全部引脚

1.14 自带复位按键

加一根USB转TTL的线就可以把这个板子当开发板用,非常经济实用。

二、功能

2.1电机正反转:

板载双H桥驱动电路两组,可以驱动四路电机,每组电机都可以实现正反转。

2.2 PWM控制转速:

每组电机都外接单片机的IO口,总共用8个IO口控制4组电机,可以用单片机IO输出PWM不同控制电机的转速,可编程。

2.3 手动控制:

    2.3.1 红外控制:可以通过板子上集成的红外接收头用红外遥控控制,这种控制方法简单,外设少,但干扰性强,信号强度弱,距离短。

    2.3.2 蓝牙和wifi控制:还可以通过手机连接蓝牙或者通过esp8266连接wifi控制,这两种方法都是在手机上安装一个软件,需要一个手机,操作简单,信号较强,使用较为舒适。

    2.3.3 无线控制:还有一种控制是通过NRF24L01的2.4G传输,这种控制方式需要一对NRF24L01,控制端和接收端下载配套的程序,双方可进行通信。这种方式用遥感电位器输出信号,需要较为复杂的硬件电路。但无论在信号,距离还是手感方面都较为完美。

遥感控制图(这里是开发板接的,没有另外打板子,有需要的话可以自己打个板子)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QboU31jo-1599055716722)(//image.lceda.cn/pullimage/P91FQZB73yg3z4iUHvSwoTGL7fJ7QI03dzA3o3VA.jpeg)]

2.4自动控制:

    2.4.1 超声波控制:超声波是利用发射和接收的时间来判断距离,可通过编程设置最短距离进行改变智能车的方向。另外超声波搭配了一个SG90舵机,可以在左,中,右三个方向进行旋转,提高了检测障碍的正确性。

    2.4.2 红外避障:红外避障是利用一对红外对管,一个发送和一个接收,判断产生距离的时间判断是否前方有障碍物,若时间间隔较短,则有障碍物,改变智能车的方向。

2.5 实时显示:

板子集成了OLED,OLED通过IIC控制,可以实时显示超声波检测的距离,显示是自动模式还是手动模式。

2.6 语音播报:

板子外接JQ8900语音芯片,通过提前拷贝需要的语音,在执行对应程序的时候通过一线串口发送命令,播放对应的语音。

补充:电源部分采用2节3.7V的锂电池。板子上集成了5V和3.3V稳压源,很好的适配电池和满足5V和3.3V外设的正常工作。

三、实物:

寒假的时候自己在家里做了一个小车,是用开发板接的线,非常的乱,而且接线很复杂,每次使用开发板的时候都要拆掉,再组装的时候非常费时、费力,一直想打一块板子。在B站看到了这个活动,获得了这次机会。于是乎,连夜测量画板子,绘制原理图,绘制PCB,经过一天多的奋战,终于完成了这个项目。今天找莫工领了PCB劵和器件劵,下了单,期待快点到。在这里感谢莫工,感谢立创EDA,遇到你们很开森。这里贴出原来的图,等后续再更新打样的新图,肯定是焕然一新,值得期待。

image.png
image.png

四、代码

代码经过反复修改,基本功能没有问题。
image.png

这里贴出部分代码

#include

uchar Auto_Hand_Mode_Flag=1;//自动手动模式切换标志(默认手动)
uchar Hand_Mode_Flag=0;//手动模式切换标志(默认红外)
uchar Auto_Mode_Flag = 1;//自动模式切换标志
/*********************************
 * @函数名:Mode_Key_Scan
 * @描  述:按一下是手动控制,再按一下是自动控制
 * @参  数:无
 * @返回值:无 
 *********************************/
void Mode_Key_Scan()//模式按键扫描
{
    uchar i;
        if(Key1==0)//Key1自动手动模式切换
        {
            i=20;
                while(i--); //延迟消抖
                if(Key1==0)
                {
                   if(Auto_Hand_Mode_Flag)   //一共两种模式
                      Auto_Hand_Mode_Flag=0;  //不是0就是1
               else
                       Auto_Hand_Mode_Flag=1;//没按一下就换一种模式
                }
                while(!Key1);
        }
}
/*********************************
 * @函数名:Control_Method_Key_Scan
 * @描  述:手动模式控制方式按键
 * @参  数:无
 * @返回值:无 
 *********************************/
void Control_Method_Key_Scan()//控制方式
{
        uchar i;
   if(Key2==0)//控制方式切换
        {
            i=20;
                while(i--);  //延迟消抖
                if(Key2==0)
                {
                        if(Hand_Mode_Flag==3) //一共三种控制方式0123
                         Hand_Mode_Flag=0; //循环
                        else    
                                Hand_Mode_Flag++; //每次换一种
                }
                while(!Key2);
        }
}
/*********************************
 * @函数名:Auto_Mode
 * @描  述:自动模式 (超声波避障)
 * @参  数:无
 * @返回值:无 
 *********************************/
void Auto_Mode()
{
//        static uchar 
        switch(Auto_Mode_Flag)
        {
                case 0:
                              Judge_distance(); //超声波避障
                              break;
                case 1:
                              Ray_Avoid(); //红外避障
                              break;
        }
    
        //Ray_jiance();
}
/*********************************
 * @函数名:Hand_Mode
 * @描  述:手动模式工具切换函数,Hand_Mode_Flag选用不同的工具控制
 * @参  数:无
 * @返回值:无 
 *********************************/
void Hand_Mode()
{
        static uchar Voice_Flag[4]={0};//语音标志
        static uchar One_Flag=0;//消除第一次语音播报标志
        Control_Method_Key_Scan();//控制方式按键扫描
        switch(Hand_Mode_Flag)
        {
                case 0:  
                                 Ray_Hand_Key();    //红外手动按键
                                 Ray_Decode_Ser(); //红外解码函数
                         
                          if(One_Flag)  //程序执行第一次的时候不执行
                                   {
                                          if(Voice_Flag[0]==0)
                                          {
                                                  //ES=0;//关闭蓝牙串口中断
                                                 JQ8900_Select_TwoCmd_Song(0x01,0x04);//红外遥控
                                                // EX0=1;//打开外部中断0
                                                 Voice_Flag[0]=1;
                                                 Voice_Flag[1]=0;
                                                 Voice_Flag[2]=0;        
                                                  Voice_Flag[3]=0;        
                                          }
                                }
                                  break;
                case 1: 
                              Blue_Hand_Key();      //蓝牙手动模式
                                  if(Voice_Flag[1]==0)
                                  {
                                          One_Flag=1;  //再执行红外的时候播报
                                        JQ8900_Select_TwoCmd_Song(0x01,0x05);//蓝牙遥控
                                         Voice_Flag[0]=0;
                     Voice_Flag[1]=1;
                     Voice_Flag[2]=0;        
                     Voice_Flag[3]=0;                                                  
                                  }
                                  break;
                case 2:  
                              NRF24L01_Hand_Key(); //无线手动按键
                                    NRF24L01_Receive();//接收数据的函数
                                  if(Voice_Flag[2]==0)
                                  {
                                          One_Flag=1; //再执行红外的时候播报
                                        //  ES=0;//关闭蓝牙串口中断
                                          //EX0=0;//关闭外部中断0
                                        JQ8900_Select_TwoCmd_Song(0x01,0x06);//无线遥控
                                         Voice_Flag[0]=0;
                     Voice_Flag[1]=0;
                     Voice_Flag[2]=1;        
                                           Voice_Flag[3]=0;        
                                  }
                              break;
                case 3:
                       if(Voice_Flag[3]==0)
                                  { 
                                          One_Flag=1;  //再执行红外的时候播报
                                         // EX0=0;//关闭外部中断0
                                        JQ8900_Select_TwoCmd_Song(0x01,0x07);//WIFI遥控
                                        //  ES=1;//打开蓝牙串口中断
                                         Voice_Flag[0]=0;
                     Voice_Flag[1]=0;
                     Voice_Flag[2]=0;         
                                          Voice_Flag[3]=1;        
                                  }
                         ESP8266_Hand_Key();//WIFI手动按键
                        break;
        }
}
/*********************************
 * @函数名:Auto_Hand_Mode
 * @描  述:自动手动模式切换函数Auto_Hand_Mode_Flag为0自动,为1手动
 * @参  数:无
 * @返回值:无 
 *********************************/
void Auto_Hand_Mode()//自动手动模式切换
{
        static uchar Voice_Flag[2]={0};//语音标志
        static uchar One_Flag=0;//消除第一次不语音播报标志
        Mode_Key_Scan();//按键扫描切换自动手动
    switch(Auto_Hand_Mode_Flag)
     {
              case 0:   
                      if(Voice_Flag[0]==0) //语音只执行一次
                                  {
                                           EX1 = 1; //打开超声波
                                         One_Flag=1;//第二次,可以播报
                                        JQ8900_Select_TwoCmd_Song(0x01,0x02);//自动模式
                        Voice_Flag[0]=1;
                        Voice_Flag[1]=0;
                                  }
                                  Auto_Mode();//自动
                        break;
              case 1:   
                  /*一上电程序进入这里,由于要播放发送机已启动,所以不播放下面的*/
                                  if(One_Flag)//如果等于1播报,否则不播报
                                  {
                                          if(Voice_Flag[1]==0)
                                          {
                                                  EX1 = 0; //关闭超声波
                                                 Car_Stop();// //由自动模式切换到手动模式,小车需停止
//                                                TR1=0;//关闭定时器1
                                                JQ8900_Select_TwoCmd_Song(0x01,0x03);//手动模式
                                                Voice_Flag[0]=0;
                                                Voice_Flag[1]=1;
                                          }
                              }
                                   Hand_Mode();//手动
                      break;
       }
}

五、PCB和元件

上次从莫工那里领了劵,下了单。经过两天的等待,快递如期的到了我的手上,顺丰和邮政空运是真的快,大赞。去拿快递的时候吓一跳,这快递盒也太大了吧!

贴个图:

image.png

拆开之后,又被吓了一跳,元器件也太多了吧,下单的时候到没有觉得有多少,这下够用好久了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jcrt4kSn-1599055716735)(//image.lceda.cn/pullimage/YZLYvN0eifLjRslTfURNQjDaRIQwlePpkBV5SdtU.png)]

这打的PCB板也蛮好看的

image.png

六、焊接

直接上图:

这是焊好之后的不带模块的:

正面:

image.png

背面:
(说明:这个OLED屏幕没有用,所以就没有焊接)

image.png

这是安装好模块的

image.png

这是外接电源测试的

image.png

后续还有好多模块要接,今天先更到这,后续会继续完善的。

今天又完善了一下,安在了小车上,上图:(原先是打算用电转打孔,因为忘记买铜柱,这里就先用胶带固定)

image.png

是不是比原来好看多了。不仅好看了,而且接线什么的也方便多了,组装也更简单了,可以随时拆下来当开
发板用。下面给出一段简单的演示视频。

这里给出以前的完全演示版,想看的小伙伴可以进去看看。

B站:小车完整版

立创EDA工程链接:https://lceda.cn/lengyuefeng/ji-yustc8a-di-zhi-neng-ju-557280a

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值