找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2072|回复: 0
收起左侧

基于STM32单片机智能跟随小车_红外遥控程序原理图PCB

[复制链接]
ID:1026761 发表于 2022-5-15 17:52 | 显示全部楼层 |阅读模式
附件有全部内容
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
屏幕截图 2022-05-15 175009.png 屏幕截图 2022-05-15 174933.png 51hei.png

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"       
  5. #include "timer.h"
  6. #include "adc.h"
  7. #include "remote.h"   
  8. #include "hx711.h"
  9. #include <string.h>

  10. u8 Model=0; //模式
  11. u8 PWM_WIDTH=28;  
  12. u8 RunModel=0;

  13. void Hw_Process()
  14. {
  15.   u8 key;
  16.                
  17.         key=Remote_Scan();       
  18.         if(key)
  19.                 {
  20.                         Beep=1;
  21.                         delay_ms(100);        //延时300ms
  22.                         Beep=0;                       
  23.                         printf("\r\n红外键值= %d\r\n",key);
  24.                 }
  25.    
  26.                    
  27. if(key==224)// - :进入 自由遥控避障模式               
  28.                 {
  29.      RunModel=0;
  30.                 }
  31. else if(key==168)// - :进入 跟随模式               
  32.    {
  33.            RunModel=1;
  34.          }
  35. if(RunModel==0) //自由遥控避障模式,遥控控制
  36.   {
  37.    if(key==194)// 暂停 >||
  38.                         {
  39.                            Model=0;
  40.                                  
  41.                                  printf("\r\n停止\r\n");//
  42.                         }                         
  43.           else if(key==34)//|<<
  44.                         {
  45.                            Model=4;
  46.                                  delay_ms(500);        //延时300ms
  47.                                  Model=1;
  48.                                  
  49.                                  printf("\r\n左\r\n");//
  50.                         }
  51.                         else if(key==2) //>>|
  52.                         {
  53.                            Model=3;
  54.                                  delay_ms(500);        //延时300ms
  55.                                  Model=1;
  56.                    
  57.                                  printf("\r\n右\r\n");//
  58.                         }
  59.                         else if(key==162) //CH-
  60.                         {
  61.                            Model=1;
  62.                                  
  63.                                  printf("\r\n前进\r\n");//
  64.                         }
  65.                         else if(key==98) //CH
  66.                         {
  67.                            Model=2;
  68.                  
  69.                                  printf("\r\n后退\r\n");//
  70.                         }                               
  71.                         else if(key==48)  // 按下键1
  72.                         {
  73.                            PWM_WIDTH=40;
  74.                          
  75.                                  printf("\r\n1档\r\n");//
  76.                         }
  77.                         else if(key==24)  // 按下键2
  78.                         {
  79.                             PWM_WIDTH=35;
  80.                                   
  81.                                  printf("\r\n2档\r\n");//
  82.                         }       
  83.                         else if(key==122)  // 按下键3
  84.                         {
  85.                            PWM_WIDTH=28;

  86.                                  printf("\r\n3档\r\n");//
  87.                         }                               

  88.   }
  89. }  
  90. int main(void)
  91. {       
  92.          u16 adcx;
  93.        
  94.          unsigned long adtemp,adtemp1;
  95.          u16 Weight=0;
  96.         u16 temp1,temp2;
  97.         delay_init();                     //延时函数初始化          
  98.          LED_Init();                          //初始化与LED连接的硬件接口

  99.           
  100.         uart_init(9600);
  101.   //uart2_init(9600);
  102.         TIM3_Int_Init(10,5199);//10Khz的计数频率,计数到10为1ms   控制小车方向及速度
  103.   CH_SR04_Init();//超声波设置初始化
  104.         Remote_Init();                        //红外接收初始化         
  105.         //ADInit();
  106.         Beep=1;
  107.         delay_ms(100);        //延时300ms
  108.   Beep=0;
  109.         delay_ms(100);        //延时300ms
  110.         Beep=1;
  111.         delay_ms(100);        //延时300ms
  112.   Beep=0;
  113.         printf("\r\n-----------------------------------------------\r\n");//
  114.         adtemp=HX711_Read();  //先读取皮重对应的AD。注意:上电前 称重盘上不能放任何物品,以免造成测量不准。
  115.         Model=0;
  116.                         
  117.                 while(1)
  118.                 {         


  119.      Hw_Process();//红外遥控处理
  120.                 if(RunModel==0) //自由遥控避障模式,遥控控制 +超声波避障
  121.                 {  
  122.        temp1=Senor_Using_Left()*10;
  123.                          printf("\r\n左方距离= %d cm",temp1);//串口打印出电压信息
  124.        temp2=Senor_Using_Right()*10;
  125.                          printf("右方距离= %d cm\r\n",temp2);//串口打印出电压信息                       
  126.                          if((temp1<250||temp2<250)&&Model==1)//前方障碍太近,需要避障
  127.                          {
  128.                                  Model=0;
  129.                                  delay_ms(300);        //延时300ms
  130.                                  Model=2;//后退
  131.                                  delay_ms(300);        //延时300ms
  132.                            Model=4;//右转
  133.                                  delay_ms(300);        //延时300ms
  134.                                  Model=1;//前进
  135.                          }
  136.                 }
  137.         else if(RunModel==1) //进入自动跟随模式
  138.           {
  139.                         adtemp1=HX711_Read();  
  140.                         if(adtemp1>adtemp) //判断检测到AD大于皮重时,认为有物体放置。
  141.                         {
  142.                          Weight=(adtemp1-adtemp)*0.002388;   //根据串口调试该系数计算过程为:200g ÷(8494856(放置200g物体对应Ad值)-8411097(无物体放置时输出AD值))
  143.                          printf("\r\n 重量=%d g\r\n",Weight);
  144.                         }       
  145.           if(Weight>500)//如果重物大于 500g  蜂鸣器报警。不跟随
  146.                   {
  147.                           Beep=1;
  148.                                 delay_ms(300);        //延时300ms
  149.                                 Beep=0;
  150.                                 delay_ms(300);        //延时300ms
  151.                         }
  152.           else
  153.                   {
  154.                                   
  155.                       temp1=Senor_Using_Left()*10;
  156.                             printf("\r\n左方距离= %d cm",temp1);//串口打印出电压信息
  157.           temp2=Senor_Using_Right()*10;
  158.                             printf("右方距离= %d cm\r\n",temp2);//串口打印出电压信息               
  159.                          
  160.                                   if((temp1<200)||(temp2<200))  // 200= 20cm   左右有一方小于20cm
  161.                                                                         {
  162.                                                                                            Model=0;//停止
  163.                                                                         }
  164.                                                                 else   if((temp1>1000)&&(temp2>1000))
  165.                                                                  {
  166.                                                                               printf("\r\n停止\r\n");
  167.                                                                                                 Model=0;//
  168.                                                                  }
  169.                 else if((temp1<1000)&&(temp2<1000))
  170.                                                                 {
  171.                                                                     printf("\r\n前进\r\n");
  172.                                                                           Model=1;//
  173.                                                                     delay_ms(300);        //延时300ms
  174.                                                                        
  175.                                                                        
  176.                                                                                         if(temp1>temp2) //说明此时 小车车头相对人偏左,应让小车向右拐弯
  177.                                                                                         {

  178.                                                                                                 Model=3;//右转
  179.                                                                                                 printf("\r\n右转\r\n");
  180.                                                                                                 delay_ms(200);        //延时300ms
  181.                                                                                                        //
  182.                                                                                         }
  183.                                                                                         else if(temp2>temp1)//说明此时 小车车头相对人偏右,应让小车向左拐弯       
  184.                                                                                         {

  185.                                                                                                 Model=4;//左转
  186.                                                                                                 printf("\r\n左转\r\n");
  187.                                                                                                 delay_ms(200);        //延时300ms
  188.                                                                                                  
  189.                                                                                         }
  190.                                                                 }                                                                       
  191.                           Model=0;//
  192.                                  
  193.                   }
  194.           }

  195.                        
  196.                  
  197.                 }
  198. }
复制代码

Keil代码和原理图PCB下载:
本人初学,仅供参考,还存在一些错误和不足之处,请大家回帖多多指教,切勿照搬,文件下载:
原理图和程序.7z (1.9 MB, 下载次数: 45)

评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表