您的当前位置:首页智能小车程序说明

智能小车程序说明

2020-04-08 来源:爱问旅游网


驱动程序设计说明

驱动程序利用TQ2440开发板提供的例程进行改写,并编译进内核。 1.1. 电机控制子程序

通过将nLED_1引脚、nLED_2连成回路,nLED_3、nLED_4引脚连成回路,控制电平的 高低,从而控制电流的流向,达到控制电机正反转的目的,其主要函数如下:

int back(int t,int fd)//后退

{

ioctl(fd,1,0); ioctl(fd,0,1); ioctl(fd,1,2); ioctl(fd,0,3); return(0); }

小车的左前电机后转,右前电机也向后转,小车前后电机联动,所以小车整体后退。

int forward(int fd)//前进

{

ioctl(fd,0,0); ioctl(fd,1,1); ioctl(fd,0,2); ioctl(fd,1,3); return(0); }

小车的左后电机正传,右后电机正转,小车前后电机联动,所以小车整体前进。

int r(int fd)//右转 { // // }

ioctl(fd,0,0); ioctl(fd,1,1); ioctl(fd,0,2); ioctl(fd,0,3); return(0);

小车的左侧电机正转,右侧电机的不转,所以小车整体右转。 int fr(int fd)// {

ioctl(fd,1,0); ioctl(fd,0,1); return(0); }

小车左侧电机反转,右侧电机不转,小车整体向右后方向转。 int l(int fd) {

// ioctl(fd,0,0);

// ioctl(fd,0,1); ioctl(fd,0,2); ioctl(fd,1,3); return(0); }

小车左电机不转,右后电机正转,小车整体左转。 int fl(int fd) {

ioctl(fd,1,2);

ioctl(fd,0,3); return(0); }

小车左侧电机不转,右侧前电机转,小车整体向左后方向转。 int stop(int fd) {

ioctl(fd,0,0); ioctl(fd,0,1); ioctl(fd,0,2); ioctl(fd,0,3);

return(0); }

左右电机全停止工作,小车停止工作。 1.2. 循迹控制子程序

通过读取设备得到代表不同路况的返回值(从LM339),从而做出相应的动作,基本代码如下:

for(;;){

cmd=read(deteFd,NULL,NULL); if(cmd!=old_cmd) { switch(cmd) { case 3 : onR=5;onL=5; break; case 2 : onR=-2;onL=10; break; }

case 1: onR=10;onL=-2; break; case 0: onR=0;onL=0; break; }

old_cmd=cmd;

if(cmd==0){ break;} time=(time+1)%10; if(time主要通过寻迹板上的光电器件控制,利用处于白布和黑布间的输出电压不一样来,GPIO口读入黑白线判断,从PWM口输出驱动信号来控制电机。具体如下

a. 当小车接收到开始信号时,小车前进,并寻线。

b. 小车上线后寻线并判断是否遇到断点,遇到断点,电机停止并对参考物拍照

传送。

c. 电机停止时,变量会对断点的个数进行累计。并判断是否<4,断点小于4时,

继续循环寻线累计断点。

d. 当变量>4时,则小车跳出循环,到达终点,电机停止。

1.3. 无线通讯子程序

此部分内容为socket编程,部分代码如下:

int sendstring(char *addr,int port,char *sendchar) {

struct sockaddr_in s_addr; int sock; int addr_len; int len,i;

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {

perror(\"no socket\"); exit(errno); } else

printf(\"create socket.\\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(\"Send a message must have a receiver!\\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,(struct sockaddr *) &s_addr, addr_len);

else {printf(\"send success!\");return 0;} }

printf(\"send error!\"); return 0;

当接收到无线信号时,小车开始运行程序,若小车接收不到信号则小车不工作,一共发射接收四次信号。

1.4. 主程序流程图

主程序 判白线是否结束 寻黑线并上线 小车右转避障 沿黑线直走 程序结束 是否遇到断点 小车停并拍照并传送,变量+1 判断变量是否〉=2 寻黑线并直走 判断是否有断点 小车停并寻白线

因篇幅问题不能全部显示,请点此查看更多更全内容