当前位置:文档之家› 北邮电子工艺实习智能小车实习报告附程序

北邮电子工艺实习智能小车实习报告附程序

北京邮电大学实习报告附页:学生实习总结一、初步设计走迷宫小车利用单片机STC900C52RC 作为中控核心,光电开关E18-D80NK 作为走迷宫小车的探测障碍的传感器,以及其它L298N电机驱动芯片、LM1117-5.0/LDO电源。

小车走迷宫使用的是左手算法(即摸墙算法),迷宫是简单连通的,即迷宫的墙总是相互相连的或与迷宫的外轮廓相连,那么迷宫的搜索者从起点开始将左手扶在墙面前行,总能保证不会迷失并且找到迷宫中存在的出口(若忽略出口将回到迷宫起点)。

这种策略在刚进入迷宫时即执行的效果是最佳的。

小车采用一个L298N电机驱动模块、LM1117-5.0/LDO电源、两个E18-D80NK光电开关(一个放置在小车正前方,一个放置在小车正左方),分别判断小车的前方和左方是否有障碍,并将高低电平传递至传递给单片机,使单片机控制电机实现左转、右转、前进、掉头(实际为连续两次右转)的功能穿越迷宫。

小车是三轮小车,前两个是驱动轮,后一个是支点轮(从动轮),两个驱动轮是分别由两个电机驱动,通过同速率同向转动前进和同速率反向转动转向。

二、具体工作1) 元器件的焊接与组装2) 部分代码的编写与调试3) 小车外观的设计与制作三、小车焊接与电路测试1)在我们焊接小车之前,我们用了两天时间学习和熟悉焊接工艺,同时还做了个发光二极管的小实验,这些基础让我在焊接小车电路板的时候有了底气,做起来也有些轻车熟路。

我们用了半天的时间就几乎完成了全部的焊接任务,按照小车的装配步骤,我们依次焊接了电阻、晶体、排阻、二极管、开关、三极管、二极管、电容、数码管、电源电机端子、排针、驱动芯片等,同时也学会了“先焊矮的后焊高”的道理。

在完成焊接之后,小车的组装也颇为顺利,在实验步骤的指导下,顺利完成了小车的组装,小车已初现其形。

2)在小车焊接与组装之后,开始进行小车电路测试,植入CHECK程序之后,小车完美的实现了前进与后退的功能,而且前行的轨迹相对笔直,这和我们的焊接与组装有很大关系。

但是,在实现前进功能的同时也出现了问题,数码管有一个数字不显示,在查看电路图,和老师同学讨论之后,我们确定了问题的源头,是有一个三极管在焊接过程中烧坏了,在更换了三极管之后,数码管全都亮了。

同时我也帮其他电机不转的同学发现和解决了问题,大都是电元件被烧坏了。

这也提醒我们在焊接的时候,要小心谨慎。

四、小车硬件调试1)光电开关E18-D80NK的最远感应距离是80cm,因为迷宫的宽度不过20cm,所以在编程调试之前,应将两个光电开关的感应距离从80cm调整到10cm(最小)-20cm,才能编程使用。

但是在将正前方的光电开关调整到最小感应距离时,仍然不能符合硬件调试的标准,所以在编程时,应先使其前进一小段距离,达到转弯的标准之后,再进行转弯。

2)车轮的两轴应该先标定在同一条直线上,并且平行。

首先让小车直线前进,观察小车是否能直线行进,如果不能就需要进行编程的相应调整。

五、小车动力控制1)L298的逻辑功能(1是高电平,0是低电平)端口IN1IN2IN3IN4状态11001前进21010左转30101右转40000停止i.前进代码qianjin()qianjin(){ IN1=1;IN2=0;IN3=0;IN4=1;}ii.左转代码leftro()leftro(){ LED2=1;//左侧灯亮LED1=0;//右侧灯灭IN1=1;IN2=0;IN3=1;IN4=0;}iii.右转代码rightro()rightro(){ LED1=1;//右侧灯亮LED2=0;//左侧灯灭IN1=0;IN2=1;IN3=0;IN4=1;}2)单片机逻辑功能i.左侧有障碍物(低电平);前方没有障碍物(高电平)单片机指令:前进ii.左侧有障碍物(低电平);前方有障碍物(低电平)单片机指令:a.前进15步(设1步是10ms,此后都如此)b.停止10步c.右转30步d.停止10步e.判断此时障碍物情况,如果前方没有障碍物(高电平)停止10步再前进25步f. 否则【即前方有障碍物(低电平)】,右转30步.iii.左侧没有障碍物(高电平)单片机指令:a.前进25步b.停止10步c.左转38步d.停止10步e.前进15步.六、小车外观设计与制作1)组装并调程序十天以后,终于可以给小车做外壳了。

在有限经费的条件下,我们的小车外壳实现了完全零成本。

我们设计小车为一个超跑,所以小车以纸箱板为骨架,每一个部分都是相互独立得,在完成基本骨架的设计与制作之后,我又给小车涂了一层水彩,使得小车更加炫酷。

2)我们的小车除了基本的外壳以外,我还设计了超跑的挡风玻璃,大灯,车座,以及后车厢。

整个外观设计加制作用了两晚一天,凝聚了自己的汗水和爱。

七、常见问题、故障及解决方案1) 在焊接阶段,高温可能会损坏一些电元件,尤其是二极管。

三极管。

我们的数码管有一个不亮,就是有一个相应的二极管烧坏了。

因此焊接时间不宜过长,焊接时要小心谨慎。

将小车主板的元器件焊接完成之后,尽量不要再用手触碰背面焊点。

汗水会使焊点之间短路,影响小车的正常调试。

2) 因为传感器的感应距离和小车的制动原因,小车前进中转向会改变转角的角度,不适合控制。

所以在转弯前首先给小车一个短暂的停止时间,之后再进行转向,转向将会比较稳定,更易于控制。

3) 因为后期外壳的制作以及每一次电量的消耗,都会是使行车轨迹发生变化,所以必须得调整程序才能使小车较好地实现功能。

应避免无休止的调试代码,可以调试几个适用于不同硬件环境的代码,在不同的硬件环境下使用。

4) 在最后的验收时,小车前几次没能完全走出迷宫,这是因为刚刚改变了小车外壳的质量,加上完全封装后,没能给充电电池充电,所以转弯角度发生了很大变化,在修正了相应程序后,小车顺利的走出了迷宫。

八、心得与收获作为一名信通院的工科生,这次实习让我学会了电子院、计算机院、数媒院同学的一些技能。

从焊接电路,到编程调试,到实现走迷宫,到外观制作,和队友一起,一步一步完成这个项目,这段历程值得自己骄傲与开心,这两个礼拜所学到得也值得自己回味。

历时两周,从学习最基本的焊接工艺到设计算法,再到编程解决问题,再到调试时讨论存在的问题和解决方案,最后设计小车外观封装,这满满的回忆一一在眼前回顾。

我在整个的制作过程中,除了学习到焊接工艺、keil编程语言,手工工艺,更多的是学会了如何分析问题,如何解决问题。

在接触到这个项目,如何去设计,如何去做到我们想要的功能,这其中的思考值得我们去品味。

两个礼拜的实习就这样过去了,看着凝聚着自己汗水与爱的小车,内心好多感触。

感谢这次小学期让自己在学习和生活上学到的东西,感谢老师给我们这次的实习项目,感谢队友一起的努力与向上。

最后,感谢自己,希望自己所学到的东西用到以后的学习与生活中去。

九、参考文献*摸墙算法,百度百科:/link?url=HtZEStRcrFdzknUH7DH_piyEztpJJoYjDS4a9XcEd xWVSyfHZ7Q0apgqma_cYxXzyRBvXamMnDZt5xR-89L YFq附小车代码:#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define t 1uchar code seg_data[ ] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0,0xff};//0~9的段码表,0x00为熄灭符uchar data disp_buf[7] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示缓冲区sbit IN1 = P1^3;sbit IN2 = P1^5;sbit IN3 = P1^2;sbit IN4 = P1^0;sbit LED1 = P2^6;sbit LED2 = P2^7;sbit LEFT = P3^6;sbit RIGHT = P3^4;sbit FRONT = P3^2;sbit S1 = P1^6;unsigned int count=0;void Delay_ms(uint xms) //延时程序,xms是形式参数{uint i, j;for(i=xms;i>0;i--) // i=xms,即延时xms, xms由实际参数传入一个值for(j=115;j>0;j--); //此处分号不可少}display(){P0=seg_data[0]; //显示毫秒十位P2=0xfe; //开个位显示(开第1只数码管)Delay_ms(t); //延时10msP0=seg_data[1]; //显示毫秒百位P2=0xfd; //开十位显示(开第2只数码管)Delay_ms(t); //延时10msP0=seg_data[2]; //显示秒个位P2=0xfb; //开百位显示(开第3只数码管)Delay_ms(t); //延时10msP0=seg_data[3]; //显示秒十位P2=0xf7; //开个位显示(开第4只数码管)Delay_ms(t); //延时10msP0=seg_data[4]; //显示分个位P2=0xef; //开十位显示(开第5只数码管)Delay_ms(t); //延时10msP0=seg_data[5]; //显示分十位P2=0xdf; //开个位显示(开第6只数码管)Delay_ms(t); //延时10msP2=0xff;}stop(){IN1=0;IN2=0;IN3=0;IN4=0;}qianjin(){IN1=1;IN2=0;IN3=0;IN4=1;}houtui(){IN1=0;IN2=1;IN3=1;IN4=0;}leftro(){LED2=1;LED1=0;IN1=1;IN2=0;IN3=1;IN4=0;}rightro(){LED1=1;LED2=0;IN1=0;IN2=1;IN3=0;IN4=1;}//****************主程序******************//void main(){ P0=0xff;P2=0xff;P1=0xff;P3=0xff;TMOD=0x01; //定时器T0方式1TH0=0xfe; TL0=0x0c; //1ms定时初值EA=1; ET0=1; TR0=1; //开总中断,开定时器T0中断,启动定时器T0 while(1){display();while((LEFT==0)&&(FRONT==1)){display();qianjin();}}count=0;while ((LEFT==0)&&(FRONT==0)) {while(count<15){display();qianjin();count++;}while(count<25){display();stop();count++;}while(count<55){display();rightro();count++;}count=0;// 判断第二次是否需要右转if((LEFT==0)&&(FRONT==0)){while(count<30){display();rightro();count++;}}else{while(count<10){display();stop();count++;}while(count<35){display();qianjin();count++;}}}count=0;while ((LEFT==1)) {while(count<25){display();qianjin();count++;}while(count<35){display();stop();count++;}while(count<73){display();leftro();count++;}while(count<88){display();qianjin();count++;}}}}。

相关主题