蛋蛋 发表于 2014-7-18 17:09:57

自动跟踪小车

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

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


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

整理下思路:如果两个传感器同时检测到物体,并且小车距物体的距离大于15cm,小车赶紧向前;

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


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


搭建:两个红外数字测障传感器分别接在数字口8和9上面,红外距离传感器接在模拟口A1上面【接那个口,你决定】
硬件连接图
实物图
红外数字传感器是一个数字传感器,应该接在数字口,在接线的时候要注意,绿色接GND,红色接5V,黄色接数字口。                红外距离传感器是一个模拟传感器,应该接在模拟口,在接线的时候要注意,黑色接GND,红色接5V,橘色接模拟口。

第二步:编写程序#define pin A1// 红外距离传感器接模拟针脚A1

int E1 = 5;   //M1 Speed Control
int E2 = 6;   //M2 Speed Control
int M1 = 4;   //M1 Direction Control
int M2 = 7;   //M1 Direction Control
void stop(void)                  //小车停止
{
digitalWrite(E1,0);
digitalWrite(M1,LOW);   
digitalWrite(E2,0);   
digitalWrite(M2,LOW);   
}   
void advance(char a,char b)          //小车前进
{
analogWrite (E1,a);      //PWM Speed Control
digitalWrite(M1,LOW);   
analogWrite (E2,b);   
digitalWrite(M2,LOW);
}
void back_off (char a,char b)          //小车后退
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);   
analogWrite (E2,b);   
digitalWrite(M2,HIGH);
}
void turn_L (char a,char b)             //小车左转
{
analogWrite (E1,a);
digitalWrite(M1,LOW);   
analogWrite (E2,b);   
digitalWrite(M2,HIGH);
}
void turn_R (char a,char b)             //小车右转
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);   
analogWrite (E2,b);   
digitalWrite(M2,LOW);
}
void setup() {
// put your setup code here, to run once:
int i;
for(i=4;i<=7;i++)
    pinMode(i, OUTPUT);
    pinMode(8,INPUT);
    pinMode(9,INPUT);
    pinMode (pin,INPUT);
    Serial.begin(9600);
}
int left=0;
int right=0;

void loop() {
// put your main code here, to run repeatedly:
uint16_t value = analogRead (pin);
int x= get_gp2d120x (value);
left=digitalRead(8);
right=digitalRead(9);
Serial.println(x);
if(!left && !right && x>15)
   {
   advance(100,100);
   }
   else if((!left && !right&& x>8 && x<15)||(left &&right))
   {
    stop();
   }
   else if(!left && !right&& x<8)
   {
    back_off(100,100);
   }
   else if(!left && right)
   {
   turn_L(100,100);
   }
   else if(left && !right)
   {
   turn_R(100,100);
   }

}
double get_gp2d120x (uint16_t value) {
      if (value < 16)value = 16;
      return 2076.0 / (value - 11.0);
}
第三步:部分代码解释
       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。   

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


怎么样?小车有没有跟着“你”动起来    https://v.youku.com/v_show/id_XNzQ1MzEyNzI0.html



风语丶呓语 发表于 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

youraustin 发表于 2015-5-7 20:25
楼主,你好!能否帮忙解释一下如下函数的含义,这些值和公式是如何确定的,谢谢!向你学习
doubl ...
是红外测距模块的参数曲线决定的,可以看这里下面两份文档 https://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

好创意,赞一个,不过这样是谁都跟啊,可以加一个无线模块之类的,跟踪特定人
页: [1]
查看完整版本: 自动跟踪小车