本帖最后由 money0010 于 2014-1-25 10:03 编辑
Openjumper寻线小车教程 一.概述 简介
寻线小车作为智能小车制作的初级项目,因其组装试调简单,且涵盖了软硬件组装试调和智能控制思想等多方面的知识而深受广大爱好者和学习者们的喜爱。许多高校也常年开展寻线小车的比赛来训练学生的动手实践能力。通过制作寻线小车,我们可以学会控制器的基本原理和使用方法,红外传感器的特性和使用,如何使用电机驱动驱动电机,小车自动控制的原理和程序的编写等知识。且在制作寻线小车的基础上,往后还可以通过改装实现壁障,遥控,避崖,走迷宫等多种功能。 基本原理 场地:寻线小车,故名思议就是一台可以自己寻着线条行驶的智能车。跑道一般为白底黑线,黑线一般为电工胶带,白底用白色泡沫板或者浅色的地板。 控制流程:小车的红外传感器检测到黑线的位置后发送给控制器,控制器判断应该如何行走,再通过电机驱动控制电机转速来改变小车的行驶方向。 转向原理:小车有2个驱动轮和一个万向轮,可以用差速原理来控制小车转向。差速转向就是通过驱动两个轮子以不同速度运行,从而达到转弯的目的。例如控制你的小车左边电机转速慢,右边电机转速快,单位时间右轮行驶距离比左轮大,小车就自然往左边转动。目前大型的挖掘机,推土机、坦克都是采用这种驱动方式。由于驱动简单,对硬件要求的考虑,此次我们演示制作智能小车也采用这种驱动方式。 二.需要的材料1. 车体:Openjumper小车车体套件×1 2. 控制器:Arduino uno×1 3. 电机驱动:openjumperL298电机驱动板×1 4. 扩展板:UNO配套的传感器扩展板×1 5. 寻线模块:红外寻线传感器×3 6. 尼龙柱,螺丝螺帽,杜邦线,传感器3p杜邦线若干。 三.硬件的组装试调1.车体组装详见小车车体组装教程。 注意事项: 1.先不要将上层车体板用螺母固定,组装板卡时还需要将上层板取下。 2.电机驱动板上的VIN,GND接线端子需要直接通过电池供电,以提供驱动电机的电流。所以在完成车体组装前最好先用2根电源线将电池的正负极引出备用。(小车套件不配电池,电池盒需要2节18650锂电池,需要单独购买。) 2.安装传感器传感器的安装较为简单,用螺母,螺丝固定到小车底板前端的孔洞上即可。再将传感器接线穿过上层板预留的孔后接到扩展板上。 注意传感器线的使用:openjumper的传感器专用3p杜邦线黑色为GND 红色为VCC白色为信号线接IO口上,按颜色插在扩展板上即可。 3.板卡组装如图,先将arduino UNO用尼龙柱或铜柱固定在小车的上层板。小车车体板上有与UNO兼容的孔洞,并且2个方向都可以安装,建议用图片上相同的位置安装,以便接下来电机和电源的接线。 用螺丝螺母固定好板卡后,将电机驱动板和传感器扩展板依次叠插在uno上,注意方向和针脚的对应。 接下来就可以进行连线和电机的测试了。 将下层的电机线,电源插头,电机驱动的供电线穿过上层板的孔洞。 Uno插上电源插头,通电正常后LED电源指示灯点亮。 将电池正极线连接到电机驱动板VIN负极接到GND,供电部分连线完成。下面先下载一个程序来为电机接线做准备。 电机的2根线并没有正负之分,电机驱动板上的M1,M2接线端子也不能确定应该对应左右哪一个电机 将以下这个程序下载到uno中可以方便我们对小车电机进行连线
[mw_shl_code=cpp,true]/*
电机测试程序
功能:测试电机驱动功能和电机连线是否正确
效果:左电机反转,右电机正转,电机转速由小到大。
*/
int INA = 4; //电机A正反转控制端
int PWMA = 5; //电机A调速端
int INB = 7; //电机B正反转控制端
int PWMB = 6; //电机B调速端
void setup(){
pinMode(INA,OUTPUT);
pinMode(INB,OUTPUT); //配置电机输出IO口为输出
}
void loop(){
int value;
for(value = 20 ; value <= 255;value+=2){ //循环每次速度增加2最大到255
motosp(-value,value);//电机速度赋值,左电机负值为反转,右电机正转。
delay(50);
}
}
void motosp(int sp1,int sp2)//声明电机速度控制函数。括号内定义的变量分别为左右电机速
//度值,范围-255~+255,正值为正转,负值为反转。
{
if(sp1>0) {
digitalWrite(INA, HIGH);
}
else
{
digitalWrite(INA, LOW);
}
if(sp2>0)
{
digitalWrite(INB, HIGH);
}
else
{
digitalWrite(INB, LOW);
}
analogWrite(PWMA,abs (sp1));
analogWrite(PWMB,abs (sp2));
}[/mw_shl_code]
程序下载好后,将电机连线进行试接。连线正确后左电机反转,右电机正转,如果电机转向错误,交换连线直到正确为止。 四.规格
.引脚
六.示例代码[mw_shl_code=cpp,true]void motor(char pin,char pwmpin,char state,int val)
{
pinMode(pin, OUTPUT);
if(state==1)
{
analogWrite(pwmpin,val);
digitalWrite(pin,1);
}
else if(state==2)
{
analogWrite(pwmpin,val);
digitalWrite(pin,0);
}
else if(state==0)
{
analogWrite(pwmpin,0);
digitalWrite(pin,0);
}
}
void runfoward(int i) //前进
{
motor(4,5,1,i);
motor(7,6,1,i);
}
void runback(int j) //后退
{
motor(4,5,2,j);
motor(7,6,2,j);
}
void turnL(int m) //左转
{
motor(4,5,1,m);
motor(7,6,0,0);
}
void turnR(int n) //右转
{
motor(4,5,0,0);
motor(7,6,1,n);
}
void stop() //停止
{
motor(4,5,0,0);
motor(7,6,1,0);
}
void setup()
{
pinMode(10,INPUT);//定义右边传感器,
pinMode(11,INPUT);//定义中间传感器,
pinMode(12,INPUT);//定义左边传感器,
Serial.begin(9600);
}
void loop()
{
char num1,num2,num3;
num1=digitalRead(12);
num2=digitalRead(11);
num3=digitalRead(10);
if((num1==0)&&num2&&num3)
{
turnL(120); //检测到左边传感器遇到黑线,说明小车右偏了,立即往左转一点
delay(2);
while(1){
num2=digitalRead(11); //循环判断中间传感器度数,
if(num2==1)
{ turnL(120); //如果num2==1说明还没有转到中间位置,继续左转
delay(2);}
else
break; //检测到num2==0说明转过头了,跳出循环,检测三个传感器的状态再做出相应动作
} //后面道理相同
}
else if(num2&&num1&&(num3==0))
{
turnR(120);
delay(2);
while(1)
{
num2=digitalRead(11);
if(num2==1){
turnR(120);
delay(2);}
else
break;
}
}
else
{
runfoward(120);
delay(2);
}
}[/mw_shl_code]
七.改进思路虽然小车原理非常简单,但要让它跑的又快又稳是需要费一番心思的哦。本篇的教程讲述了一个最简单的寻线小车的制作方法,还有许多不足之处就需要大家自己去发现和改进了。下面给大家一些改进加强的提示。 1. 加装测速码盘: 测出小车2个电机的转速,可以对小车行驶状态精确控制。 2. 增加传感器数量:本教程只用了3个红外传感器,如果想让小车跑的更平稳,可以加装更多的传感器。 3. 使用其他的传感器:arduino提供有数个模拟输入IO,例如我们这里使用的uno板就有6个,分别为A0-A5。所以我们可以使用模拟量的传感器,例如灰度传感器,每个传感器距离黑线位置不同时,返回的值为0-1024而我们用的传感器返回值只有0/1两个状态。用模拟量的传感器就能更精确的计算黑线相对小车的位置。 4. 改进算法:本篇教程的示例程序用的是最简单的判断算法。若要让小车跑的更好,可以改进小车程序,让它变得更聪明。例如自动控制中常用的PID算法。
|