【树莓派入门】(七)| 树莓派避障小车
一、 买材料:
① 一个树莓派(我用的是三代B型),智能小车底盘,两个L298N电机驱动板,两个超声波模块HC-SR04,电源,杜邦线若干。(上某宝都能买到) 图片如下:
二、 材料都买来了,就开始调试了。
①:先装系统,我用的是Ubuntu16.04 Mate(我的上一篇教程中有教大家怎么装,不一定非要这个系统),要装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
上面这个图很重要的,不同的树莓派对应的wPi可能不同。
② :调试L298N电机驱动模块,百度了一下怎么用。下了一个手册。
我定义了,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超声波模块,首先去问度娘手册。
打开手册看了一会,开始驱动吧。
一个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;
}
④ :你看一点也不难吧,不知不觉已经搞定两个模块了。其实这个时候,避障小车已经完成了。