自己本身也是个小白,出于好玩和好奇,尝试做了一个自动避障智能小车,翻了很多教程都看得似懂非懂,然后自己写了一篇笔记,希望能对大家有所帮助,也方便自己以后查阅。仅供学习交流使用。
材料:
Arduino UNO r3
L298N电机驱动模块
小车底盘一个,万向轮一个
2个电机及匹配的车轮
9V电池盒及6个1.5V电池
超声波测距模块及其支架
9G舵机一个及其支架
杜邦线若干
小车图片:
连线说明:
Arduino UNO
右轮
左轮
9 ---> 舵机橙线(数字端口)
VIN ---> L298N模块5V供电口
GNG ---> 超声波GND、公共端COM、舵机棕线(接地)
6 ---> IN2
7 ---> IN1
4 ---> IN4
5 ---> IN3
2 ---> Trlg
3 ---> Echo
L298N模块
12V供电 ---> 电源正极
COM公共端 ---> GND、电源负极
5V供电 ---> VIN
输出A ---> 左侧电机
输出B ---> 右侧电机
小车代码:
#include <Servo.h>#define Trig 2 //引脚控制超声波发出声波#define Echo 3 //引脚反应接收到返回声波#define LIN1 7 //左侧轮子#define LIN2 6 #define RIN1 5 //右侧轮子#define RIN2 4 //#define Steeringpin 9 //舵机控制端口int S = 0; //初始化距离Servo Steering; //转向舵机void setup() { // put your setup code here, to run once:
Serial.begin(9600); //设置比特率
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
pinMode(LIN1, OUTPUT);
pinMode(LIN2, OUTPUT);
pinMode(RIN1, OUTPUT);
pinMode(RIN2, OUTPUT);// pinMode(Steeringpin, OUTPUT);
Steering.attach(9); //定义舵机所用引脚
Steering.write(90); //初始化舵机角度
delay(2000); //开机延时}void loop() { // put your main code here, to run repeatedly:
Steering.write(90);
Range(); //测距函数
if(S <= 5) //距离太近不足以转弯
{
Back(); //执行后退函数
delay(300); //后退持续时间
} else if(S >= 5 && S <= 15) //距离中等可以转弯
{
Turn(); //执行转弯判断函数
} else //距离充足
{
Line(); //执行直行函数
}
}void Range() //测距函数{
digitalWrite(Trig,LOW); //测距
delay(2); //延时2微秒
digitalWrite(Trig,HIGH);
delay(10);
digitalWrite(Trig,LOW); float distance = pulseIn(Echo,HIGH); //读取高电平时间
S = float( distance * 17 )/1000; //把值赋给S
Serial.println(S); //向串口发送S的值,可以在显示器上显示距离}// float distance = pulseIn(Echo,HIGH);// S = float( distance * 17 )/1000; // 将回波时间换算成cm// 读取一个引脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。// 返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲函数返回。// 此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒)// 接收到的高电平的时间(us)* 340m/s / 2 = 接收到高电平的时间(us) * 17000 cm / 1000000 us = 接收到高电平的时间 * 17 / 1000 (cm)void Turn() //转向函数{
Lull(); //停止
Steering.write(170); //使舵机转到170度(左侧)
delay(1000); //留时间给舵机转向
Range(); //测距
Steering.write(90); //使舵机回复原位
delay(1000); if(S >= 15) //距离充足
{
turnLeft(); //左转弯后退
} else //距离不足
{
Steering.write(10); //使舵机转到10度(右侧)
delay(1000);
Range();
Steering.write(90); //使舵机回复原位
delay(1000);
if(S >= 15) //距离充足
{
turnRight(); //右转弯后退
} else
{
Back(); //后退
int x = random(1); //产生一个随机数使小车随机转向
if(x == 0)
turnLeft(); else
turnRight();
}
}
}void Back() //后退函数(使电机反转){
digitalWrite(LIN1, LOW);
digitalWrite(LIN2, HIGH);
digitalWrite(RIN1, HIGH);
digitalWrite(RIN2, LOW);
}void Line() //直线行驶函数(使电机正转){
digitalWrite(LIN1, HIGH);
digitalWrite(LIN2, LOW);
digitalWrite(RIN1, LOW);
digitalWrite(RIN2, HIGH);
}void turnLeft() //小车左转后退{
digitalWrite(LIN1, LOW);
digitalWrite(LIN2, HIGH);
digitalWrite(RIN1, LOW);
digitalWrite(RIN2, LOW);
delay(1000);
}void turnRight() //小车右转后退{
digitalWrite(LIN1, LOW);
digitalWrite(LIN2, LOW);
digitalWrite(RIN1, HIGH);
digitalWrite(RIN2, LOW);
delay(1000);
}void Lull() //停止 {
digitalWrite(LIN1, LOW);
digitalWrite(LIN2, LOW);
digitalWrite(RIN1, LOW);
digitalWrite(RIN2, LOW);
}
发表评论 取消回复