智能视频跟踪小车

一、 买材料: ① 一个树莓派(我用的是三代B型),智能小车底盘,两个L298N电机驱动板,两个超声波模块HC-SR04,一个摄像头,一个舵机云台,电源,杜邦线若干。(上某宝都能买到) 图片如下: enter image description here

二、 材料都买来了,就开始调试了。

①    :先装系统,我用的是Ubuntu16.04 Mate(我的上一篇教程中有教大家怎么装),要装好opencv(这个我的上一篇教程中也有教)和wiringPi,那就从如何装wiringPi这个库开始吧。
i.    使用GIT工具
ii.    如果在你的平台上还没有安装GIT工具,可以输入以下命令:
iii.    sudo apt-get install git-core
iv.    如果在这个过程中出现错误,尝试更新软件,例如输入以下指令:
v.    sudo apt-get update
vi.    sudo apt-get upgrade
vii.    紧接着可以通过GIT获得wiringPi的源代码
viii.    git clone git://git.drogon.net/wiringPi
ix.    进入wiringPi目录并安装wiringPi
x.    cd wiringPi
xi.    ./build
xii.    build脚本会帮助你编译和安装wiringPi


安装后,在终端中输入:gpio –v
会出现版本号。
再输入:gpio readall

如图: enter image description here

上面这个图很重要的,不同的树莓派对应的wPi可能不同。

②    :调试L298N电机驱动模块,百度了一下怎么用。下了一个手册。

enter image description here 我定义了,wPi码是22,23,24,25的三个gpio口。 代码如下:

#include<wiringPi.h>
#include<stdio.h>
int main()
{
//初始化
wiringPiSetup();
pinMode(22,OUTPUT);
pinMode(23,OUTPUT);
pinMode(24,OUTPUT);
pinMode(25,OUTPUT);

int i=0;
while(true)
{
    printf("please input number to control :\n");

    scanf("%d",&i);
    switch(i)
    {
            case 1:
                {
                        digitalWrite(22,HIGH);
                        digitalWrite(23,LOW);
                        digitalWrite(24,HIGH);
                        digitalWrite(25,LOW);

                        delay(1000);
                        break;
                }    
            case 2:
                {
                        digitalWrite(22,LOW);
                        digitalWrite(23,HIGH);
                        digitalWrite(24,LOW);
                        digitalWrite(25,HIGH);

                        delay(1000);
                        break;
                }    
            case 3:
                {
                        digitalWrite(22,HIGH);
                        digitalWrite(23,LOW);
                        digitalWrite(24,LOW);
                        digitalWrite(25,LOW);

                        delay(1000);
                        break;
                }    
            case 5:
                {        digitalWrite(22,LOW);
                        digitalWrite(23,LOW);
                        digitalWrite(24,LOW);
                        digitalWrite(25,HIGH);

                        delay(1000);
                        break;
                }
            case 0:
                {
                        digitalWrite(22,LOW);
                        digitalWrite(23,LOW);
                        digitalWrite(24,LOW);
                        digitalWrite(25,LOW);

                        delay(1000);
                        break;
                }    
                default:
                    break;

      }
   }
} 
    return 0;
}

编译的时候要注意,要链接wiringPi库, 如:gcc –o demo demo.cpp –lwiringPi

然后./demo 运行。

具体小车的轮子怎么转请看L298N那个手册。

然后多加控制,就可以控制车轮怎么转了。 默认ENA是接高电平的,你也可以用PWM来控制,当然只要你感兴趣就去看手册。 到这里,电机驱动起来了,看,是不是很简单啊。

③    :驱动HC-SR04超声波模块,首先去问度娘手册。
 打开手册看了一会,开始驱动吧。

enter image description here

一个VCC一个GND,一个发送,一个接收。
该模块的工作原理为,先向TRIG脚输入至少10us的触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则ECHO输出高电平回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式: 距离=高电平时间*声速(340M/S)/2。 Trig是发送端,Echo是接收端,这两个要接在gpio口上, 这次我接的wPi码是15,16
代码如下:

#include<stdio.h>
#include<wiringPi.h>
#include<time.h>
#include<sys/time.h>
int main()
{
wiringPiSetup();
pinMode(15,OUTPUT);
pinMode(16,INPUT);    

digitalWrite(15,HIGH);
delay(0.015);//给它15微秒的高电平启动发送端
digitalWrite(15,LOW);
struct timeval first, second;

bool b=false;

while(true)
{
    if(1==digitalRead(16))//当16号gpio口为高电平的时候开始计时
    {    
        gettimeofday(&first,NULL);
        while(true)
        {
            if(0==digitalRead(16))//当16号gpio口为低电平的时候停止计时
                {
                    gettimeofday(&second,NULL);
                    //second=time(NULL);
                    b=true;
                    break;
                }

        }
    }
    if(b==true)
        break;
}
double ret = (second.tv_usec - first.tv_usec)*340/2;
printf("time is %d:",(second.tv_usec - first.tv_usec));
printf("distance is %lf:",(ret/1000000));

return 0;
}

④    :你看一点也不难吧,不知不觉已经搞定两个模块了。其实这个时候,壁障小车已经完成了。接下来就开始咱们的摄像头模块吧。(这里就开始涉及opencv了)  

由于视频跟踪正在努力做,目前的效果不是很棒,待我改进,然后继续更新,谢谢大家.