39962浏览
查看: 39962|回复: 11

[项目] 自动跟踪小车

[复制链接]
    自动跟踪小车   

说到小车,像我这种菜鸟级别的人来说,想到的就是小车循迹,小车避障,小车跳八字,小车防跌落等,我们的小车能不能也上一点档次,比如说跟着物体的移动方向而移动呢?想想都觉得好好玩,有点小得瑟,赶紧动手做一下吧。                 起个名字:自动跟踪小车。

基本功能:小车跟着“你”走,你向前,小车向前;你向后,小向后;你向左,小车向左,你向右,小车向右,你停,它也该停了吧。


小白有个疑问,就是小车如何识别物体移动的方向呢?一拍脑袋,用两或者多个测障传感器就可以了【不过至少也是两个】。

整理下思路:如果两个传感器同时检测到物体,并且小车距物体的距离大于15cm,小车赶紧向前;
  • 如果如果两个传感器同时检测到物体,并且小车距物体的距离大于5cm小于15cm,小车已经离主银很近了,为了避免近距离接触。小车赶紧停下来吧【距离产生美,哈哈】;
  • 如果两个传感器同时检测到物体,并且小车距物体的距离小于5cm,小车赶紧后退,小心主银跺你一脚,小命也没了;
  • 如果左边传感器检测到物体右边传感器没有检测到物体,说明主银在左转,小车也赶紧左转吧,否则找不到主银,回不了家了;
  • 如果右边传感器检测到物体左边传感器没有检测到物体,说明什么呢,主银在右转,赶紧右转吧;
  • 哦也,如果左右两个传感器都检测不到物体,怎么办????小车原地待命下来,等主银来找你吧。
  • 思路清晰了,赶紧实现吧。


第一步:搭建硬件

器材:MiniQ 小车两个红外数字测障碍传感器一个红外距离传感器Romeo控制器锂电池。【其实用那种传感器都无所谓,只要能测障和测距就可以实现】


搭建:两个红外数字测障传感器分别接在数字口8和9上面,红外距离传感器接在模拟口A1上面【接那个口,你决定】
g30737.png
硬件连接图
QQ截图20140718163908.png
实物图

红外数字传感器是一个数字传感器,应该接在数字口,在接线的时候要注意,绿色接GND,红色接5V,黄色接数字口。                红外距离传感器是一个模拟传感器,应该接在模拟口,在接线的时候要注意,黑色接GND,红色接5V,橘色接模拟口。

第二步:编写程序
  1. #define pin A1// 红外距离传感器接模拟针脚A1
  2. int E1 = 5;     //M1 Speed Control
  3. int E2 = 6;     //M2 Speed Control
  4. int M1 = 4;     //M1 Direction Control
  5. int M2 = 7;     //M1 Direction Control
  6. void stop(void)                    //小车停止
  7. {
  8.   digitalWrite(E1,0);
  9.   digitalWrite(M1,LOW);   
  10.   digitalWrite(E2,0);   
  11.   digitalWrite(M2,LOW);   
  12. }   
  13. void advance(char a,char b)          //小车前进
  14. {
  15.   analogWrite (E1,a);      //PWM Speed Control
  16.   digitalWrite(M1,LOW);   
  17.   analogWrite (E2,b);   
  18.   digitalWrite(M2,LOW);
  19. }  
  20. void back_off (char a,char b)          //小车后退
  21. {
  22.   analogWrite (E1,a);
  23.   digitalWrite(M1,HIGH);   
  24.   analogWrite (E2,b);   
  25.   digitalWrite(M2,HIGH);
  26. }
  27. void turn_L (char a,char b)             //小车左转
  28. {
  29.   analogWrite (E1,a);
  30.   digitalWrite(M1,LOW);   
  31.   analogWrite (E2,b);   
  32.   digitalWrite(M2,HIGH);
  33. }
  34. void turn_R (char a,char b)             //小车右转
  35. {
  36.   analogWrite (E1,a);
  37.   digitalWrite(M1,HIGH);   
  38.   analogWrite (E2,b);   
  39.   digitalWrite(M2,LOW);
  40. }
  41. void setup() {
  42.   // put your setup code here, to run once:
  43.   int i;
  44.   for(i=4;i<=7;i++)
  45.     pinMode(i, OUTPUT);
  46.     pinMode(8,INPUT);
  47.     pinMode(9,INPUT);
  48.     pinMode (pin,INPUT);
  49.     Serial.begin(9600);
  50. }
  51. int left=0;
  52. int right=0;
  53. void loop() {
  54.   // put your main code here, to run repeatedly:
  55. uint16_t value = analogRead (pin);
  56. int x= get_gp2d120x (value);
  57.   left=digitalRead(8);
  58.   right=digitalRead(9);
  59.   Serial.println(x);
  60.   if(!left && !right && x>15)
  61.    {
  62.      advance(100,100);
  63.    }
  64.    else if((!left && !right&& x>8 && x<15)||(left &&right))
  65.    {
  66.     stop();
  67.    }
  68.    else if(!left && !right&& x<8)
  69.    {
  70.     back_off(100,100);
  71.    }
  72.    else if(!left && right)
  73.    {
  74.    turn_L(100,100);
  75.    }
  76.    else if(left && !right)
  77.    {
  78.    turn_R(100,100);
  79.    }
  80. }
  81. double get_gp2d120x (uint16_t value) {
  82.         if (value < 16)  value = 16;
  83.         return 2076.0 / (value - 11.0);
  84. }
复制代码

第三步:部分代码解释
       if(!left && !right && x>15)  
   {
     advance(100,100);
   }

    解释:红外数字传感器检测到障碍物时,输出低电平;而没有检测到障碍物时输出高电平。
         本实验中使用的红外数字传感器的有效距离为3~80cm,而且检测的距离可以根据我们的需要自己的调整,小白自认为这是一个优点。
double get_gp2d120x (uint16_t value) {
        if (value < 16)  value = 16;
        return 2076.0 / (value - 11.0);
}


这段代码用于计算红外距离传感器测出传感器与障碍物的距离,单位是cm。     

第四步:下载程序,观察现象


怎么样?小车有没有跟着“你”动起来
   




风语丶呓语  高级技师

发表于 2014-8-29 19:25:02

采用更远距离的感应器才好~ 当然了还是很棒~
回复

使用道具 举报

boyhero  学徒

发表于 2014-10-6 15:53:21

如果又多个人同时被探测到,他怎么判别那个是目标呢?
回复

使用道具 举报

泡泡  学徒

发表于 2014-12-23 22:48:19

还是实验品,如果能100%跟踪小孩小跑就是产品了。加油!!
回复

使用道具 举报

KinFu  高级技师

发表于 2014-12-24 10:19:18

跟踪指的是巡线么?
回复

使用道具 举报

youraustin  初级技师

发表于 2015-5-7 20:25:56

楼主,你好!能否帮忙解释一下如下函数的含义,这些值和公式是如何确定的,谢谢!向你学习:handshake
double get_gp2d120x (uint16_t value) {
        if (value < 16)  value = 16;
        return 2076.0 / (value - 11.0);
}
回复

使用道具 举报

中庸  见习技师

发表于 2015-5-13 15:15:27

人烟稀少啊!
回复

使用道具 举报

Cain  初级技匠

发表于 2015-5-15 11:37:26

本帖最后由 Cain 于 2015-5-15 11:39 编辑
youraustin 发表于 2015-5-7 20:25
楼主,你好!能否帮忙解释一下如下函数的含义,这些值和公式是如何确定的,谢谢!向你学习
doubl ...

是红外测距模块的参数曲线决定的,可以看这里下面两份文档 http://www.dfrobot.com.cn/goods-674.html
回复

使用道具 举报

youraustin  初级技师

发表于 2015-5-18 09:32:44

谢谢楼主!
回复

使用道具 举报

besteast  见习技师

发表于 2015-8-10 21:47:47

加油加油。。。
回复

使用道具 举报

Aladdin  学徒

发表于 2016-1-17 21:25:48

这个小车能再接一个蓝牙遥控吗?
回复

使用道具 举报

20060606  高级技匠

发表于 2020-8-20 06:16:16

好创意,赞一个,不过这样是谁都跟啊,可以加一个无线模块之类的,跟踪特定人
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail