Arduino智能避障小车避障程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Arduino智能避障小车避障程序
首先建立一个名为modulecar.ino的主程序。 // modulecar.ino,玩转智能小车主程序
#include
#include
// 对照系统配线方案依次指定各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; //*设定35cm警戒距离。
int read_ahead; //实际距离读数。
Servo sensorStation; //设定传感器平台。
NewPing sensor(trigger, echo, max_read); //设定传感器引脚和最大读数//系统初始化
void setup()
{
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后进入主循环
}
//主程序
void loop()
{
read_ahead = readDistance(); //调用readDistance()函数读出前方距离Serial.println("AHEAD:");
Serial.println(read_ahead); //串行监视器显示机器人前方距离
if (read_ahead < no_good) //如果前方距离小于警戒值
{
fastStop(); //就令机器人紧急刹车
waTch(); //然后左右查看,分析得出最佳路线
goForward(); //*此处调用看似多余,但可以确保机器人高速运转下动作的连贯性
}
else goForward(); //否则就一直向前行驶
}
主程序用到了两个库,Servo库是IDE自带的,NwePing库是第三方库,需要
下载安装。
接下来建立一个名为move.ino的标签。
//move.ino,机动模块。
//刹车
void fastStop()
{
Serial.println("STOP"); //串行监视器显示机器人状态为STOP(停止)
//左电机急停(注:L298N和L293D均带有刹车功能,在使能成立的条件下,同
时向两相写入高电平可令电机急停,详见芯片手册)
digitalWrite(ENA, HIGH);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
//右电机急停
digitalWrite(ENB, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH); }
//前进
void goForward()
{
Serial.println("FORWARD"); //串行监视器显示机器人状态为FORWARD(前进) //左电机逆时针旋转
analogWrite(ENA,106); //左电机PWM,可微调这个数值使小车左右两侧车轮转速相等,右电机同理
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
//右电机顺时针旋转
analogWrite(ENB,118);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
//原地左转
void turnLeft()
{
Serial.println("LEFT"); //串行监视器显示机器人状态为LEFT(向左转) //左电机正转
analogWrite(ENA,106);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
//右电机正转
analogWrite(ENB,59); //*微调这个数值,使转弯时内侧车轮起主导作用。相当于让小车向后
打一把轮再拐弯。右转同理
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay (205); //*延迟,数值以毫秒为单位,调节此值可使机器人动作连贯