自动跟踪小车
自动跟踪小车说到小车,像我这种菜鸟级别的人来说,想到的就是小车循迹,小车避障,小车跳八字,小车防跌落等,我们的小车能不能也上一点档次,比如说跟着物体的移动方向而移动呢?想想都觉得好好玩,有点小得瑟,赶紧动手做一下吧。 起个名字:自动跟踪小车。
基本功能:小车跟着“你”走,你向前,小车向前;你向后,小向后;你向左,小车向左,你向右,小车向右,你停,它也该停了吧。
小白有个疑问,就是小车如何识别物体移动的方向呢?一拍脑袋,用两或者多个测障传感器就可以了【不过至少也是两个】。
整理下思路:如果两个传感器同时检测到物体,并且小车距物体的距离大于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
采用更远距离的感应器才好~ 当然了还是很棒~ 如果又多个人同时被探测到,他怎么判别那个是目标呢? 还是实验品,如果能100%跟踪小孩小跑就是产品了。加油!! 跟踪指的是巡线么? 楼主,你好!能否帮忙解释一下如下函数的含义,这些值和公式是如何确定的,谢谢!向你学习:handshake
double get_gp2d120x (uint16_t value) {
if (value < 16)value = 16;
return 2076.0 / (value - 11.0);
} 人烟稀少啊! youraustin 发表于 2015-5-7 20:25
楼主,你好!能否帮忙解释一下如下函数的含义,这些值和公式是如何确定的,谢谢!向你学习
doubl ...
是红外测距模块的参数曲线决定的,可以看这里下面两份文档 https://www.dfrobot.com.cn/goods-674.html 谢谢楼主! 加油加油。。。 这个小车能再接一个蓝牙遥控吗? 好创意,赞一个,不过这样是谁都跟啊,可以加一个无线模块之类的,跟踪特定人
页:
[1]