智能小车 功能:能实现避障和寻线。 原理:利用传感器收取周围环境的反馈信息,判断 输出高低电位控制电机轮。 器件:Arduino 控制板×1 传感器拓展板×1 L298电机驱动板×1 小车车体套件×1 尼龙柱 传感器3p杜邦线若干 螺丝螺帽 控制流程: 小车的红外传感器检测到黑线位置后发送给控制器,控制器判断应该要如何行走,再通过电机驱动控制电机转速和方向来改变小车的行驶方向。 [/table]file:///C:/Users/Administrator.OULPZ11IR0KQ3TG/AppData/Local/Temp/msohtmlclip1/01/clip_image001.giffile:///C:/Users/Administrator.OULPZ11IR0KQ3TG/AppData/Local/Temp/msohtmlclip1/01/clip_image002.giffile:///C:/Users/Administrator.OULPZ11IR0KQ3TG/AppData/Local/Temp/msohtmlclip1/01/clip_image003.giffile:///C:/Users/Administrator.OULPZ11IR0KQ3TG/AppData/Local/Temp/msohtmlclip1/01/clip_image004.gif
控制流程: 小车的红外传感器检测到障碍物后发送给控制器,控制器判断应该要如何行走,再通过电机驱动控制电机转速和方向来改变小车的行驶方向。 避障:
[table]
程序: int sum[3]; int summ[3]; int ina=4; 电机正转或反转 int pwma=5; 电机转速 int inb=7; int pwmb=6; 定义motospd函数 void motospd(intsp1,int sp2) { if(sp1<0) digitalWrite(ina,HIGH); else digitalWrite(ina,LOW); if(sp2<0) digitalWrite(inb,HIGH); else digitalWrite(inb,LOW); analogWrite(pwma,abs(sp1)); analogWrite(pwmb,abs(sp2)); } void setup() { pinMode(11,INPUT); pinMode(12,INPUT); pinMode(13,INPUT); pinMode(A2,INPUT);//zuobian pinMode(A3,INPUT); pinMode(A4,INPUT); Serial.begin(9600); pinMode(ina,OUTPUT); pinMode(inb,OUTPUT); } void loop() { sum[0]=digitalRead(11); sum[1]=digitalRead(12); sum[2]=digitalRead(13); summ[0]=digitalRead(A4); summ[1]=digitalRead(A3); summ[2]=digitalRead(A2); for(inti;i<3;i++) {Serial.print(sum); Serial.print(summ);} 避障部分 if((sum[0]==1)&&(sum[1]==1)&&(sum[2]==1)) motospd(170,155); if((sum[0]==0)&&(sum[1]==1)&&(sum[2]==1)) {motospd(-150,135);delay(380);} if((sum[0]==1)&&(sum[1]==1)&&(sum[2]==0)) {motospd(150,-135);delay(380);} if((sum[0]==0)&&(sum[1]==0)&&(sum[2]==0)) { motospd(150,-135); delay(600);} if((sum[0]==1)&&(sum[1]==0)&&(sum[2]==1)) { motospd(150,0); delay(650);} if((sum[0]==0)&&(sum[1]==0)&&(sum[2]==1)) {motospd(0,150);delay(500);} if((sum[0]==1)&&(sum[1]==0)&&(sum[2]==0)) {motospd(150,0);delay(500);} if((sum[0]==0)&&(sum[1]==1)&&(sum[2]==0)) { motospd(170,155); } 寻线部分 if((summ[0]==0)&&(summ[1]==1)&&(summ[2]==1)) {motospd(120,0);delay(100);} elseif((summ[0]==0)&&(summ[1]==0)&&(summ[2]==0)) while(1) {motospd(0,0);} elseif((summ[0]==1)&&(summ[1]==1)&&(summ[2]==0)) {motospd(0,120);delay(100);} else motospd(170,155); } 总结:通过这次对小车的设计,对Arduino有了全新的认识,看似简单实则很难。 项目中遇到的问题:小车在转弯时头会卡住,可以改变红外传感器的感应距离,并调整两个电机的转速。
|