| 
     自动跟踪小车     
说到小车,像我这种菜鸟级别的人来说,想到的就是小车循迹,小车避障,小车跳八字,小车防跌落等,我们的小车能不能也上一点档次,比如说跟着物体的移动方向而移动呢?想想都觉得好好玩,有点小得瑟,赶紧动手做一下吧。                 起个名字:自动跟踪小车。 
 
基本功能:小车跟着“你”走,你向前,小车向前;你向后,小向后;你向左,小车向左,你向右,小车向右,你停,它也该停了吧。 
 
 
小白有个疑问,就是小车如何识别物体移动的方向呢?一拍脑袋,用两或者多个测障传感器就可以了【不过至少也是两个】。 
 
整理下思路:如果两个传感器同时检测到物体,并且小车距物体的距离大于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。      
 
第四步:下载程序,观察现象 
 
 
怎么样?小车有没有跟着“你”动起来      
 
 
 
 |   
 
 
 
 | 
| 
 | 
| 
 | 
| 
 | 
 |