2440智能小车方案.docx
《2440智能小车方案.docx》由会员分享,可在线阅读,更多相关《2440智能小车方案.docx(15页珍藏版)》请在冰豆网上搜索。
![2440智能小车方案.docx](https://file1.bdocx.com/fileroot1/2023-1/27/44e75a4d-e4eb-46b2-8d9e-b4dd9659b17c/44e75a4d-e4eb-46b2-8d9e-b4dd9659b17c1.gif)
2440智能小车方案
智能小车方案2
技术说明
2010年5月
1.摘要
本智能小车采用三星公司的S3C2440芯片作为主板的控制核心,在嵌入式linux环境下,编写GPIO口的驱动,并编写智能探月车的应用程序。
小车主板采用wifi无线方式与PC机相连,由PC机控制小车的运行与终止。
通过光电发射接收组件能够实现小车的偱迹,利用PWM技术控制直流电机的前进速度和方向,此外还配有外置摄像头与主板cam接口相连可实现抓拍图像并识别,并将拍摄到的图像通过wifi方式发送给PC机。
关键词:
ARM嵌入式linuxS3C2440智能探月车循迹wifi摄像
2.
智能小车总体概况
2.1.概述
“探月车”采用以S3C2440为核心的天嵌TQ2440开发板和一块通用板为基础,经焊接相关控制芯片而成,无线通信则是利用PC机与无线路由器搭配环境平台共同实现的。
具体请见软件控制电路。
通过GPIO口检测信号,输出PWM信号控制直流电机的、前进、停止、左转和右转。
与开发板cam接口相连的外置摄像头用来完成几个监测点处的抓拍图像。
检测信号则利用五组红外发射和接收管,黑线时输出高电平,白线时输出低电平,从而最终实现智能小车的正确偱迹。
2.2.作品智能小车
3.
嵌入式探月车硬件设计
3.1.硬件结构图
3.2.TQ2440开发板简介
TQ2440开发板基于三星S3C2440芯片,如下图所示:
主要接口说明:
电源接口:
输入电压不能大于7伏电压,标准电源试配器为5伏。
音频接口:
红色为音频输入接口,另一个为音频输出接口。
USB接口:
主要用于传输数据。
串口接口:
串口接口主要是它能使PC机和开发板直接进行交换操作和数据传送,完成调试。
SB______________________________________________________________________________________________________________________________
网卡接口:
在启动操作系统后,接上无线网卡,就可以对小车发送无线信号。
Jtag接口:
Jtag接口主要作用是当NandFlash或NorFlash中没有uboot时,使用Jtag接口进行烧写。
3.3.主要I/O口说明
主控芯片为三星S3C2440芯片,如图:
主要用到的I/O口包括:
1.用EINT3、EINT4口用来检测红外寻迹传感器反馈的信号。
2.用nLED_1、nLED_2、nLED_3、nLED_4
GPIO口输出PWM信号来控制电机运动
3.4.直流电机驱动模块
3.4.1.电机驱动模块实物图
驱动板主要采用了L298N芯片,它具有带载能力强的特点。
3.4.2.L298N驱动原理图
驱动电路芯片外围电路主要用由二极管构成的电桥电路,两组电机
并联而成。
3.4.3.H桥控制方案
小车通过采用L298N芯片可以达到目的,整体控制方案如图
电机共有四4路PWM输出分别作为左右轮的驱动,而通过两路PWM输出可控制一个电机,两电机为并联即可。
L298N芯片内部结构如图
真值表如下所示:
当使能信号ENABLE为高时输出才随输入变化,否则为高阻态,所以焊接时,ENABLE及VS均接VCC。
具体驱动过程为:
1.通过编程由控制芯片经PWM发出驱动信号,PWM输出作为L298N的输入,经L298N转换输出控制信号使电机转动,从而实现电动机的驱动。
2.PWM输出信号的高低则可以控制直流电机转速,当占空比大时,转速高,占空比小时,转速低,所以当PWM信号输出占空比为0时可控制电机的停止。
3.当左轮停止,右轮转时,小车左转。
当右轮停止,左轮转动时,小车右转。
而两路PWM输出的正负顺序转换则可控制电机的正反转,进而控制小车的前进和后退。
3.5.寻迹模块
检测原理:
路径检测采用红外光电传感器组件(白色为发射管,黑色为接收管)如图所示:
根据不同颜色对红外光的反射率不同,白色很高,黑色很低。
所以当发射管发出红外光线经白色线时,觉大部分都被黑色管接收,处于导通状态,输出低电平,而红外光经黑色线时,接收不足,黑色管无法导通,输出高电平。
输出的高低电平经GPIO口接入8013ARM中,通过一定的算法即可判断,从而输出控制信号,控制小车的路径。
优点:
结构简明,实现方便,成本低廉,反应灵敏,便于近距离路面情况的检测, 红外线是波长为830nm~950nm的电磁波,自然环境物理在该波段的辐射量是很微弱的,所以抗干扰能力强,不会因为周围环境的差别而产生不同的结果。
缺点:
只能对路面情况做简单的黑白判别,检测距离和精度有限,传感器高度位置的差异可能会对其检测造成干扰。
另外,由于车模的总长不得大于40CM,所以前瞻距离受到很大的限制
3.5.1.红外传感器电路如图
a.红外发射管为二级管,接收为三极管,当接收三级管导通时集电极输出低电平,断开时集电极输出高电平。
b.如图所示,接收管集电极输出接入比较器339正极,比较器负极则为滑动变阻器的输出,当正极高于负极时,比较器输出5V高电平,否则为0V低电平
c.比较器输出则接入ARM的GPIO口,通过读GPIO口的状态即可判断是黑线或白线
d.光电传感器都接限流电阻,比较器输出接上拉电阻。
3.检测路径规划
本小车采用四组红外光电传感器,排列如图所示:
小车在画有黑线的白纸“路面”上行使,由于黑线和白线对光线的反射系数不同,可根据接收到的反射光的强弱来判断轨迹—黑线。
判断信号可通过开发板上的驱动模块利用GPIO口的状态即可判断是黑线或白线从而修正小车前进方向,以使其保持沿着黑线行进。
小车寻迹板中间两组用于辨识黑色线,使小车能沿着黑色线前进,且两组宽度要适当,太窄则同时感应到黑线或白区域,算法不好控制小车能沿着黑色线行走,即易偏离轨迹。
当左组光电传感器检测到黑色线时,小车右转,当右组光电传感器检测到黑色线时,小车左转,否则小车前进,这样即可保证小车能沿着既定的轨迹前进而不偏路。
3.6.无线通讯模块
通过无线网卡实现无线数据的传输。
3.7.摄像头模块
摄像头的安装位置对小车的性能有很大的影响,主要体现在图像采样效果和对小车重心的影响两个方面。
安装的低了,易导致视野不够广阔,影响寻线的有效范围;安装得高了,指引线在图像坐标上会变得过窄而无法被检测到。
若安装的太高,系统会因重心抬高而稳定性变差。
若安装太靠前,则小车的重心会前移,进而在前行的过程中容易出现“点头”的不稳定情况,重心前移也易导致驱动轮即后轮对地的压力减小,容易出现驱动力不足或者打滑的现象。
安装位置合适的一个原则就是:
摄像头的安装,首先必须满足头像采样效果的需要。
控制策略简单,则所需的拍摄范围就可较小;反之策略复杂,需获得的赛道信息较多,则拍摄范围应大一些。
其次,摄像头的安装对小车重心的影响不能导致小车出现运动不稳定的现象。
综合考虑后,我们选择如图3.3所示的安装方式。
4.嵌入式探月车软件设计
软件部分是小车的智能化的体现,它控制小车所有的运行状态。
程序在RedHat9环境下采用vi编辑器进行编写,用arm-linux-gcc交叉编译工具编译,在经过终端Sercurt-CRT通过串行口向小车烧入交叉编译后的程序。
应用软件控制小车的循迹、拍照、发送文件等行为。
此外,在主机端用3CDaemon软件架设FTP服务器,并建立无线局域网。
这样,小车就可以循迹并到达指定地点拍照并发送图片,而PC机端就可以接收通过wifi传送过来的图片。
4.1.软件整体设计
“探月车”软件部分整体设计如下图所示:
4.2.驱动程序设计
驱动程序利用TQ2440开发板提供的例程进行改写,并编译进内核。
4.3.电机控制子程序
通过将nLED_1引脚、nLED_2连成回路,nLED_3、nLED_4引脚连成回路,控制电平的高低,从而控制电流的流向,达到控制电机正反转的目的,其主要函数如下:
intback(intt,intfd)//后退
{
ioctl(fd,1,0);
ioctl(fd,0,1);
ioctl(fd,1,2);
ioctl(fd,0,3);
return(0);
}
小车的左前电机后转,右前电机也向后转,小车前后电机联动,所以小车整体后退。
intforward(intfd)//前进
{
ioctl(fd,0,0);
ioctl(fd,1,1);
ioctl(fd,0,2);
ioctl(fd,1,3);
return(0);
}
小车的左后电机正传,右后电机正转,小车前后电机联动,所以小车整体前进。
intr(intfd)//右转
{
ioctl(fd,0,0);
ioctl(fd,1,1);
//ioctl(fd,0,2);
//ioctl(fd,0,3);
return(0);
}
小车的左侧电机正转,右侧电机的不转,所以小车整体右转。
intfr(intfd)//
{
ioctl(fd,1,0);
ioctl(fd,0,1);
return(0);
}
小车左侧电机反转,右侧电机不转,小车整体向右后方向转。
intl(intfd)
{
//ioctl(fd,0,0);
//ioctl(fd,0,1);
ioctl(fd,0,2);
ioctl(fd,1,3);
return(0);
}
小车左电机不转,右后电机正转,小车整体左转。
intfl(intfd)
{
ioctl(fd,1,2);
ioctl(fd,0,3);
return(0);
}
小车左侧电机不转,右侧前电机转,小车整体向左后方向转。
intstop(intfd)
{
ioctl(fd,0,0);
ioctl(fd,0,1);
ioctl(fd,0,2);
ioctl(fd,0,3);
return(0);
}
左右电机全停止工作,小车停止工作。
4.4.循迹控制子程序
通过读取设备得到代表不同路况的返回值,从而做出相应的动作,基本代码如下:
for(;;){
cmd=read(deteFd,NULL,NULL);
if(cmd!
=old_cmd)
{
switch(cmd)
{
case3:
onR=5;onL=5;
break;
case2:
onR=-2;onL=10;
break;
case1:
onR=10;onL=-2;
break;
case0:
onR=0;onL=0;
break;
}
old_cmd=cmd;
}
if(cmd==0){break;}
time=(time+1)%10;
if(timeif(timeif(onR<0)fr(fd);
if(onL<0)fl(fd);
}
主要通过寻迹板上的光电器件控制,利用处于白布和黑布间的输出电压不一样来,GPIO口读入黑白线判断,从PWM口输出驱动信号来控制电机。
具体如下
a.当小车接收到开始信号时,小车前进,并寻线。
b.小车上线后寻线并判断是否遇到断点,遇到断点,电机停止并对参考物拍照传送。
c.电机停止时,变量会对断点的个数进行累计。
并判断是否<4,断点小于4时,继续循环寻线累计断点。
d.当变量>4时,则小车跳出循环,到达终点,电机停止。
4.5.无线通讯子程序
此部分内容为socket编程,部分代码如下:
intsendstring(char*addr,intport,char*sendchar)
{
structsockaddr_ins_addr;
intsock;
intaddr_len;
intlen,i;
if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){
perror("nosocket");
exit(errno);
}
else
printf("createsocket.\n\r");
s_addr.sin_family=AF_INET;
if(port)
s_addr.sin_port=htons(port);
else
s_addr.sin_port=htons(10001);
if(*addr)
s_addr.sin_addr.s_addr=inet_addr(addr);
else{
printf("Sendamessagemusthaveareceiver!
\n");
exit(0);
}
addr_len=sizeof(s_addr);
len=-1;
for(i=0;i<4;i++){
if(len<0)len=sendto(sock,sendchar,strlen(sendchar),0,(structsockaddr*)&s_addr,addr_len);
else{printf("sendsuccess!
");return0;}
}
printf("senderror!
");
return0;
4.6.摄像头控制子程序
摄像头控制程序cam2jpg由TQ2440开发板中的例程提供。
4.7.主程序流程图