您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > Arduino智能避障小车避障程序
首先建立一个名为modulecar.ino的主程序。//modulecar.ino,玩转智能小车主程序#includeServo.h//导入舵机库#includeNewPing.h//导入NwePing库//对照系统配线方案依次指定各I/OconstintENA=3;//左电机PWMconstintIN1=4;//左电机正constintIN2=5;//左电机负constintENB=6;//右电机PWMconstintIN3=7;//右电机正constintIN4=8;//右电机负constinttrigger=9;//定义超声波传感器发射脚为D9constintecho=10;//定义传感器接收脚为D10constintmax_read=300;//设定传感器最大探测距离。intno_good=35;//*设定35cm警戒距离。intread_ahead;//实际距离读数。ServosensorStation;//设定传感器平台。NewPingsensor(trigger,echo,max_read);//设定传感器引脚和最大读数//系统初始化voidsetup(){Serial.begin(9600);//启用串行监视器可以给调试带来极大便利sensorStation.attach(11);//把D11分配给舵机pinMode(ENA,OUTPUT);//依次设定各I/O属性pinMode(IN1,OUTPUT);pinMode(IN2,OUTPUT);pinMode(ENB,OUTPUT);pinMode(IN3,OUTPUT);pinMode(IN4,OUTPUT);pinMode(trigger,OUTPUT);pinMode(echo,INPUT);sensorStation.write(90);//舵机复位至90°delay(6000);//上电等待6s后进入主循环}//主程序voidloop(){read_ahead=readDistance();//调用readDistance()函数读出前方距离Serial.println(AHEAD:);Serial.println(read_ahead);//串行监视器显示机器人前方距离if(read_aheadno_good)//如果前方距离小于警戒值{fastStop();//就令机器人紧急刹车waTch();//然后左右查看,分析得出最佳路线goForward();//*此处调用看似多余,但可以确保机器人高速运转下动作的连贯性}elsegoForward();//否则就一直向前行驶}主程序用到了两个库,Servo库是IDE自带的,NwePing库是第三方库,需要下载安装。接下来建立一个名为move.ino的标签。//move.ino,机动模块。//刹车voidfastStop(){Serial.println(STOP);//串行监视器显示机器人状态为STOP(停止)//左电机急停(注:L298N和L293D均带有刹车功能,在使能成立的条件下,同时向两相写入高电平可令电机急停,详见芯片手册)digitalWrite(ENA,HIGH);digitalWrite(IN1,HIGH);digitalWrite(IN2,HIGH);//右电机急停digitalWrite(ENB,HIGH);digitalWrite(IN3,HIGH);digitalWrite(IN4,HIGH);}//前进voidgoForward(){Serial.println(FORWARD);//串行监视器显示机器人状态为FORWARD(前进)//左电机逆时针旋转analogWrite(ENA,106);//左电机PWM,可微调这个数值使小车左右两侧车轮转速相等,右电机同理digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);//右电机顺时针旋转analogWrite(ENB,118);digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);}//原地左转voidturnLeft(){Serial.println(LEFT);//串行监视器显示机器人状态为LEFT(向左转)//左电机正转analogWrite(ENA,106);digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);//右电机正转analogWrite(ENB,59);//*微调这个数值,使转弯时内侧车轮起主导作用。相当于让小车向后打一把轮再拐弯。右转同理digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);delay(205);//*延迟,数值以毫秒为单位,调节此值可使机器人动作连贯}//原地右转voidturnRight(){Serial.println(RIGHT);//串行监视器显示机器人状态为RIGHT(向右转)//左电机反转analogWrite(ENA,53);digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);//右电机反转analogWrite(ENB,118);digitalWrite(IN3,LOW);digitalWrite(IN4,HIGH);delay(205);//*调节此值可使机器人动作连贯}//原地掉头(暂时用不到)voidturnAround(){Serial.println(TURN180);//串行监视器显示机器人状态为TURN180(原地顺时针旋转180°)//左电机反转analogWrite(ENA,106);digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);//右电机反转analogWrite(ENB,118);digitalWrite(IN3,LOW);digitalWrite(IN4,HIGH);delay(500);//*}//ping.ino,测距模块intreadDistance(){delay(30);//声波发送间隔30ms,大约每秒探测33次。受系统所限,此值不可小于29msintcm=sensor.ping()/US_ROUNDTRIP_CM;//把Ping值(μs)转换为cmreturn(cm);//readDistance()返回的数值是cm}最后是驱动云台扫描并分析左右两侧距离的watch.ino模块。//watch.ino,查看模块voidwaTch(){//测量右前方距离。//*注意舵机旋转方向,SG5010为逆时针旋转sensorStation.write(20);//*舵机右转至20°。调节此值会影响传感器扫描区域,夹角越小,机器人转弯越谨慎delay(1200);//延迟1.2s待舵机稳定intread_right=readDistance();//调用readDistance()函数读出右前方距离Serial.print(RIGHT:);Serial.println(read_right);//sensorStation.write(90);//*舵机复位至90度。廉价舵机大角度旋转会产生抖动,要加上这两行以求读数准确。//delay(500);//延迟0.5s//测量左前方距离sensorStation.write(160);//舵机左转至160°delay(1200);//延迟1.2s待舵机稳定。intread_left=readDistance();//调用函数读出距离左前方距离。Serial.print(LEFT:);Serial.println(read_left);sensorStation.write(90);//这一行确保只要小车处于行驶状态,传感器就面向正前方delay(500);//延迟0.5s。//分析得出最佳行进路线。if(read_rightread_left)//如果右前方距离比较大{turnRight();//就向右转,}elseturnLeft();//否则就向左转//此处也可以加入另一层逻辑:如果左右两侧读数相等就调用turnAround()原地掉头。但实际上触发的几率不大。}//I2C液晶测试程序,Arduino版本1.5.6-r2,LiquidCrystal_I2C库版本2.0#includeWire.h#includeLiquidCrystal_I2C.h//导入I2C液晶库LiquidCrystal_I2Clcd(0x27,16,2);//设定I2C地址及液晶屏参数voidsetup(){lcd.init();//始化液晶屏lcd.backlight();lcd.print(Hello,world!);//开始打印信息lcd.setCursor(3,1);//设定显示位置,第3列,第1行lcd.print(ZANG.HAIBO);}voidloop(){}//前进voidgoForward(){Serial.println(FORWARD);//串行监视器显示机器人状态为FORWARD(前进)//左电机逆时针旋转intval1=analogRead(A0);//手动调整左电机转速。电位器两端分别接至+5V和GND,中心抽头接至A0intleftSpeed=map(val1,0,1023,0,255);//把读数映射为PWManalogWrite(ENA,leftSpeed);//写入速度。下面的右电机同理digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);//右电机顺时针旋转intval2=analogRead(A1);intrightSpeed=map(val2,0,1023,0,255);analogWrite(ENB,rightSpeed);digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);}//ping.ino,红外测距模块//trigger脚沿用D9,echo脚换成A3intreadDistance(){digitalWrite(trigger,HIGH);//点亮红外发射管delayMicroseconds(200);//给接收管留出200μs响应时间IRvalue=analogRead(echo);//读取自然光和红外线下反射值的总和digitalWrite(trigger,LOW);//关闭红外发射管以读取自然光下的反射值delayMicroseconds(200);//留出200μs响应时间IRvalue=IRvalue-analogRead(echo);//刨除自然光得出实际值(红外发射管产生的部分)returnmap(IRvalue,120,930,30,0);//用map()函数把读数转换为距离}代码1:HC-SR04超声波传感器典型代码digitalWrite(TrigPin,LOW);delayMicroseconds(2);digitalWrite(TrigPin,HIGH);//发送10μs的高电平触发信号delayMicroseconds(10);digitalWrite(TrigPin,LOW);distance=pulseIn(EchoPin,HIGH)*340/60/2;//检测脉冲宽度即为超声波往返时间代码2:简易超声波测距代码constintTrigPin=2;constintEchoPin=3;//设定SR04连接的Arduino引脚floatdistance;voidsetup(){//初始化串口通信及连接SR04的引脚Serial.begin(9600);pinMode(TrigPin,OUTPUT);//要检测引脚上输入的脉冲宽度,需要先设置为输入状态pinMode(EchoPin,INPUT);Serial.println(Ultrasonicsensor:);}voidloop(){//产生一个10μs的高脉冲去触发Trig
本文标题:Arduino智能避障小车避障程序
链接地址:https://www.777doc.com/doc-2898513 .html