实验报告(理工类)课程名称: 机器人创新实验课程代码: 学院(直属系): 机械工程与自动化学院年级/专业/班:学生姓名: 实验总成绩: 任课教师: 李炜开课学院: 机械工程与自动化学院实验中心名称: 机械工程基础实验中心一、设计题目:制作巡线小车二、成员分工:(5分)三、设计方案:(整个系统工作原理和设计)(20分)寻线小车的工作原理:寻线小车分为4个模块:电源模块,控制模块,电机驱动模块,寻线模块。
其中寻线模块把外界采集到的线路信息分别转换为数字信号和模拟信号,然后把信号传给控制模块,控制模块对采集的信号进行分析计算,然后做出响应,并发送给电机驱动模块,电机驱动模块把传来的信号进行放大处理然后驱动电机转动。
电源模块为其它三个模块提供电能。
寻线小车的工作方案如下:寻线小车的电路原理图如下:其中的寻线模板没有包括在内,寻线模块主要由三个红外线传感器和AD转换器组成,其数字输出端接在ATMEGA328P的3,4,5引脚,对应输入端口1,2,3。
模拟量输出接在24,25,26引脚,对就芯片的A1,A2,A3模拟量输入端口。
系统的各个模块分别如下控制模块:ATMega328P的内部结构图寻线模块:寻线模块由三个红外线传感器和AD转换器组成。
通过调节寻线模块上的旋钮,改变其相应的值,来分别是白线还是黑线。
黑线输出的数字量为0,白线输出为1。
而其模拟量是就接收光的多少,范围是0~1023。
电机驱动模块:电机驱动芯片与电机的接线如下:寻线小车寻线原理(简述):寻线小车有三个传感器,分别为左、中、右三个。
通过寻线模块所传送回来的数据量,确定转向。
其真值表如下:四、实验步骤:(图文说明设计过程中关键步骤)(30分)巡线小车各个组件Arduino UNO R3 控制器 1 块;亚克力控制板 1 块;电机2个;普通轮子2个;万向轮1个;杜邦线1排;电机驱动板1块;寻线传感器3个;电池盒1个;螺钉螺母若干;1将各个组件合理布局在亚力克板上,并标识出钻孔位置;2钻孔,然后安装电机万向轮普通车轮铜柱;3安装三个传感器4安装Arduino UNO R3 控制器和电机驱动版5用杜邦线将各个模块连接6 编写程序,并调试,直到小车能按照指定路线完整跑完。
五、最终作品展示:(图片及性能描述)(20分)小车能够准确的沿着规定路线完整的跑完,即使跑道是曲线,直线,甚至是直角,八字形,小车都能平稳的巡线,美中不足的是小车速度不够快,原因是多方面的,还有待改善提高。
六、设计心得:(10分)七、对本课程建议或意见:(选作题)课程学时太短了一点,如果多增加一些课程,就可以在老师的介绍下了解更多的前沿机器人方面的知识,拓宽我们的视野。
附录:(设计文件、工程图、代码等)(15分)int right=3;//int center=2;//int left=1;//int aright=A3;int acenter=A2;int aleft=A1;int vright=0;//int vcenter=0;//int vleft=0;//int al[3]={0,0,0};int mr1=5;//right motor,if this value if Hight,the motor will backint mr2=6;//right motor,if this value if Hight,the motor will away;int ml1=9;//left motor,if this value if Hight,the motor will backint ml2=10;//left motor,if this value if Hight,the motor will away; int dct=0;//The direction of carint spd[2]={0,0};//spd[0] is left mr,spd[1] is right.int count=0;//int vdl;int vdr;void setup() {// put your setup code here, to run once:pinMode(right,INPUT);pinMode(left,INPUT);pinMode(center,INPUT);pinMode(mr1,OUTPUT);pinMode(mr2,OUTPUT);pinMode(ml1,OUTPUT);pinMode(ml2,OUTPUT);pinMode(aright,INPUT);pinMode(acenter,INPUT);pinMode(aleft,INPUT);}void loop() {// put your main code here, to run repeatedly:vleft=digitalRead(left);vcenter=digitalRead(center);vright=digitalRead(right);readAL();vdl=al[1]-al[0];vdr=al[1]-al[2];if(vleft==LOW&&vcenter==LOW&&vright==LOW)//dct=0{HowToTurn();}else if(vleft==LOW&&vcenter==HIGH&&vright==HIGH)//turnLefts dct=3 {turnLefts();}else if(vleft==LOW&&vcenter==LOW&&vright==HIGH){//dct==1trunLeftf();}else if(vright==LOW&&vcenter==LOW&&vleft==HIGH)//dct=4{turnRightf();}else if(vright==LOW&&vcenter==HIGH&&vleft==HIGH)//dct=6{turnRights();}else if(vcenter==LOW&&vright==HIGH&&vleft==HIGH)//dct=5{run();}else if(vcenter==HIGH&&vleft==HIGH&&vright==HIGH)//dct=7{/*for(count=0;count<5;count++){if(vcenter==HIGH&&vleft==HIGH&&vright==HIGH){}else{delay(20);break;}}if(count==5){rollBack();}*/}else//dec=2{readAL();spd[0]=-(al[0]-al[1])/4; spd[1]=-(al[2]-al[1])/4; if(spd[0]>spd[1]){spd[1]=0;spd[0]=spd[0]*2;}else{spd[0]=0;spd[1]=spd[1]*2;}motorControl();delay(20);}}void readAL(){al[0]=analogRead(aleft);al[1]=analogRead(acenter);al[2]=analogRead(aright);}void motorControl()//control the motor {if(abs(spd[0])<256&&abs(spd[1])<256) {if(spd[0]>=0&&spd[1]>=0){digitalWrite(mr1,LOW);analogWrite(mr2,spd[1]);digitalWrite(ml1,LOW);analogWrite(ml2,spd[0]);return;}else if(spd[0]>=0&&spd[1]<0){digitalWrite(mr2,LOW);analogWrite(mr1,abs(spd[1])); digitalWrite(ml1,LOW);analogWrite(ml2,spd[0]);}else if(spd[0]<0&&spd[1]>=0){digitalWrite(mr1,LOW);analogWrite(mr2,spd[1]);digitalWrite(ml2,LOW);analogWrite(ml1,abs(spd[0]));}else if(spd[0]<0&&spd[1]<0){digitalWrite(mr2,LOW);analogWrite(mr1,abs(spd[1]));digitalWrite(ml2,LOW);analogWrite(ml1,abs(spd[0]));}}}/*void spdControl(int leftMax,int leftMin,int rightMax,int rightMin) //the speed of motor contorl{spd[0]+=a[0];spd[1]+=a[1];if(spd[0]>leftMax) {spd[0]=leftMax;}else if(spd[0]<leftMin){spd[0]=leftMin;}if(spd[1]>rightMax){spd[1]=rightMax;}else if(spd[1]<rightMin){spd[1]=rightMin;}}*/void stopM(){digitalWrite(mr2,LOW);analogWrite(mr1,LOW);digitalWrite(ml2,LOW);analogWrite(ml1,LOW);}void trunLeftf()//dct==1,turn left is not urgent{while(true){readAL();spd[0]=(al[1]-al[0])/4;spd[1]=(al[1]-al[2])/4;spd[1]=spd[1]+150;if(spd[1]>255) spd[1]=255;//spdControl();motorControl();delay(20);vleft=digitalRead(left);vcenter=digitalRead(center);vright=digitalRead(right);if(vleft==LOW&&vcenter==LOW&&vright==HIGH){ }else{break;}}dct=1;}void turnLefts(){while(true){readAL();spd[0]=(al[1]-al[0])/4;spd[1]=255;spd[0]=spd[0]/1.2; //spdControl();motorControl();delay(20);vleft=digitalRead(left);vcenter=digitalRead(center);vright=digitalRead(right);if(vleft==LOW&&vcenter==HIGH&&vright==HIGH){ }else{break;}}dct=3;}void turnRightf(){while(true){readAL();spd[0]=(al[1]-al[0])/4;spd[1]=(al[1]-al[2])/4;spd[0]=spd[0]+150;if(spd[0]>255) spd[0]=255;//spdControl();motorControl();delay(20);vleft=digitalRead(left);vcenter=digitalRead(center);vright=digitalRead(right);if(vleft==HIGH&&vcenter==LOW&&vright==LOW){ }else{break;}}dct=4;}void turnRights(){while(true){readAL();spd[1]=(al[1]-al[2])/4;spd[0]=255;spd[1]=spd[1]/1.2;//spdControl();motorControl();delay(20);vleft=digitalRead(left);vcenter=digitalRead(center);vright=digitalRead(right);if(vleft==HIGH&&vcenter==HIGH&&vright==LOW){ }else{break;}}dct=6;}void HowToTurn(){while(true){readAL();spd[1]=(al[1]-al[2])/4;spd[0]=(al[1]-al[0])/4;spd[0]=spd[0]+180;spd[1]=spd[1]+180;if(spd[0]>255) spd[0]=255;if(spd[1]>255) spd[1]=255;//spdControl();motorControl();delay(20);vleft=digitalRead(left);vcenter=digitalRead(center);vright=digitalRead(right);if(vleft==LOW&&vcenter==LOW&&vright==LOW){ }else{break;}}dct=0;}void rollBack(){while(true){readAL();spd[0]=-180;spd[1]=-180;//spdControl();motorControl();delay(15);vleft=digitalRead(left);vcenter=digitalRead(center);vright=digitalRead(right);if(vleft==HIGH&&vcenter==HIGH&&vright==HIGH){ }else{break;}}dct=7;}void run(){while(true){readAL();spd[1]=(al[1]-al[2])/4;spd[0]=(al[1]-al[0])/4;int spdd=(spd[0]-spd[1])/2;spd[0]=240;spd[1]=240;if(spdd>0){spd[0]+=spdd;spd[1]-=spdd;}else{spd[0]-=spdd;spd[1]+=spdd;}if(spd[0]>255) spd[0]=255;if(spd[1]>255) spd[1]=255;//spdControl();motorControl();delay(20);vleft=digitalRead(left);vcenter=digitalRead(center);vright=digitalRead(right);if(vleft==HIGH&&vcenter==LOW&&vright==HIGH){ }else{break;}}dct=5;}。