找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3223|回复: 2
收起左侧

基于arduino2560的循线小车制作 附程序

[复制链接]
ID:698281 发表于 2020-2-26 01:00 | 显示全部楼层 |阅读模式
基于arduino2560的循线小车的整体图

小车的整体图

小车的整体图


部分代码如下
  1. /*

  2. * 电机:
  3. *      10 -> 左侧:前进( > 90 ) ; 后退( < 90 ) ; 停止( 82 - 92)
  4. *      12 -> 右侧:前进( < 90 ) ; 后退( > 90 ) ; 停止( 93 - 103);
  5. * F表示前B为后,D是在双线上,S表示单线上
  6. *
  7. */
  8. /****************************整体实验例程****************************/
  9. #include <Arduino.h>
  10. #include <Wire.h>
  11. #include <MultiLCD.h>
  12. #include <ServoTimer2.h>

  13. //定义车行进方向
  14. enum Dir{
  15.   FORWARD = 1, BACK, LEFT, RIGHT, STOP
  16. };


  17. enum Trackingmode{
  18.   FD= 1, BD, FS, BS       //举例FD就表示在双线上前进循迹,主要前传感器
  19. };//

  20. enum Turnmode{
  21.   RFD= 1, LFD, RBD, LBD, RFS, LFS, RBS, LBS  
  22. //举例RFD表示 R向右转弯,F转完后要前进,D表示在双线上
  23. };


  24. //Motor
  25. int left_motor_port = 4; //定义左侧电机引脚
  26. int right_motor_port = 7; //定义右侧电机引脚
  27. int motor_speed = 135; //定义电机停止速度


  28. void setup() {
  29.   Serial.begin(9600);
  30.   SensorInit();
  31.   MotorInit();

  32. }


  33. /******************************设备初始化部分********************************/
  34. //传感器引脚初始化
  35. void SensorInit(){
  36.   //pinMode(f[3], INPUT);
  37.   //pinMode(rf_s, INPUT);
  38.   for(int i=0;i<8;i++){pinMode(f[i], INPUT);}    //前传感器数组
  39.   //pinMode(b[3], INPUT);
  40.   //pinMode(b[6], INPUT);
  41.   for(int i=0;i<8;i++){pinMode(b[i], INPUT);}    //后传感器数组
  42.   //pinMode(l_s, INPUT);
  43.   //pinMode(r_s, INPUT);
  44.   for(int i=0;i<8;i++){pinMode(l[i], INPUT);}    //中间传感器数组
  45.   pinMode(debug_sensor, INPUT);
  46.   //digitalWrite(A1,LOW);
  47.   //digitalWrite(A5,LOW);
  48.   
  49. }

  50. /******************************车行进控制部分********************************/
  51. int left_speed = 20;
  52. int right_speed = 20;

  53. void SpeedSet(int l, int r){
  54.   left_speed = l; right_speed = r;
  55. }

  56. void Forward(){
  57.   l_Servo.write(Angle2Pwm(motor_speed + left_speed));
  58.   r_Servo.write(Angle2Pwm(motor_speed - right_speed));
  59. }

  60. void Back(){
  61.   l_Servo.write(Angle2Pwm(motor_speed - left_speed));
  62.   r_Servo.write(Angle2Pwm(motor_speed + right_speed));
  63. }

  64. void Left(){
  65.   l_Servo.write(Angle2Pwm(motor_speed - 1.5*left_speed));
  66.   r_Servo.write(Angle2Pwm(motor_speed - 1.5*right_speed));
  67. }

  68. void Right(){
  69.   l_Servo.write(Angle2Pwm(motor_speed + 1.5*left_speed));
  70.   r_Servo.write(Angle2Pwm(motor_speed + 1.5*right_speed));
  71. }

  72. void Stop(){
  73.   l_Servo.write(Angle2Pwm(motor_speed));
  74.   r_Servo.write(Angle2Pwm(motor_speed));
  75.   delay(1000);
  76. }

  77. void Move(int dir){
  78.   switch(dir){
  79.     case FORWARD: Forward(); break;
  80.     case BACK: Back(); break;
  81.     case LEFT: Left(); break;
  82.     case RIGHT: Right(); break;   
  83.     case STOP: Stop(); break;
  84.     default: break;  
  85.   }
  86. }
  87.   //电机速度写入函数,调速的时候使用
  88. void CorrectLeftF(){
  89.   l_Servo.write(Angle2Pwm(motor_speed));
  90.   r_Servo.write(Angle2Pwm(motor_speed - 20));
  91. }

  92. void CorrectRightF(){
  93.   l_Servo.write(Angle2Pwm(motor_speed + 20));
  94.   r_Servo.write(Angle2Pwm(motor_speed));
  95. }

  96. void CorrectRightB(){
  97.   l_Servo.write(Angle2Pwm(motor_speed - 20));
  98.   r_Servo.write(Angle2Pwm(motor_speed));
  99. }

  100. void CorrectLeftB(){
  101.   l_Servo.write(Angle2Pwm(motor_speed ));
  102.   r_Servo.write(Angle2Pwm(motor_speed + 20));
  103. }  






  104. /*
  105. void Turn(int mode){   //转向函数
  106.   switch(mode){
  107.    
  108.     case 1:              //RF_D
  109.   Move(RIGHT);
  110.   while(!digitalRead(f[7]));
  111.   //delay(500);
  112.   while(!digitalRead(f[5]));
  113.   SpeedSet(15,15);
  114.   Move(RIGHT);
  115.   //delay(dy);
  116.   while(!digitalRead(f[2]));
  117.   Move(STOP);
  118.   SpeedSet(20,20);
  119.   break;
  120.   
  121.     case 2:             //LF_D
  122.   Move(LEFT);
  123.   while(!digitalRead(f[0]));
  124.   //delay(500);
  125.   while(!digitalRead(f[2]));
  126.   SpeedSet(15,15);
  127.   Move(LEFT);
  128.   //delay(dy);
  129.   while(!digitalRead(f[5]));
  130.   Move(STOP);
  131.   SpeedSet(20,20);
  132.   break;
  133.   
  134.     case 3:               //RB_D
  135.   Move(RIGHT);
  136.   while(!digitalRead(b[7]));
  137.   //delay(500);
  138.   while(!digitalRead(b[5]));
  139.   SpeedSet(15,15);
  140.   Move(RIGHT);
  141.   //delay(dy);
  142.   while(!digitalRead(b[2]));
  143.   Move(STOP);
  144.   SpeedSet(20,20);
  145.   break;
  146.   
  147.     case 4:               //LB_D
  148.   Move(LEFT);
  149.   while(!digitalRead(b[0]));
  150.   //delay(500);
  151.   while(!digitalRead(b[2]));
  152.   SpeedSet(15,15);
  153.   Move(LEFT);
  154.   //delay(dy);
  155.   while(!digitalRead(b[5]));
  156.   Move(STOP);
  157.   SpeedSet(20,20);
  158.   break;
  159.   
  160.       case 5:                 //RF_S
  161.   Move(RIGHT);
  162.   while(!digitalRead(f[7]));
  163.   //delay(500);
  164.   while(!digitalRead(f[6]));
  165.   SpeedSet(15,15);
  166.   Move(RIGHT);
  167.   //delay(dy);
  168.   while(!digitalRead(f[3]));
  169.   Move(STOP);
  170.   SpeedSet(20,20);
  171.   break;
  172.   
  173.     case 6:             //LF_S
  174.   Move(LEFT);
  175.   while(!digitalRead(f[0]));
  176.   //delay(500);
  177.   while(!digitalRead(f[1]));
  178.   SpeedSet(15,15);
  179.   Move(LEFT);
  180.   //delay(dy);
  181.   while(!digitalRead(f[4]));
  182.   Move(STOP);
  183.   SpeedSet(20,20);
  184.   break;
  185.   
  186.     case 7:            //RB_S
  187.   Move(RIGHT);
  188.   while(!digitalRead(b[7]));
  189.   //delay(500);
  190.   while(!digitalRead(b[6]));
  191.   SpeedSet(15,15);
  192.   Move(RIGHT);
  193.   //delay(dy);
  194.   while(!digitalRead(b[3]));
  195.   Move(STOP);
  196.   SpeedSet(20,20);
  197.   break;
  198.   
  199.     case 8:            //LB_S
  200.   Move(LEFT);
  201.   while(!digitalRead(b[0]));
  202.   //delay(500);
  203.   while(!digitalRead(b[1]));
  204.   SpeedSet(15,15);
  205.   Move(LEFT);
  206.   //delay(dy);
  207.   while(!digitalRead(b[4]));
  208.   Move(STOP);
  209.   SpeedSet(20,20);
  210.   break;
  211. }
  212. }



  213. /******************************路径部分********************************/
  214. /*
  215. * 循迹函数
  216. * 返回值:无
  217. * 参数:mode:
  218. *       FD:前进双线循迹
  219. *       BD:后退双线循迹
  220. *       FS:前进单线循迹
  221. *       BS:后退单线循迹
  222. * 功能:通过车底传感器检测路线进行循迹
  223. */
  224. void Tracking(int mode){
  225. if(mode==1){//FD
  226.     if(digitalRead(f[2]) && digitalRead(f[5])){
  227.       Move(FORWARD);
  228.       delay(20);
  229.     }
  230.     else if(digitalRead(f[2])){
  231.        CorrectLeftF();
  232.       }
  233.     else if(digitalRead(f[5])){
  234.        CorrectRightF();
  235.       }
  236.     else
  237.       Move(FORWARD);
  238.       delay(20);
  239.       
  240. }   
  241.       
  242. if(mode==2){    //BD
  243.     if(digitalRead(b[2]) && digitalRead(b[5])){
  244.       Move(BACK);
  245.       delay(20);
  246.     }
  247.     else if(digitalRead(b[2])){
  248.      CorrectRightB();  
  249.     }
  250.     else if(digitalRead(b[5])){
  251.      CorrectLeftB();  
  252.     }
  253.     else
  254.       Move(BACK);
  255.       delay(20);
  256.       
  257. }   
  258.       
  259. if(mode==3){   //FS
  260.     if(digitalRead(f[3]) && digitalRead(f[4])){
  261.       Move(FORWARD);
  262.       delay(20);
  263.     }
  264.     else if(digitalRead(f[3])){
  265.        CorrectLeftF();
  266.       }
  267.     else if(digitalRead(f[4])){
  268.        CorrectRightF();
  269.       }
  270.     else
  271.       Move(FORWARD);
  272.       delay(20);
  273.    
  274.     }
  275.       
  276. if(mode==4){  //BS
  277.     if(digitalRead(b[3]) && digitalRead(b[4])){
  278.       Move(BACK);
  279.       delay(20);
  280.     }
  281.     else if(digitalRead(b[3])){
  282.      CorrectRightB();  
  283.     }
  284.     else if(digitalRead(b[4])){
  285.      CorrectLeftB();  
  286.     }
  287.     else
  288.       Move(BACK);
  289.       delay(20);
  290.   }
  291. }


  292. /*
  293. * 循线计数函数
  294. * 返回值:无
  295. * 参数:mode:
  296. *       FD:前进双线循迹
  297. *       BD:后退双线循迹
  298. *       FS:前进单线循迹
  299. *       BS:后退单线循迹
  300. * 参数:line:表示准备走几条线
  301. * 功能:确定走的线数
  302. */

  303. void Trackingline(int mode, int line){
  304.   switch(mode){
  305.   case 1:
  306.     for(int i=0;i<20;i++){Tracking(FD);}
  307.     while(1){
  308.     if(meridians < line){
  309.       if(meridians < line-1){
  310.         if(digitalRead(l[3])){
  311.           meridians++;
  312.           while(digitalRead(l[3]));
  313.           delay(200);
  314.           }
  315.         else{
  316.           Tracking(FD);  
  317.       }
  318.       }
  319.       else{
  320.         if(digitalRead(l[3])){meridians++;}
  321.         else{Tracking(FD);}
  322.       }
  323.     }
  324.     else{
  325.       //Move(BACK);
  326.       //delay(200);
  327.       //Move(STOP);
  328.       meridians = 0;
  329.       //Move(BACK);
  330.       //while(!digitalRead(l[3]));
  331.       Move(STOP);
  332.       break;
  333.     }
  334.    
  335.     }
  336.   break;


  337.   case 2:
  338.   for(int i=0;i<20;i++){Tracking(BD);}
  339.     while(1){
  340.     if(meridians < line){
  341.       if(meridians < line-1){
  342.         if(digitalRead(l[4])){
  343.           meridians++;
  344.           while(digitalRead(l[4]));
  345.           delay(200);
  346.           }
  347.         else{
  348.           Tracking(BD);  
  349.       }
  350.       }
  351.       else{
  352.         if(digitalRead(l[4])){meridians++;}
  353.         else{Tracking(BD);}
  354.       }
  355.     }
  356.     else{
  357.       //Move(FORWARD);
  358.       //delay(200) ;
  359.       //Move(STOP);
  360.       meridians = 0;
  361.       //Move(FORWARD);
  362.       //while(!digitalRead(l[4]));
  363.       Move(STOP);
  364.       break;
  365.     }
  366.     }
  367.     break;
  368.    
  369.    
  370.     case 3:
  371.   for(int i=0;i<20;i++){Tracking(FS);}
  372.     while(1){
  373.     if(meridians < line){
  374.       if(meridians < line-1){
  375.         if(digitalRead(l[3])){
  376.           meridians++;
  377.           while(digitalRead(l[3]));
  378.           delay(600);
  379.           }
  380.         else{
  381.           Tracking(FS);  
  382.       }
  383.       }
  384.       else{
  385.         if(digitalRead(l[3])){meridians++;}
  386.         else{Tracking(FS);}
  387.       }
  388.     }
  389.     else{
  390.       //Move(BACK);
  391.       //delay(200);
  392.       //Move(STOP);
  393.       meridians = 0;
  394.       //Move(BACK);
  395.       //while(!digitalRead(l[3]));
  396.       Move(STOP);
  397.       break;
  398.     }
  399.     }
  400.   break;

  401.   case 4:
  402.   for(int i=0;i<20;i++){Tracking(BS);}
  403.     while(1){
  404.     if(meridians < line){
  405.       if(meridians < line-1){
  406.         if(digitalRead(l[4])){
  407.           meridians++;
  408.           while(digitalRead(l[4]));
  409.           delay(600);
  410.           }
  411.         else{
  412.           Tracking(BS);  
  413.       }
  414.       }
  415.       else{
  416.         if(digitalRead(l[4])){meridians++;}
  417.         else{Tracking(BS);}
  418.       }
  419.     }
  420.     else{
  421.       //Move(FORWARD);
  422.       //delay(200);
  423.       //Move(STOP);
  424.       meridians = 0;
  425.       //Move(FORWARD);
  426.       //while(!digitalRead(l[4]));
  427.       Move(STOP);
  428.       break;
  429.     }
  430.     }
  431.     break;  
  432.    
  433. }
  434. }



  435. /******************************路段部分********************************/

  436. //主函数部分,直接写入要走的路
  437. void loop (){
  438.   Turn(LFD);
  439.   Trackingline(FD,3);
  440.   Turn(RBS);
  441.   Trackingline(BS,1);
  442.   Turn(LBD);
  443.   Trackingline(BD,2);
  444.   Turn(RFS);
  445.   Trackingline(FS,1);
  446. }
复制代码

使用的八路巡线传感器 前中后各一 全部接在数字口上

使用的八路巡线传感器  前中后各一 全部接在数字口上

小车跑的场地,由单双线交叉构成的网格,本程序让小车沿线跑

小车跑的场地,由单双线交叉构成的网格,本程序让小车沿线跑

sketch_mar30a.zip

6.61 KB, 下载次数: 27, 下载积分: 黑币 -5

程序的源码

评分

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

查看全部评分

回复

使用道具 举报

ID:859280 发表于 2021-11-3 21:26 | 显示全部楼层
里面有一些库文件用不了,库文件能分享吗?
回复

使用道具 举报

ID:417658 发表于 2021-11-28 16:50 | 显示全部楼层
小车底盘是自己制作的吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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