驱动程序设计说明
驱动程序利用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 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 寻黑线并直走 判断是否有断点 小车停并寻白线 因篇幅问题不能全部显示,请点此查看更多更全内容