“ServoTimer2”文件夹,将其复制粘贴至“X:\\arduino-1.5.4\libraries”文件夹中,重启IDE 即可,其中X表示安装盘符。
下面是舵机测试的示例程序,舵机将在左上方与右下方做规律性运动。
#include<ServoTimer2.h>// 舵机库存,使用定时器2 ServoTimer2 servoLev;// 水平舵机
ServoTimer2 servoVcl;// 竖直舵机#define MINPULSE 500// 0度位置#define MAXPULSE 2500// 180度位置#define MIDPULSE 1500// 90度位置void setup()
{
// put your setup code here, to run once: servoLev.attach(2);//水平位置舵机接数字2 servoVcl.attach(3);//竖直位置舵机接数字3 servoLev.write(MIDPULSE); servoVcl.write(MIDPULSE);//归中点位置delay(200);
}
void loop()
{
// put your main code here, to run repeatedly:
for(int i=MIDPULSE;i>MINPULSE;i--)//从90度位置运行至0度位置
{
servoLev.write(i); servoVcl.write(i); delayMicroseconds(1500);
}
for(int i=MINPULSE;i<MAXPULSE;i++)//从0度位置运行至180度位置
{
servoLev.write(i); servoVcl.write(i); delayMicroseconds(1500);
}
for(int i=MAXPULSE;i>MIDPULSE;i--)//从180度位置运行至90度位置
{
servoLev.write(i); servoVcl.write(i); delayMicroseconds(1500);
}
}
调试时先确保两个舵机归中时的角度刚好对着正前方,如果不是对着正前方,说明舵角安装
位置不正确,则需要重新进行调整。
4、路由器、摄像头
如果以上几个功能均调试通过的话,下面将要进行路由器的调试。将摄像头的 USB 线插到路由器上,并通电,然后等待路由器启动完成。手机或者电脑上默认已经安装好上位机软件, 搜索无线信号,连接上对应的“WIFIROBOT”无线信号,然后打开软件即可获得摄像头图像。 等所有功能调试通过后,下载 WIFIROBOT 下位机程序至 ARDUINO 主板中,接上路由的串口线,就可以通过手机或者电脑来遥控你的 WIFI 视频小车了。
连接路由器时务必仔细确认接线,路由器的 4 根输出线定义如下:
Ø 红线:路由器电源的正极,最大电压不能超过 5V
Ø 黑线:路由器电源的负极,接 GND
Ø 绿线:路由器串口 RXD 端,连接目标板的 TXD
Ø 黄线:路由器串口 TXD 端,连接目标板的 RXD
示例代码如下:
#include<ServoTimer2.h>//舵机驱动库文件ServoTimer2 servoLev;//水平位置舵机控制ServoTimer2 servoVcl;//竖直位置舵机控制
//电机驱动数字引脚 int AIN1 = 6;//AIN1 int AIN2 = 5;//AIN2
int BIN1 = 10;//BIN1
int BIN2 = 9;//BIN2
intcmdData[4];//定义一个数组用来存储串口接收到的数据,长度为 5 int tmpData;//存放数据的临时变量
int UARTDataCount = 0; int n = 0;
#define MIDPULSE 1500//500 表示舵机 0 度位置,1500 表示 90 度位置,2500 表示 180
度位置
/****************************************************************
舵机初使化函数,定义舵机连接引脚,上电归位等!
舵机 1(水平面):FF 01 01 舵机角度 FF数字引脚:3舵机 2(竖直面):FF 01 04 舵机角度 FF数字引脚:11
****************************************************************/ void initServo()
{
servoVcl.attach(2);//数字引脚:11
servoLev.attach(3);//数字引脚:3 servoLev.write(MIDPULSE); servoVcl.write(MIDPULSE);
delay(200);
}
void setup() {
pinMode(13,OUTPUT);//PIN 模式pinMode(AIN1,OUTPUT); pinMode(AIN2,OUTPUT); pinMode(BIN1,OUTPUT); pinMode(BIN2,OUTPUT);
Serial.begin(9600);//串口初使化initServo();//舵机初使化
}
/********************************************************
向前指令:FF 00 01 00 FF
向后指令:FF 00 02 00 FF
向左指令:FF 00 05 00 FF
向右指令:FF 00 04 00 FF
停止指令:FF 00 00 00 FF
*********************************************************/ void loop() {
// put your main code here, to run repeatedly: if(Serial.available())
{
tmpData=Serial.read();//读取来自串口的数据
if(tmpData == 0xFF && UARTDataCount <2)//检测包头是否为 0XFF
{
cmdData[0] = tmpData; UARTDataCount++;
n = 1;
}
else
{
cmdData[n]=tmpData; n++;
}
if(UARTDataCount == 2)
{
cmdData[0] = 0xFF; cmdData[4] = 0xFF; n = 1;
UARTDataCount = 0; Serial.flush();//清缓冲区
}
}
if(cmdData[0]==0xFF && cmdData[4]==0xFF)//收到完整的数据包
{
switch(cmdData[1])//判断数据类型
{
case 0x00://指令数据控制switch(cmdData[2])
{
case 0x01: setMotor(100,100); break;
case 0x00: setMotor(0,0); break;
case 0x02:
setMotor(-100,-100); break;
case 0x03:
setMotor(-100,100); break;
case 0x04: setMotor(100,-100); break;
}
break;
case 0x01://舵机数据控制
switch(cmdData[2])
{
case 0x01: servoLev.write(cmdData[3]*13+500); break;
case 0x04: servoVcl.write(cmdData[3]*13+500); break;
}
break;
}
}
}
void setMotor(int MOTORA,int MOTORB) //电机驱动函数
{
if(MOTORA>=0)
{
digitalWrite(AIN2,HIGH); analogWrite(AIN1,255-MOTORA);
}
else
{
digitalWrite(AIN1,HIGH); analogWrite(AIN2,MOTORA+255);
}
if(MOTORB>=0)
{
digitalWrite(BIN2,HIGH); analogWrite(BIN1,255-MOTORB);
}
else
{
digitalWrite(BIN1,HIGH); analogWrite(BIN2,255+MOTORB);
}
}
WIFI 视频小车用户手册
此手册教程归YFROBOT团队所有,YFROBOT对手册保留一切权力,非经授权同意,任何个人或者单位不得擅自摘录手册内容用于商业用途.用户可以自由的在网上分享传播,让更多的人受惠,但务必请保证手册的完整性.
此手册旨在帮助用户更好的完成 WIFI 视频小车的制作,YFROBOT 有权对该手册进行更正、修改,包括对 WIFI 视频车套件的功能进行增强、改进或者其他更改,而不另行通知.
YFROBOT 保证套件中包含的所有配件的完整性,包括外观、数量、功能必须符合使用要求,若存在非人为的质量问题,将为用户提供免费更换服务.YFROBOT 不对用户的任何应用承担风险,包括但不局限于不正确的使用、商业/工业应用、转嫁给其他用户等造成的损失.
使用过程中请务必注意以下事项:
Ø 底板边角锐利,安装时注意不要划到手指
Ø 若使用电烙铁、剥线钳类工具,请谨慎操作
Ø 套件含有细小部件,应避免发生吞食
Ø 未成年人需在成人陪同下完成安装
如果是新手用户,初次接触arduino,那么我建议至少认真阅读下面链接内的一些帖子:
http://www.yfrobot.com/forum-2-1.html
也可以参考官网的教程:
http://arduino.cc/en/Guide/HomePage#.UxWINfmSyD4
在进行编程之前,我们必须先完成小车底盘的安装,教程参考:
“WIFI视频用户资料/WIFI小车安装教程”
小车使用的硬件平台为YFROBOT自主兼容板-BlueBird v3.0,它使用官方开源的UNO R3 固件,主板扩展了A6及A7引脚,用户可以用来做电池电压检测,以及环境光的检测。使用的是官方的UNO固件,驱动的安装及IDE的使用请参考:
“WIFI视频用户资料/驱动程序的安装”
特性:
Ø 14 组数字I/O引脚
Ø 8组模拟输入引脚
Ø FT232RL,拥有更快且稳定的下载速度
Ø “Bitbang”模式,可以用来重新固化BootLoader
Ø 扩展A6、A7模拟输入端
Ø DC7-15V 电源输入
* “Bitbang”模式,可以当作一个AVR芯片的下载器,即使主芯片BootLoader丢失,用户可以通过简单的接线重刷固件,或者给其他AVR目标芯片/板重写固件.
小车套件另外配置了一块接口丰富的多功能扩展板,集成了高效率的电机驱动、高转换率的 电源管理单元以及加入了蜂鸣器、光敏电阻等,它可以直接插到 R3 或者其他兼容版本上使用。
特性:
Ø 电源转换
Ø 电池电压检测
Ø 双路直流电机驱动
Ø 环境光检测
Ø 蜂鸣器警报
Ø 数字传感器接口
安装调试
参考“WIFI视频用户资料/WIFI小车安装教程”完成安装,我们需要逐个调试小车功能,包括整个系统的供电,小车的前后左右运动,舵机转向以及路由器、摄像头功能等。
1、系统的供电
在测试供电是否正常时,移除路由器以及舵机的相关接线。然后按下开关,多功能扩展板的VBST指示灯点亮,说明扩展板升压单元工作正常。降压模块的输出正极
(红线)接到扩展板任意的“V”端子上输出负极(黑线)接到扩展板的“G”端子上,如右图所示:
注:LM2596降压模块默认已经调至5V输出,用户不需要再旋转电位器进行调节。
采用这种“升-降压”方法有以下几个优点:
Ø 即使低输入时,也可以获得稳定的电压输出。
Ø 使系统更加稳定,电机的瞬间启动电流是正常工作的5-7倍,如果直接用电池驱动
电机,那么电机频繁启动的瞬间,VBAT电压都会被拉低,有可能导致控制系统掉电重启.而采用先升后降的方法,即使VBAT电压被拉低,因为控制系统是使用
VBOOST降压供电的,因此不会导致供电不足.
Ø 更宽的电压输入范围
Ø MAX1771具有接近92%的转换效率,对于整个系统而言,能量损耗非常小。
扩展板有两种供电方式,第一种是电源从Arduino主板 的DC电源座输入,如右下图所示.请确保输入电源满足以下两个要求:
Ø 电源电压须在7.2V-9V之间
Ø 能够提供足够功率
这时候输入电源通过内部的保护二极管接到
Bluebird主板的Vin,Vin通过主板自带的5V稳压给控制单元供电,同时通过Vin接口将电源提供给上层的扩展板.
* 该模式下扩展板供电选择端子 J1 必须设置到左侧,如右图圆圈内所示. 第二种供电方式是电源从扩展板的VIN电源输入
端子接入,如下图所示,请确保输入电源能够满足以下两个要求:
Ø 电源的输入电压在3-9V之间
Ø 能够提供足够的功率
这时候电源通过扩展板的接线端子输入,先将电
压预升至9V,然后将9V通过Vin连接到控制主板的Vin,主板再通过自身的5V稳压给控制单 元件供电.
* 该模式下扩展板供电选择端子 J1 必须设置到右侧,如右图圆圈内所示.
使用第一种供电方式,当电压下降时,电机的频繁启动会将总电源的输出电压拉低,当低于
7V 时就不足以给主板提供稳定可靠的电源,主板便会重启;
使用第二种供电方式,电源从扩展板的 Vin 输入,同时将 J1 跳线设置到右侧,因为主板使用的是经过升压再降压的供电方式,因此即使电压跌落至 5V,主板仍然能够正常工作。我们推荐用户选择第二种供电方式。使用时不可将电池电量完全用光,这将严重影响电池寿 命。
Tips:锂电池组均带有保护板,可以有效的防止用户在使用中的一些不当操作,例如过充、 过放以及短路。当你发现你的电池即使充满电也没有电压输出时,不要惊慌。肯定是你的不正确操作导致电池开启了保护模式,这时我们只需要做一个简单的激活就可以,有以下两种方法可以解除保护:(推荐使用第二种方法)
Ø 在电池输出的正负极施加大于
7.4V的电压, 时间1秒左右即可。
Ø 将充电线靠边侧的黑线与电机输出的黑线短接1秒,如右图所示:
2、小车前后左右运动控制
小车底盘采用4轮驱动结构,由于同一侧速度肯定是相同的,所以这里我们将同一侧电机并联。将左侧的两个电机并联接至A+、A-;将右侧的两个电机并联接至B+、B-。小车转弯则 是通过左右两侧电机速度不同来控制的。
右图为小车使用的直流减速电机,减速比为 1:48,额定电压为 3-9V.
为什么使用带减速的电机,因为普通的直流电机原使转速非常的快,能够达到 1 万转/分,但负载能力却很低,属于高速低扭,这样小车的运行状态不好控制,而且承重能力也很弱;而加入减速箱后,不仅可以将速度控制在很好的范围内,而且其输出扭矩也得到了很大提升
*由于制造工艺的问题,直流电机之间存在速度差.
* 下面表格内的数据仅作为参考
减速比
1:xx | 额定电压
DC(V) | 额定电流
ma | 空载转速
rpm/m | 负载转速
rpm/m | 力矩
kg.cm |
1:48 | 3 | 160 | 120 | 100 | 0.45 |
| 6 | 220 | 200 | 175 | 1.0 |
| 7.2 | 250 | 250 | 210 | 1.5 |
当我们在直流电机的两极施加一定的电压后,电机开始匀速转动,如果这时候将电极对调, 原来的正极变负极、负极变正极,那么电机就会反向转动.
下图是典型的“H”桥电路,采用下面这种电路,即可实现上面所说的电极翻转,从而达到 电机的正反转.
Ø 常态下,4个桥臂的开关保持开路状态,这时候电机两端悬空,没有电压.
Ø 当1、4开关闭合,2、3开关打开,电流从1号开关流经电机,再从4号开关流出,这 时候电机正转.
Ø 当2、3开关闭合,1、4开关打开,电流从2号开关流经电机,再从3号开关流出,这 时候电机反转.
通过上面的分析,我们只需要通过控制 1、2、3、4 号开关的打开与关闭,即可以实现对电机转向的控制.如果在改变开关的导通时间,就可以实现对电机转速的调节.
下图为扩展板采用的电机驱动电路:
这是一个双通道 H 桥驱动器,能够驱动两个直流 DC 马达,它由 N 沟道功率 MOSFET 组成, 因此具有较低的导通内阻.与 ST 的 L293D、L298N 相比,DRV8833 电机驱动拥有更高的驱
动效率。每个 H 桥能够提供持续 1.5A、峰值 2A 的输出电流,电机电压输入范围为 2.7V 至
10.8 V。
*模块虽然保留了SENSEA与SENSEB两个检测接口,但正常情况下不使用。
通过AIN1/AIN2(Arduino数字引脚D5、D6)可以控制MOTORA电机,通过BIN1/BIN2(Arduino数字引脚D9、D10)可以控制MOTORB电机,下面电机MOTORA的逻辑控制表:
输入信号AIN可以使用PWM信号来控制,从而实现对电机转速的调节,PWM调速时, 也分快速衰减模式与慢速衰减模式,下图为PWM调节时的逻辑真值表:
* 关于快速衰减与慢速衰减的详细描述,用户可以参考芯片手册,这里推荐使用慢速衰减模式.用户也可以自己编写一个快速衰减模式的程序来查看二者之间的区别.
下面为一个简单的电机驱动函数,工作在慢速衰减模式,用来设置电机转动方向与转动速度. void setMotor(int MOTORA,int MOTORB)
{
if(MOTORA>=0)//判断方向,大于0表示正向
{
digitalWrite(AIN2,HIGH);//AIN2引脚置高analogWrite(AIN1,255-MOTORA);//AIN1输入PWM信号
//PWM是高电平的占空比,这里需要取反,所以255-MOTORA
}
else//判断方向,小于0表示反向
{
digitalWrite(AIN1,HIGH);
analogWrite(AIN2,MOTORA+255);//PWM是高电平的占空比
//这里需要取反,这时MOTORA为负值,所以MOTORA+255
}
if(MOTORB>=0)//判断方向,大于0表示正向
{
digitalWrite(BIN2,HIGH);//BIN2引脚置高analogWrite(BIN1,255-MOTORB);//BIN1输入PWM信号
//PWM是高电平的占空比,这里需要取反,所以255-MOTORB
}
else
{
digitalWrite(BIN1,HIGH);
analogWrite(BIN2,255+MOTORB); //PWM是高电平的占空比
//这里需要取反,这时MOTORB为负值,所以MOTORB+255
}
}
# setMotor(motorA,motorB) 用来设置电机速度,例如setMotor(127,127)表示小车向前以半速行驶,255最大表示全速;setMotor(-127,-127)则表示小车向后以半速行驶,-255 最大,表示全速.setMotor(0,0)则表示停车.
调试时,如果遇到4个电机的转向与实际不一致,可以交换对应电机的两个电极,即可实现电机转向协调一致!
3、舵机转向
WIFI视频车套件采用Futaba S3003舵机作为2自由度转向云台,从而实现了摄像头上、下、左、右四个方向的运动控制。
因为官方的舵机库与电机驱动的D9