关键词不能为空

当前您在: 主页 > 英语 >

Arduino智能避障小车避障程序

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-09 08:35
tags:

-

2021年2月9日发(作者:micron)


首先建立一个名为



的主程序。

< br>


//


,玩转智能小车主程序



#include //


导入舵机库



#include //


导入


NwePing

< p>



//


对照系统配线方案依次指定各


I/O


const int ENA = 3 //


左电机


PWM





const int IN1 = 4 //


左电机正



const int IN2 = 5 //


左电机负



const int ENB = 6 //


右电机


PWM


const int IN3 = 7 //


右电机正



const int IN4 = 8 //


右电机负



const int trigger = 9 //


定义超声波传感器发射脚为


D9


const int echo = 10 //


定义传感器接收脚为


D10


const int max_read = 300; //


设定传感器最大探测距离。



int no_good = 35; //*


设定

< p>
35cm


警戒距离。



int read_ahead; //


实际距离读数。



Servo sensorStation; //


设定传感器平台。



NewPing sensor(trigger, echo, max_read); //


设定传感器引脚和最大读数



//


系统初始化



void setup()



















































{




(9600); //


启用串行监视器可以给调试带来极大便利





(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);





(90); //


舵机复位至


90


°





delay(6000); //


上电等待

6s


后进入主循环



}


//


主程序



void loop()



{




read_ahead = readDistance(); //


调用


readDist ance()


函数读出前方距离





n(




n(read_ahead); //


串行监视器显示机器人前方距离





if (read_ahead < no_good) //


如果前方距离小于警戒值





{





fastStop(); //


就令机器人紧急刹车






waTch(); //


然后左右查看,分析得出最佳路线






goForward(); //*


此处调用看似多余,但可以 确保机器人高速运转下动作的连贯性







}




else goForward(); //


否则就一直向前行驶



}



主程序用到了两个库,


Servo


库是


IDE


自带的,


NwePing


库是第三方库,


需要下载安装。





接下来建立一个名为



的标签。



//


,机动模块。



//


刹车



void fastStop()


{




n(


串行 监视器显示机器人状态为


STOP


(停止)





//


左电机急停(注:


L298N


和< /p>


L293D


均带有刹车功能,在使能成立的条件下,同时向两


相写入高电平可令电机急停,详见芯片手册)






digitalWrite(ENA, HIGH);





digitalWrite(IN1, HIGH);































digitalWrite(IN2, HIGH);





//


右电机急停






digitalWrite(ENB, HIGH);






digitalWrite(IN3, HIGH);































digitalWrite(IN4, HIGH);


}


//


前进



void goForward()


{




n(


串行 监视器显示机器人状态为


FORW


ARD


(前进)




//


左电机逆时针旋转




analogWrite(ENA,106); //


左电机


PWM


,可微调这个数值使小车左右两 侧车轮转速相等,右


电机同理






digitalWrite(IN1, LOW);



digitalWrite(IN2, HIGH);



//


右电机顺时针旋转




analogWrite(ENB,118);



digitalWrite(IN3, HIGH);



digitalWrite(IN4, LOW);


}


//


原地左转



void turnLeft()


{




n(


串行 监视器显示机器人状态为


LEFT


(向左转)

< br>



//


左电机正转




analogWrite(ENA,106);



digitalWrite(IN1, HIGH);



digitalWrite(IN2, LOW);



//


右电机正转




analogWrite(ENB,59); //*


微调这个数值,


使转弯时内侧车轮起主导作用。


相当于让小车向后


打一把轮再拐弯。右转同理




digitalWrite(IN3, HIGH);



digitalWrite(IN4, LOW);



delay (205); //*


延迟,数值以毫秒为单位,调节此值可使机器人动作连贯



}



//


原地右转



void turnRight()


{




n(


串行 监视器显示机器人状态为


RIGHT


(向右转)




//


左电机反转




analogWrite(ENA,53);



digitalWrite(IN1, LOW);



digitalWrite(IN2, HIGH);



//


右电机反转




analogWrite(ENB,118);



digitalWrite(IN3, LOW);



digitalWrite(IN4, HIGH);



delay (205); //*


调节此值可使机器人动作连贯



}


//


原地掉头(暂时用不到)



void turnAround()


{




n(


18 0


//


串行监视器显示机器人状态为


T URN


180


(原地顺时针旋转


18 0


°)




//


左电机反转




analogWrite(ENA,106);



digitalWrite(IN1, LOW);



digitalWrite(IN2, HIGH);



//


右电机反转




analogWrite(ENB,118);



digitalWrite(IN3, LOW);



digitalWrite(IN4, HIGH);



delay (500); //*


}





//


,测距模块



int readDistance()


{




delay(30); //


声波发送间隔


30ms


,大约每秒探测


33


次。受系统所限,此值不可小于


29m s




int cm = () / US_ROUNDTRIP_CM; //



Ping


值(


μ


s


)转换为


cm




return(cm); //readDistance()


返回的数值是


cm


}




最后 是驱动云台扫描并分析左右两侧距离的



模块。

< br>


//


,查看模块



void waTch()


{




//


测量右前方距离。





//*


注 意舵机旋转方向,


SG5010


为逆时针旋转

< br>




(20); //*


舵机右转至


20


°。调节此值会影响传感器 扫描区域,夹角越小,


机器人转弯越谨慎





delay(1200); //


延迟


1.2s


待舵机稳定





int read_right = readDistance(); //


调用


readDistance()


函数读出右前方距离





(




n(read_right);




//(90); //*


舵机复位至


90


度。


廉价舵机大角度旋转会产生抖 动,


要加上这


两行以求读数准确。





//delay (500); //


延迟


0.5s




//


测量左前方距离





(160); //


舵机左转至


160


°





delay(1200); //


延迟


1.2s


待舵机稳定。

< p>




int read_left = readDistance(); //


调用函数读出距离左前方距离。





(




n(read_left);




(90); //


这一行确保只要小车处于行驶状态,传感器就面向正前方





delay (500); //


延迟


0.5s






//


分析得出最佳行进路线。




if (read_right > read_left) //


如果右前方距离比较大




{



turnRight(); //


就向右转


,



}



else turnLeft(); //


否则就向左转




//


此处也可以加入另一层逻辑


:


如果左右两侧读数相等就调用


turnA round()


原地掉头。但


实际上触发的几率不大。



}




// I


2


C


液晶测试程序,


Arduino


版本


1 .5.6-r2



LiquidCrystal_I2C


库版本


2.0


#include











#include


导入


I


2


C


液晶库



LiquidCrystal_I2C lcd(0x27,16,2); //


设定


I


2


C


地址及液晶屏参数



void setup()


{




(); //


始化液晶屏





ght();




(


开始打印信息





sor(3,1); //


设定显示位置,第


3


列,第

< br>1






(


}


void loop()


{


}





//


前进



void goForward()


{




n(


串行 监视器显示机器人状态为


FORW


ARD


(前进)




//


左电机逆时针旋转




int val1 = analogRead(A0); //


手动调整左电机转速。电位器两端分别接至


+5V



GND



中心抽头接 至


A0



int leftSpeed = map(val1,0,1023,0,255); //


把读数映射为


PWM



analogWrite(ENA,leftSpeed); //


写入速度。下面的右电机同理




digitalWrite(IN1, LOW);



digitalWrite(IN2, HIGH);



//


右电机顺时针旋转




int val2 = analogRead(A1);









int rightSpeed = map(val2,0,1023,0,255);



analogWrite(ENB,rightSpeed);



digitalWrite(IN3, HIGH);



digitalWrite(IN4, LOW);


}



//


,红外测距模块



// trigge r


脚沿用


D9



echo


脚换成


A3


int readDistance()


{




digitalWrite(trigger,HIGH); //


点亮红外发射管





delayMicroseconds(200); //< /p>


给接收管留出


200


μ

< br>s


响应时间





IRvalue=analogRead(echo); //


读取自然光和红外线下反射值的总和





digitalWrite(trigger,LOW); //


关闭红外发射管以读取自然光下的反射值





delayMicroseconds(200); //


留出


200


μ


s


响 应时间





IRvalue=IRvalue-analogRead(echo);

< p>
//


刨除自然光得出实际值(红外发射管产生的部


分)





return map(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


:简 易超声波测距代码



const int TrigPin = 2;



const int EchoPin = 3; / /


设定


SR04


连接的


Arduino


引脚



float distance;



void setup() {





//


初始化串口通信及连接


SR04


的引脚











(9600);











pinMode(TrigPin, OUTPUT);







//


要检测引脚上输入的脉冲宽度,需要先设置为输入状态











pinMode(EchoPin, INPUT);











n(


}



void loop() {







//< /p>


产生一个


10


μ


s


的高脉冲去触发


TrigPin











digitalWrite(TrigPin, LOW);











delayMicroseconds(2);











digitalWrite(TrigPin, HIGH);











delayMicroseconds(10);










digitalWrite(TrigPin, LOW);







//


检测脉冲宽度,并计算出距离











distance = pulseIn(EchoPin, HIGH) /58.00;










(distance);











(











n();











delay(1000);



}



代码


3


:具有温度补偿的超声波测距代码



#include


#include

< br>//


设定


SR04


连接的


Arduino


引脚



const int TrigPin = 2;



const int EchoPin = 3;



float distance;






float temperature_value;










#define ONE_WIRE_BUS 4


OneWire oneWire(ONE_WIRE_BUS);


DallasTemperature sensors(&oneWire);


void setup() {




//


初始化串口通信及连接


SR04< /p>


的引脚











(9600);











pinMode(TrigPin, OUTPUT);







//


要检测引脚上输入的脉冲宽度, 需要先设置为输入状态











pinMode(EchoPin, INPUT);











();


}


void loop() {










//


产生一个


10


μ


s


的高脉冲去触发


TrigPin










tTemperatures();


-


-


-


-


-


-


-


-



本文更新与2021-02-09 08:35,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/620067.html

Arduino智能避障小车避障程序的相关文章