基于 arduino 的超声波避障及 wifi 遥控智能小车 · l293d 是四倍高电流h...

Post on 21-Sep-2019

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

基于 Arduino 的超声波避障及 WiFi 遥控智能小车

摘要

单片机已广泛地应用于军事、工业、家用电器、智能玩具、便携式,智能仪

表和机器人制作等领域,使产品功能、精度和质量大幅度提升,且电路简单,故

障率低,可靠性高,成本低廉。另外它还有如下的特点:简便易学,费用低廉高

速、低耗、保密 I/O 口功能强,具有 A/D 转换等电路有功能强大的定时器/计数

器及通讯接口。无论是在工业控制领域、医疗卫生领域、还是在国防军事领域、

航天航空领域,微控制器都起着举足轻重的作用。我们通过设计基于 Arduino 的

智能小车来深入学习单片机。

传统的小车控制多是通过摇杆,但摇杆硬件较大,且需要一个稳定的工作台

才能工作,在某些情况下使用起来不太方便。而随着科技的飞速发展,人们也在

不断探索新的控制方式。电影 007上曾经出现过这样一个镜头,詹姆斯邦德坐在

自己车的后座上通过手机遥控自己的汽车。这看似科幻的情景,随着现在智能手

机的普及,正逐渐变为现实。我们准备使用移动终端上的软件通过日常生活中常

见的WIFI技术对小车实施远距离遥控操作,控制其运动。

与此同时,在科学探索和紧急抢险中经常会遇到对与一些危险或人类不能直

接到达的地域的探测,这些就需要用机器人来完成。而在机器人在复杂地形中行

进时避障和实时传输图像是必不可少也是最基本的功能。因此,避障系统的研发

就应运而生。我们的小车是通过车前设置的摄像头捕捉实时图像并通过 WiFi 技

术传送到移动终端,让使用者自己根据具体情况进行判断。随着科技的发展,各

种测距技术层出不穷不断更新,由于图像和使用者的局限性,我们决定在小车上

增加测距的功能,以用于辅助使用者做出判断。

超声波具有指向性强,能量消耗缓慢,传播距离较远等优点,所以,在利用

传感器技术和自动控制技术相结合的测距方案中,超声波测距是目前应用最普遍

的一种,它广泛应用于防盗、倒车雷达、水位测量、建筑施工工地以及一些工业

现场。相比于其它定位技术超声波定位技术成本低,制作容易,非常适合于短距

离测量定位。

基于以上优点我们决定使用超声波测距技术,这种技术会极大的帮助使用者

进行避障。

关键词:Arduino WIFI控制 超声波避障 实时图像

设计的系统的目的、用途和功能

(1)系统目的

学会应用 Arduino 单片机,作为智能小车的核心控制器;通过安卓手机或电

脑来连接 WiFi,使用软件来控制智能小车;学会基本运动、避障及 WiFi 控制程

序的调试。

(2)系统用途

此系统并非完善,但是可作为应用方面一个参考的例子。装载摄像头的小车

可以实现远距离操控,传输实时图像并使用超声波测距探测未知区域。

(3)系统功能

①手机或电脑连接WiFi 控制小车行动,传输实时图像;

②实现简单的测距和避障功能。

硬件设计思想和电原理图

1. Arduino UNO Rev3

Arduino UNO 的处理器核心是 ATmega328,同时具有 14路数字输入/输出口

(其中 6 路可作为 PWM 输出),6 路模拟输入,一个 16MHz 晶体振荡器,

一个 USB接口,一个电源插座,一个 ICSP header 和一个复位按钮。

下面是 Arduino UNO Rev3 主要参数

处理器 ATmega 328

工作电压 5V

输入电压(推荐) 7-12V

输入电压(范围) 6-20V

数字 IO脚 14(6路可作为 PWM输出)

模拟输入脚 6

IO 脚直流电流 40mA

3.3V 脚直流电流 50mA

Flash Memory 32KB(其中 0.5KB用于 bootloader)

SRAM 2KB

EEPROM 1KB

工作时钟 16MHz

Arduino UNO引脚说明

⑴电源引脚

VIN——当外部直流电源接入电源插座时,可以通过 VIN 向外部供电,也可

以通过此引脚向 UNO 直接供电;VIN 有电时将忽略从 USB或者其他引脚接

入的电源。

5V——通过稳压器或 USB的 5V电压,为 UNO上的芯片供电

3V3——通过稳压器产生的 3.3V电压,最大驱动电流 50mA

GND——地脚

⑵输入输出接口

①14路数字输入输出口:工作电压为5V,每一路能输出和接入最大电流为40mA。

每一路配置了 20-50K 欧姆内部上拉电阻(默认不连接)。除此之外,有些引脚有

特定的功能

串口信号 RX(0号)、TX(1号): 与内部 ATmega8U2 USB-to-TTL 芯片相连,

提供 TTL电压水平的串口接收信号。

外部中断(2号和 3号):触发中断引脚,可设成上升沿、下降沿或同时触发。

脉冲宽度调制 PWM(3、5、6、9、10 、11):提供 6路 8位 PWM输出。

SPI(10(SS),11(MOSI),12(MISO),13(SCK)):SPI通信接口。

LED(13号):Arduino 专门用于测试 LED 的保留接口,输出为高时点亮 LED,

反之输出为低时 LED 熄灭。

②6路模拟输入A0到A5:每一路具有10位的分辨率(即输入有 1024个不同值),

默认输入信号范围为 0到 5V,可以通过 AREF调整输入上限。除此之外,有些

引脚有特定功能

TWI接口(SDA A4 和 SCL A5):支持通信接口(兼容 I2C 总线)。

③AREF:模拟输入信号的参考电压。

④Reset:信号为低时复位单片机芯片。

2. AR-293D拓展板

电路板

拓展板的功能如下图

集成 293D驱动芯片,可以驱动 2轮及四轮智能小车

集成蓝牙接口,WIFI 接口,双路舵机接口,2 路红外避障模块接口,3 路红

外循迹模块接口,1路超声波接口。

集成 5V电源稳压芯片。

超声波接口:

SR04

1. GND

2. Echo,接到核心板 9脚

3. Teig,接到核心板 8脚

4. Vcc

驱动模块控制信号线接口:

1. IN1 驱动电机信号线,接到核心板 14脚 A0

2. IN2 驱动电机信号线,接到核心板 15脚 A1

3. IN3 驱动电机信号线,接到核心板 16脚 A2

4. IN4 驱动电机信号线,接到核心板 17脚 A3

5. EN1驱动电机 PWM1控制,接到核心板 3脚

6. EN2驱动电机 PWM2控制,接到核心板 5脚

2轮电机输出接口

1. T1接左电机,1接电机 1脚,2接电机 2脚

2. T2接右电机,1接电机 1脚,2接电机 2脚

3. 电机驱动模块 L293D及 H 桥路[1]

L293D是四倍高电流 H桥路驱动芯片,主要用于提供双向驱动电流达到

600mA,电压在 4.5V到 36V间的电路。

芯片所有输入均为 TTL兼容接口。每一个输出接口是完整的推拉输出电

路与达林顿三极管和伪达林顿源。1,2EN和 3,4EN分别是 1和 2、3和 4的使

能端,均为高电平使能。当使能输入为低电平时,这些驱动器被禁用,呈现

出高阻态。

L293D芯片引脚图

功能表

输入 输出

Y A EN

H H H

L H L

X L Z

(注:H表示“高电平”,L表示“低电平”,X表示“不相关的”,Z表示“高阻抗”)

2路电机驱动原理图

双极型步进电机控制原理图

EN 3A M1 4A M2

H H 快速电机停

H 转动

H L 转动 L 快速电机停

L X 自由运动电

机停止

X 自由运动电

机停止

EN 1A 2A 功能

H L H 右转

H H L 左转

H L L 停止

H H H 停止

L X X 停止

PWM 调速原理:用微处理进行脉宽调制,调占空比、调频率

对于电机的转速调整,我们是采用脉宽调制的方法,控制电机的时候,电源

并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。

不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电

感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用

时间上,这样,改变在使能端 ENA和 ENB上输入方波的占空比就能改变加在电

机两端的电压大小,从而改变转速。

小车马达参数

型号 规格 减速

3V空

载转/

分钟

3V空

载安

66mm

轮的

速度

(米/

分钟)

5V空

(转/

分钟)

速度 5V空

载安

66mm

轮的

速度

(米/

分钟)

扭力

HC01-48 双轴 1:48 125 26 208 适中 44 0.8KG*CM

4. 超声波模块

电路原理图

超声波是频率高于 20000Hz 的声波,它的指向性强,能量消耗缓慢,在介

质中传播的距离较远,因而经常用于测量距离。

我们用一款常见的超声波传感器 HC-SR04 来测量距离。

超声波模块引脚介绍

SR04 超声波模块有 4个引脚,

引脚名称 说明

Vcc 电源 5V

Trig 触发引脚

Echo 回馈引脚

GND 地

SR04 超声波传感器带有两个超声波探头,分别用作发射和接收超声波。其

测量范围为 3~450cm。超声波测距的工作原理:

超声波发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空

气中传播,途中碰到障碍物则立即返回,超声波接收器接收到反射波则立即停止

计时。声波在空气中的传播速度为 340m/s,根据计时器记录的时间 t,即可计算

出发射点距障碍物的距离,即 s=340*t/2。这种方法也叫时间差测距法。

5. WIFI 模块

我们采用了由慧净电子研制定制的智能车专用系统无线数传模块,实现搭载

其他模块来实现不同的控制和视频传送。模块供电口为 5V 电源,2 根 TTL 线,

1 条 GND 线。它可以产生很强的 Wifi 热点,热点名称为 hjwifi2014,无需输入

密码即可连接。由于此模块出厂时固件已经写好,在这里我们简单介绍一下如何

使用该模块。其中 TTL信号线

1(灰色)——接收信号 2(白色)——发射信号 3(黑色)——GND

以及 WIFI模块参数为:

网络标准

无线标准 IEEE 802.11n IEEE 802.11g IEEE

802.11b

优先标准 IEEE 802.3 IEEE 802.3u

网络接口 1个 10/100Mbps LAN/WAN 复用接口

USB接口 USB 2.0

串口 TTL232(2.6V)

天线类型 内置天线

无线安全 无线MAC 地址过滤、无线安全功能开

关 64/128/152 位WEP加密,

WPA-PSK/WPA2-PSK

输入电压/电流 5V/1A

Wifi 模块外观图:

WIFI模块工作原理:

WiFi 模块上电后,发射无线信号,如果某设备连接上无线,即可获得一个

控制地址和控制端口:

控制端口在这里的作用相当于串口监视器,每执行一个指令,即向控制端口

输入了一个字符。因此,利用这一特点,我们可以通过一个选择结构,在软件界

面进行操作,间接地控制小车。

软件设计思想及软件流程

1. 小车基本运动的软件设计思想及流程

小车的基本运动分为前进、后退、左转、右转和停止,我们分别把每一个基

本运动写成一个函数。

引脚配置为输出模式以后,用 digitalWrite()函数改变引脚输出的电平;用

analogWrite()进行模拟输出,改变 PWM 的脉冲宽度对小车的速度进行设定。两

个电机的四个脚位均接 Arduino 的 PWM 端口。

2. 超声波测距及避障的软件设计思想及流程

⑴串口输出超声波测距的数值【2】:

小车运动函数

前进函数

后退函数

左转函数

右转函数

停止函数

在这里,我们主要用到了脉冲宽度测量函数 pulseIn();pulseIn()的功能是检

测制定引脚上的脉冲信号宽度,例如当要检测高电平脉冲时,pulseIn()函数会等

待指定引脚输入的电平为高,在变高后开始计时,直到输入电平变低时,计时停

止。pulseIn()函数会返回此脉冲持续的时间,即该脉冲的宽度。pulseIn()函数还

可以设定超时时间。如果超过设定时间仍未检测到脉冲,则会退出 pulseIn()函数

并返回 0。当没有设定超时时间时,pulseIn()会默认 1秒钟的超时时间。

pulseIn()的语法:

pulseIn(pin,value)

pulseIn(pin,value,timeout)

参数:

Pin,需要读取脉冲的引脚;

Value,需要读取的脉冲类型,为 HIGH或 LOW

Timeout,超时时间,单位为微秒,数据类型为无符号长整型。

返回值:换行返回脉冲宽度,单位为微秒,数据类型为无符号长整型。如果

在指定时间内没有检测到脉冲,则返回为 0。

使用 Arduino 的数字引脚给 SR04 模块的 Trig 引脚至少 10μs的高电平信号

以此来触发 SR04 模块的测距功能。

测距功能触发后,模块会自动发送 8 个 40kHz 的超声波脉冲,并自动检测

是否有信号返回。这一步由模块内部自动完成。

若有信号返回,则 Echo 引脚会输出高电平,高电平持续的时间就是超声波

从发射到返回的时间。此时可以使用 pulseIn()函数获取测距的结果,并计算出距

被测物体的实际距离。

⑵类库封装

为了提高代码的编写效率及程序的可读性,我们把超声波驱动对端口的配置

过程封装成 DistanceSRF04 类库

触发测距功能

检测是否有信号返回

Echo输出高电平

获取计时器记录的时间

计算距离并显示

DistanceSRF04.cpp 中关键的函数

int DistanceSRF04::getDistanceTime() //获取计时器记录的时间

{

long sum = 0;

for (int i=0;i<_average;i++)

{

digitalWrite(_trigPin, LOW);

delayMicroseconds(2);

digitalWrite(_trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(_trigPin, LOW);

_duration = pulseIn(_echoPin, HIGH);

sum=sum+_duration;

}

return(int(sum/_average));

}

int DistanceSRF04::getDistanceCentimeter() //计算距离

{

return (getDistanceTime()/29/2);

}

优化的思路:

当检测的距离超出了超声波可检测的范围时(3~450cm)时,输出错误信息

DistanceSR04

public

• begin()

• getDistanceTime()

• getDistanceCentimeter()

private

• _trigPin

• _echoPin

• _average

• _duration

或重新检测;每次检测时检测两次或者多次,将得到的值作比较,如果偏差较大,

则认为是检测出错,并放弃检测结果,重新检测距离。

小车实现简单避障的示例代码

在这里,我们设定安全距离为 5cm。

DistanceSRF04 Dist;

int distance;

distance = Dist.getDistanceCentimeter();

if(distance<=5 && distance>1)

{

hou();

delay(100);

ting();

}

else

qian();

3. WIFI 遥控的软件设计思想及流程

点击按钮,触发一个事件,在这里,我们用 a 代表前进,b 代表后退,c 代

表左转,d 代表右转,e 代表停止。一旦按下某一个按键,则触发相应的函数,

小车作出反应。如果串口接收到数据,则将数据读取赋值给变量 lkf,用 switch()

结构来进行选择。

if(Serial.available())

{

lkf = Serial.read();

switch(lkf)

{

case 'a':

小车运动碰到障碍物

测量与障碍物的距离,并与设定的安全距离进行比较

距离小于安全距离,则后退;否则继续前进

qian(); //前进

lkf=0;

break;

case 'b':

hou(); //后退

lkf=0;

break;

case 'c':

zuo(); //左转

lkf=0;

break;

case 'd':

you(); //右转

lkf=0;

break;

case 'e':

ting(); //停止

lkf=0;

break;

}

}

控制界面设计

PC WIFI上位机软件界面

安卓手机 WIFI上位机界面

系统测试过程及测试数据、指标参数分析

1. 小车运动硬件控制

根据前述拓展板接口,电机 1 的信号线 IN1,IN2 对应拓展板的 A0,A1;电

机 2的信号线 IN3,IN4 对应拓展板的 A2,A3

结合我们的小车,右电机为 A0,A1;左电机为 A2,A3。用一根一公头一

母头的杜邦线,母头接在拓展板的 Vcc接口,用公头去试触四个脚 A0,A1,A2,

A3,测试的方法如下:

测试结果如下:

试触脚位 车轮转向(人正对车轮的方向)

A0 右车轮逆时针转(后退)

A1 右车轮顺时针转(前进)

A2 左车轮逆时针转(前进)

A3 左车轮顺时针转(后退)

试触即给脚位施加一个高电平,该测试明确了车轮转向随电平的变化关系。为后

续小车基本运动函数的编写提供了参考。

2. PWM控制 L293D 驱动小车前进

下面演示的是用软件测试小车基本运动的步骤:

定义脚位、配置脚位的为输出模式

小车基本运动的实现:以前进函数、右转函数为例

后退、左转函数的脚位的电平与前进、右转的相反。用上述思路编写出完整

的程序,并将程序烧写进小车内。为了测试每个基本运动,可以在 loop()循环内

分别调用各个函数。

3. 超声波测距测试

将超声波测距的程序上传到 Arduino,打开串口监视器,可以看到:

4. Wifi 小车的调试

①将 WIFI程序下载烧写进小车

②搜索 hjwifi2014 上位机软件,连接

③打开视频

控制台前进、后退、左转、右转的测试,如果测试方向有误,可以修改设置

里面的指令,或者程序里面 switch()结构里的 case语句。

④打开浏览器,输入此视频地址,可以看到

视频可以通过此网址进行共享,此视频为一个时刻的图片,通过点击刷新按

钮可以获得此时的视频图像。

经过测试,WIFI小车不支持多台设备同时控制,但是可以共享视频。

设计所用全部资源清单

HJ-LINK高清

WIFI视频数传模

1个 PCB车底盘 1个

高清 USB摄像头 1个 小车马达 2个

Arduino uno R3主

1个 车轮(含万向轮) 3个

R3 多功能驱动拓

展板

1个 数显电压表 1个

HC-SR04 超声波

模块

1个 电池、杜邦线、螺

若干

参考文献

[1]TEXAS INSTRUMENTS.L293,L293D,QUADRUPLE HALF-H

DRIVERS.DALLAS,TEXAS 75265

[2]陈吕洲. Arduino 程序设计基础.北京:北京航空航天大学出版社,

2014

top related