四博智联产品售后

 找回密码
 立即注册
搜索
查看: 14277|回复: 0
打印 上一主题 下一主题

基于ESPDuino的四路循迹小车实例

[复制链接]

31

主题

32

帖子

441

积分

版主

Rank: 7Rank: 7Rank: 7

积分
441
跳转到指定楼层
楼主
发表于 2016-8-15 17:03:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 linXJ 于 2017-3-17 15:11 编辑

1,实验材料:
ESPDuino开发板,Doit电机驱动模块,四路循迹模块,T-200 Doit小车,杜邦线若干;
2,实物连接:
电机驱动模块的 DC-MOTOR 端口 A+、A-和 B+、B-分别接电机 A 的正负极和电机 B 的正负极;IN-6-18V 端口的 VM、GND 分别接电源(18650 电池盒)的正负极;
其中:PinPWMA 对应开发板的 IO 口 14---用于控制电机 A 速度;
PinPWMB 对应开发板的 IO 口 12---用于控制电机 B 速度;
PinDirA 对应开发板的 IO 口15---用于控制电机 A 转向;
PinDirB 对应开发板的 IO 口 13---用于控制电机 B 转向;
循迹模块上的vcc与GND分别接电机驱动板上面的5V和GND管脚;IN1、IN2、IN3、IN4分别接电机驱动板的5(D5)、4(D4)、11(D3)、2(D0),(括号里表示ESPDUINO板上对应的IO口管脚);
3,实验原理:
原理:在白色地面上画一条宽度适中(1-3cm,最宽不能超过循迹模块最左端与最右端两个探测灯的距离)的黑色路线,让位于小车底盘的循迹模块发射的红外线,根据黑色对红外线的吸收作用,红外光射在白色地面会接收到反射光,相应管脚被置0(低电平),当循迹探头对准黑色路线上时没有接收到反射光,相应管脚置1(高电平);根据这个原理就可以控制小车沿着黑色路线前进了。
温馨提示:4路循迹模块排成倒梯形(最左边(IN4)和最右边(IN1)位于稍微靠前的位置,让探测更具有前瞻性,进而反应更灵敏。中间的两个,左边为IN3,右边为IN2,两者距离要与地面的黑色路线等宽,循迹过程中保证两者一直在黑色路线上即可);
4,示例源码:
  1. <div class="blockcode"><blockquote>#include <Ticker.h>
  2. #define PinPWMA 14    //电机1速度
  3. #define PinPWMB 12   //电机2速度
  4. #define PinDirA 15    //电机1转向
  5. #define PinDirB 13   //电机2转向
  6. #define left1  0     //左1探头
  7. #define left2  3     //左2探头
  8. #define right2 4     //右2探头
  9. #define right1 5     //右1探头

  10. extern "C"
  11. {
  12. #include "user_interface.h"
  13. #include "smartconfig.h"
  14. }
  15. /************** PWM Driver *************************/
  16. #define MAXPIN  17                        
  17. Ticker pwmTickersSetHigh[MAXPIN];         
  18. Ticker pwmTickersSetLow[MAXPIN];         
  19. const int pwmExponent = 3;   
  20. const int pwmFactor = 8;                  
  21. const int pwmRoundoff = pwmFactor/2;      
  22. const int pwmDutyCycle = 256/pwmFactor;   

  23. // 类似analogWrite()
  24. void pwmWrite(int pin, int value)
  25. {
  26.   if (pin < 0  ||  pin >= MAXPIN  || value < 0  ||  value > 255)
  27.     return;         
  28.   pwmTickersSetHigh[pin].detach();                     
  29.   pwmTickersSetLow[pin].detach();

  30.   int highTime = (value+pwmRoundoff)/pwmFactor;      
  31.   if (highTime <= 0)                                 
  32.     pwmSetLow(pin);
  33.   else if (highTime >= pwmDutyCycle)
  34.     pwmSetHigh(pin);
  35.   else
  36.   {               
  37.     pwmSetHigh(pin);
  38.     pwmTickersSetHigh[pin].attach_ms(pwmDutyCycle, pwmSetHigh, pin);  
  39.     pwmTickersSetLow[pin].once_ms(highTime, pwmStartLow, pin);
  40.   }
  41. }
  42. void pwmSetHigh(int pin)
  43. {
  44.    digitalWrite(pin, HIGH);
  45. }
  46. void pwmSetLow(int pin)
  47. {
  48.   digitalWrite(pin, LOW);
  49. }
  50. void pwmStartLow(int pin)      
  51. {
  52.   pwmSetLow(pin);
  53.   pwmTickersSetLow[pin].attach_ms(pwmDutyCycle, pwmSetLow, pin);   
  54. }
  55. /********************** PWM Driver *********************/

  56. Ticker timer;
  57. unsigned char val_L1 =1;//左1
  58. unsigned char val_L2 =1;//左2
  59. unsigned char val_R2 =1;//右2
  60. unsigned char val_R1 =1;//右1
  61. unsigned char temp=0;
  62. unsigned char bb=0;
  63. unsigned char flag=0;
  64. int value = 0;

  65. //定时每0.1秒红外自动扫描
  66. void tick_Infrared_control()
  67. {
  68.   val_L1=digitalRead(left1);
  69.   val_L2=digitalRead(left2);
  70.   val_R2=digitalRead(right2);
  71.   val_R1=digitalRead(right1);
  72.   temp=0;
  73.   temp=temp|(val_L1);
  74.   temp=(temp<<1)|(val_L2);
  75.   temp=(temp<<1)|(val_R2);
  76.   temp=(temp<<1)|(val_R1);
  77.   bb=0x0f&temp;
  78. }

  79. void initParseData()
  80. {
  81. //电机控制初始化
  82.   pinMode(PinPWMA, OUTPUT);
  83.   pinMode(PinPWMB, OUTPUT);
  84.   pinMode(PinDirA, OUTPUT);
  85.   pinMode(PinDirB, OUTPUT);
  86.   digitalWrite(PinDirA, HIGH);
  87.   digitalWrite(PinDirB, HIGH);
  88.   pwmWrite(PinPWMA, 100);
  89.   pwmWrite(PinPWMB, 100);
  90. //红外扫描初始化  
  91.   pinMode(left1, INPUT);
  92.   pinMode(left2, INPUT);
  93.   pinMode(right2, INPUT);
  94.   pinMode(right1, INPUT);
  95. //启动定时器
  96.   timer.attach(0.1, tick_Infrared_control);//红外扫描
  97. }

  98. //小车控制
  99. void go_stopp()//暂停
  100. {
  101.   pwmWrite(PinPWMA, 0);
  102.   pwmWrite(PinPWMB, 0);
  103.   delay(100);
  104. }
  105. void go_advance(int value)// 前进
  106. {
  107.   int aa;
  108.   aa=value;
  109.   digitalWrite(PinDirA, HIGH);
  110.   digitalWrite(PinDirB, HIGH);
  111.   pwmWrite(PinPWMA, aa);
  112.   pwmWrite(PinPWMB, aa);
  113.   delay(100);
  114. }
  115. void go_advance1(int value)// 前进 偏向左
  116. {
  117.   int aa;
  118.   aa=value;
  119.   digitalWrite(PinDirA, HIGH);
  120.   digitalWrite(PinDirB, HIGH);
  121.   pwmWrite(PinPWMA, aa);
  122.   pwmWrite(PinPWMB, aa+20);
  123.   delay(100);
  124. }
  125. void go_advance2(int value)// 前进 偏向右
  126. {
  127.   int aa;
  128.   aa=value;
  129.   digitalWrite(PinDirA, HIGH);
  130.   digitalWrite(PinDirB, HIGH);
  131.   pwmWrite(PinPWMA, aa+20);
  132.   pwmWrite(PinPWMB, aa);
  133.   delay(100);
  134. }
  135. void go_back(int value)//后退
  136. {
  137.   int aa;
  138.   aa=value;
  139.   digitalWrite(PinDirA, LOW);
  140.   digitalWrite(PinDirB, LOW);   
  141.   pwmWrite(PinPWMA, aa);
  142.   pwmWrite(PinPWMB, aa);
  143.   delay(100);
  144. }
  145. void go_left_1(int value)//原地左转  
  146. {
  147.   int aa;
  148.   aa=value;
  149.   digitalWrite(PinDirA, LOW);
  150.   digitalWrite(PinDirB, HIGH);
  151.   pwmWrite(PinPWMA, 0);
  152.   pwmWrite(PinPWMB, aa);
  153.   delay(100);
  154. }
  155. void go_left_2(int value)//大左转(双轮)
  156. {
  157.   int aa;
  158.   aa=value;
  159.   digitalWrite(PinDirA, LOW);
  160.   digitalWrite(PinDirB, HIGH);
  161.   pwmWrite(PinPWMA, aa);
  162.   pwmWrite(PinPWMB, aa);
  163.   delay(100);
  164. }
  165. void go_right_1(int value)//原地右转
  166. {
  167.   int aa;
  168.   aa=value;
  169.   digitalWrite(PinDirA, HIGH);
  170.   digitalWrite(PinDirB, LOW);
  171.   pwmWrite(PinPWMA, aa);
  172.   pwmWrite(PinPWMB, 0);
  173.   delay(100);
  174. }
  175. void go_right_2(int value)//大右转(双轮)
  176. {
  177.   int aa;
  178.   aa=value;
  179.   digitalWrite(PinDirA, HIGH);
  180.   digitalWrite(PinDirB, LOW);
  181.   pwmWrite(PinPWMA, aa);
  182.   pwmWrite(PinPWMB, aa);
  183.   delay(100);
  184. }

  185. //循迹程序

  186. void setup()
  187. {
  188.   initParseData();
  189.   delay(10);
  190.   go_advance(100);
  191. }

  192. void loop()
  193. {
  194.   switch(bb)
  195.   {
  196.     case 0x00:  //0000   0
  197.     {
  198.       go_advance(50);
  199.       break;
  200.     }
  201.     case 0x08:   //1000  8
  202.     {
  203.       go_left_2(90);
  204.       flag=1;
  205.       break;
  206.     }
  207.     case 0x0c:   //1100  12
  208.     {
  209.       go_left_1(140);
  210.       flag=1;
  211.       break;
  212.     }
  213.     case 0x04:   //0100  4
  214.     {
  215.       go_left_1(80);
  216.       delay(100);
  217.       go_advance(100);
  218.       break;
  219.     }
  220.     case 0x0e:   //1110  14
  221.     {
  222.       go_advance1(100);
  223.       break;
  224.     }
  225.     case 0x06:   //0110  6
  226.     {
  227.       go_advance(100);
  228.       flag=0;
  229.       break;
  230.     }
  231.     case 0x07:   //0111  7
  232.     {
  233.       go_advance2(90);
  234.       break;
  235.     }
  236.     case 0x02:   //0010  2
  237.     {
  238.       go_right_1(80);
  239.       delay(100);
  240.       go_advance(100);
  241.       break;
  242.     }
  243.     case 0x03:   //0011  3
  244.     {
  245.       go_right_1(100);
  246.       flag=2;
  247.       break;
  248.     }
  249.     case 0x01:   //0001  1
  250.     {
  251.       go_right_1(120);
  252.       flag=2;
  253.       break;
  254.     }
  255.     case 0x0f:   //1111  15
  256.     {
  257.       go_left_2(100);
  258.       flag=2;
  259.       break;
  260.     }
  261.     default :
  262.     {
  263.       switch(flag)   
  264.       {
  265.         case 0:go_advance(100);break;
  266.         case 1:go_left_1(120);break;
  267.         case 2:go_right_1(110);break;
  268.         case 3:go_stopp();break;      
  269.       }
  270.     }
  271.   }
  272. }
复制代码
5,实物连接与效果图:

Doit循迹小车.jpg (301.91 KB, 下载次数: 1550)

Doit循迹小车.jpg
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|四博智联 Inc. ( 粤ICP备15034758号-1

GMT+8, 2024-11-22 06:10 , Processed in 0.059688 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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