当前位置:
文档之家› Arduino智能避障小车避障程序
Arduino智能避障小车避障程序
Serial.println(read_left);
sensorStation.write(90);//这一行确保只要小车处于行驶状态,传感器就面向正前方
delay (500); //延迟0.5s。
//分析得出最佳行进路线。
if (read_right > read_left) //如果右前方距离比较大
}
//原地右转
void turnRight()
{
Serial.println("RIGHT");//串行监视器显示机器人状态为RIGHT(向右转)
//左电机反转
analogWrite(ENA,53);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
//右电机反转
//左电机反转
analogWrite(ENA,106);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
//右电机反转
analogWrite(ENB,118);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
const int IN1 = 4 ; //左电机正
const int IN2 = 5 ; //左电机负
const int ENB = 6 ; //右电机PWM
const int IN3 = 7 ; //右电机正
cБайду номын сангаасnst int IN4 = 8 ;//右电机负
const int trigger = 9 ; //定义超声波传感器发射脚为D9
//刹车
void fastStop()
{
Serial.println("STOP");//串行监视器显示机器人状态为STOP(停止)
//左电机急停(注:L298N和L293D均带有刹车功能,在使能成立的条件下,同时向两相写入高电平可令电机急停,详见芯片手册)
digitalWrite(ENA, HIGH);
delay(1200); //延迟1.2s待舵机稳定
int read_right = readDistance(); //调用readDistance()函数读出右前方距离
Serial.print("RIGHT:");
Serial.println(read_right);
//sensorStation.write(90); //*舵机复位至90度。廉价舵机大角度旋转会产生抖动,要加上这两行以求读数准确。
pinMode(ENA, OUTPUT); //依次设定各I/O属性
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(trigger, OUTPUT);
{
turnRight(); //就向右转,
}
else turnLeft();//否则就向左转
//此处也可以加入另一层逻辑:如果左右两侧读数相等就调用turnAround()原地掉头。但实际上触发的几率不大。
}
// I2C液晶测试程序,Arduino版本1.5.6-r2,LiquidCrystal_I2C库版本2.0
return map(IRvalue,120,930,30,0);//用map()函数把读数转换为距离
}
代码
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);//发送10μs的高电平触发信号
delayMicroseconds(10);
//左电机逆时针旋转
int val1 = analogRead(A0);//手动调整左电机转速。电位器两端分别接至+5V和GND,中心抽头接至A0
int leftSpeed = map(val1,0,1023,0,255); //把读数映射为PWM
analogWrite(ENA,leftSpeed); //写入速度。下面的右电机同理
lcd.print("Hello, world!");//开始打印信息
lcd.setCursor(3,1);//设定显示位置,第3列,第1行
lcd.print("ZANG.HAIBO");
}
void loop()
{
}
//前进
void goForward()
{
Serial.println("FORWARD"); //串行监视器显示机器人状态为FORWARD(前进)
goForward(); //*此处调用看似多余,但可以确保机器人高速运转下动作的连贯性
}
else goForward();//否则就一直向前行驶
}
主程序用到了两个库,Servo库是IDE自带的,NwePing库是第三方库,需要下载安装。
接下来建立一个名为move.ino的标签。
//move.ino,机动模块。
#include <Wire.h>
#include "LiquidCrystal_I2C.h" //导入I2C液晶库
LiquidCrystal_I2C lcd(0x27,16,2); //设定I2C地址及液晶屏参数
void setup()
{
lcd.init();//始化液晶屏
lcd.backlight();
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
//右电机急停
digitalWrite(ENB, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
}
//前进
void goForward()
{
Serial.println("FORWARD"); //串行监视器显示机器人状态为FORWARD(前进)
digitalWrite(IN4, LOW);
}
//原地左转
void turnLeft()
{
Serial.println("LEFT");//串行监视器显示机器人状态为LEFT(向左转)
//左电机正转
analogWrite(ENA,106);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
NewPing sensor(trigger, echo, max_read); //设定传感器引脚和最大读数
//系统初始化
void setup()
{
Serial.begin(9600);//启用串行监视器可以给调试带来极大便利
sensorStation.attach(11); //把D11分配给舵机
digitalWrite(TrigPin, LOW);
distance = pulseIn(EchoPin, HIGH)*340/60/2;//检测脉冲宽度即为超声波往返时间
代码2:简易超声波测距代码
const int TrigPin = 2;
const int EchoPin = 3;//设定SR04连接的Arduino引脚
IRvalue=analogRead(echo);//读取自然光和红外线下反射值的总和
digitalWrite(trigger,LOW);//关闭红外发射管以读取自然光下的反射值
delayMicroseconds(200);//留出200μs响应时间
IRvalue=IRvalue-analogRead(echo);//刨除自然光得出实际值(红外发射管产生的部分)
const int echo = 10 ; //定义传感器接收脚为D10
const int max_read = 300; //设定传感器最大探测距离。
int no_good = 35;//*设定35cm警戒距离。
int read_ahead;//实际距离读数。
Servo sensorStation;//设定传感器平台。
return(cm); //readDistance()返回的数值是cm
}
最后是驱动云台扫描并分析左右两侧距离的watch.ino模块。
// watch.ino,查看模块
void waTch()
{
//测量右前方距离。
//*注意舵机旋转方向,SG5010为逆时针旋转
sensorStation.write(20); //*舵机右转至20°。调节此值会影响传感器扫描区域,夹角越小,机器人转弯越谨慎
analogWrite(ENB,118);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay (205);//*调节此值可使机器人动作连贯
}
//原地掉头(暂时用不到)
void turnAround()
{
Serial.println("TURN 180"); //串行监视器显示机器人状态为TURN 180(原地顺时针旋转180°)
首先建立一个名为modulecar.ino的主程序。
// modulecar.ino,玩转智能小车主程序
#include <Servo.h> //导入舵机库
#include <NewPing.h>//导入NwePing库