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