Openjumper寻线小车教程-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 56856|回复: 25

Openjumper寻线小车教程

[复制链接]
发表于 2013-8-21 16:31 | 显示全部楼层 |阅读模式
本帖最后由 money0010 于 2014-1-25 10:03 编辑

                  Openjumper寻线小车教程
一.概述
          简介

11.jpg
寻线小车作为智能小车制作的初级项目,因其组装试调简单,且涵盖了软硬件组装试调和智能控制思想等多方面的知识而深受广大爱好者和学习者们的喜爱。许多高校也常年开展寻线小车的比赛来训练学生的动手实践能力。通过制作寻线小车,我们可以学会控制器的基本原理和使用方法,红外传感器的特性和使用,如何使用电机驱动驱动电机,小车自动控制的原理和程序的编写等知识。且在制作寻线小车的基础上,往后还可以通过改装实现壁障,遥控,避崖,走迷宫等多种功能。
基本原理
场地:寻线小车,故名思议就是一台可以自己寻着线条行驶的智能车。跑道一般为白底黑线,黑线一般为电工胶带,白底用白色泡沫板或者浅色的地板。
12.jpg
控制流程:小车的红外传感器检测到黑线的位置后发送给控制器,控制器判断应该如何行走,再通过电机驱动控制电机转速来改变小车的行驶方向。
13.jpg
转向原理:小车有2个驱动轮和一个万向轮,可以用差速原理来控制小车转向。差速转向就是通过驱动两个轮子以不同速度运行,从而达到转弯的目的。例如控制你的小车左边电机转速慢,右边电机转速快,单位时间右轮行驶距离比左轮大,小车就自然往左边转动。目前大型的挖掘机,推土机、坦克都是采用这种驱动方式。由于驱动简单,对硬件要求的考虑,此次我们演示制作智能小车也采用这种驱动方式。
14.jpg 15.jpg
二.需要的材料
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锂电池,需要单独购买。)
16.jpg
2.安装传感器
17.jpg
传感器的安装较为简单,用螺母,螺丝固定到小车底板前端的孔洞上即可。再将传感器接线穿过上层板预留的孔后接到扩展板上。
18.jpg
注意传感器线的使用:openjumper的传感器专用3p杜邦线黑色为GND        红色为VCC白色为信号线接IO口上,按颜色插在扩展板上即可。
3.板卡组装
19.jpg
如图,先将arduino UNO用尼龙柱或铜柱固定在小车的上层板。小车车体板上有与UNO兼容的孔洞,并且2个方向都可以安装,建议用图片上相同的位置安装,以便接下来电机和电源的接线。
用螺丝螺母固定好板卡后,将电机驱动板和传感器扩展板依次叠插在uno上,注意方向和针脚的对应。
20.jpg
接下来就可以进行连线和电机的测试了。
将下层的电机线,电源插头,电机驱动的供电线穿过上层板的孔洞。
Uno插上电源插头,通电正常后LED电源指示灯点亮。
         将电池正极线连接到电机驱动板VIN负极接到GND,供电部分连线完成。下面先下载一个程序来为电机接线做准备。
21.jpg
电机的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]

程序下载好后,将电机连线进行试接。连线正确后左电机反转,右电机正转,如果电机转向错误,交换连线直到正确为止。
四.规格
  
控制器
  
Arduino uno
电机驱动
L298
驱动部分工作电流
2A
驱动部分输入电压
4.8~25V
逻辑部分输入电压
5V
200mm
180mm
110mm
重量
520g
电机型号
130
电机电压
3-6v
转速
125转/分
减速比
48/1
最大行驶速度
47.7米/分
电机空载电流
110ma
电机堵转电流
150ma
车轮直径
65mm
底盘离地面高度
20-22mm

.引脚
  
IO
  
类型
作用
描述
D4
数字输出
电机A正反转控制端
1为正转0为反转
D5
PWM输出
电机A调速端
电机速度0-255
D6
PWM输出
电机B调速端
电机速度0-255
D7
数字输出
电机B正反转控制端
1为正转0为反转
D11
数字输入
左传感器
检测到黑线为0未检测到为1
D12
数字输入
中间传感器
检测到黑线为0未检测到为1
D13
数字输入
右传感器
检测到黑线为0未检测到为1

六.示例代码
[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算法。

发表于 2013-8-22 20:20 | 显示全部楼层
这个教程清晰,顶一个
发表于 2013-10-12 00:18 | 显示全部楼层
楼主请问:您完成图中为什么是5根3P的杜邦线呀 我感觉只有三个传感器的接上了 不知道是不是自己还漏掉了哪里 向您请教一下
 楼主| 发表于 2013-10-14 17:28 | 显示全部楼层
Polygone 发表于 2013-10-12 00:18
楼主请问:您完成图中为什么是5根3P的杜邦线呀 我感觉只有三个传感器的接上了 不知道是不是自己还漏掉了哪 ...

还有两根是测速的线,自己加的,忘了去掉,这里用不到
发表于 2013-10-15 16:40 | 显示全部楼层
money0010 发表于 2013-10-14 17:28
还有两根是测速的线,自己加的,忘了去掉,这里用不到

多谢楼主!自己就等电池送到来测试小车了
发表于 2013-11-30 14:50 | 显示全部楼层
请问楼主,红外循迹模块一直检测不准确
怎么办啊!
 楼主| 发表于 2013-12-2 10:51 | 显示全部楼层
逸天空逝 发表于 2013-11-30 14:50
请问楼主,红外循迹模块一直检测不准确
怎么办啊!

用灰度传感器,做的寻迹模块
发表于 2013-12-2 11:55 | 显示全部楼层
money0010 发表于 2013-12-2 10:51
用灰度传感器,做的寻迹模块

只有红外的,我把传感器放低了可以了,就是有时候因为速度较快,传感器只是闪一下但是小车没有反应,用什么函数能调节一下?谢楼主啦
发表于 2013-12-2 16:49 | 显示全部楼层
楼主这小车在哪可以买到?
发表于 2013-12-3 14:02 | 显示全部楼层
新月 发表于 2013-12-2 16:49
楼主这小车在哪可以买到?

淘宝上有套装搜索“智能小车套装 ”
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-27 14:56 , Processed in 0.088343 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表