避障车
视频教程
https://www.bilibili.com/video/BV1nJ411P7dR/?spm_id_from=333.788.recommend_more_video.-1
中英文对照表:
ULTASONIC SENSOR:超声波雷达传感器
L293D电机驱动模块:
- 2个5V伺服电机(舵机)端口 联接到Arduino的高解析高精度的定时器-无抖动!
- 多达4个双向直流电机及4路PWM调速(大约0.5%的解析度)
- 多达2个步进电机正反转控制,单/双步控制,交错或微步及旋转角度控制。
- 4路H-桥:L293D 芯片每路桥提供.0.6A(峰值1.2A)电流并且带有热断电保护,4.5V to 36V。
- 下拉电阻保证在上电时电机保持停止状态。
- 大终端接线端子使接线更容易(10 - 22AWG)和电源。
- 带有Arduino复位按钮。
- 2个大终端外部电源接线端子 保证逻辑和电机驱动电源分离。
- 兼容Mega, Diecimila, & Duemilanove。
- 提供全套散件可供想自己动手的爱好者DIY。
-下载方便使用的Arduino软件库快速进行项目开发
注意,使用步进电机会占用2个直流电机接口,电机驱动电源需要单独供电给电机,电路驱动电源需要使用51单片机提供的电源,也可以单独供电,但是必须要跟单片机共地,否则会无法将数据写入模块。
模块引脚说明(该模块是为arduino设计的,所以使用51单片机驱动该模块有些引脚是没用的,如:0,1,2,13,ARef):
3:直流电机M2的PWM信号端,与左边的L293D芯片(IC1)的9号脚相连
4:74HC595芯片的数据输入时钟端(上升沿有效),与中间的74HC595芯片(IC3)的11号脚相连
5:直流电机M4的PWM信号端,与右边的L293D芯片(IC2)的1号脚相连
6:直流电机M3的PWM信号端,与右边的L293D芯片(IC2)的9号脚相连
7:74HC595芯片的输出使能端(低电平有效),与中间的74HC595芯片(IC3)的13号脚相连
8:74HC595芯片的串行数据输入端,与中间的74HC595芯片(IC3)的14号脚相连
9:舵机2的PWM信号端
10:舵机1的PWM信号端
11:直流电机M1的PWM信号端,与左边的L293D芯片(IC2)的1号脚相连
12:74HC595芯片的并行数据输出时钟端(上升沿有效),与中间的74HC595芯片(IC3)的12号脚相连
A0~A5可以自行焊接排针作为扩展,可以提供给舵机也可以提供给测速模块,接线柱的电机驱动电源是提供给4个直流电机的,引脚的5V电路驱动电源是提供给芯片和舵机的,以及右下脚的5V电源,黄色的跳线帽将电机驱动电源和9V引脚相连,电机驱动电源提供多少伏的电压,9V接脚就是多少伏的,并不是固定9V,所以请注意,关于电机驱动电源资料上说的是4.5V到36V,建议在12V之内,L293D的芯片是4.5V到36V的,但是该模块上的其他元件不一定能承受,本人就弄坏一个板子,起初是74HC595芯片莫名其妙的烧坏,然后更换芯片后,在20V电压下调压时拧错了反向,导致一个电容爆炸了,但是肯定是没有超过36V的,该模块的电容的击穿电压是16V,20V以下是没有问题的,还要注意的是电流,不能过大,一般12V的电压绝对够用了。
模块上还有一些被焊死的接口,是和直流电机接线柱相邻的(蓝色区域其他引脚是GND),可以自行焊上排针,这样就可以使用杜邦线连接电机了或者串上电阻接上LED做指示灯,我的板子是自己把引脚都焊上来了。
连接程序图
程序代码:
上传代码前确保已经安装了下面三个类库
//ARDUINO OBSTACLE AVOIDING CAR//
#include
#include
#include
#define ECHO_PIN A0 //定义接受回传超声波信号为模拟引脚A0
#define TRIG_PIN A1 //定义发送超声波信号为模拟引脚A1
#define MAX_DISTANCE 200 //定义超声波信号发射的最大距离为200
#define MAX_SPEED 200 // 设置电机的最高速200
#define MAX_SPEED_OFFSET 20 设置最大速度补偿为20
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); //使用构造函数新建一个超声波传感器对象
AF_DCMotor motor1(1, MOTOR12_1KHZ); //定义电机M1
AF_DCMotor motor2(2, MOTOR12_1KHZ); //定义电机M2
Servo myservo; //新建舵机对象
boolean goesForward = false;
int distance = 100;
int speedSet = 0;
void setup() {
//Serial.begin(115200);
myservo.attach(9); //若连接在servo1则端口号是10
myservo.write(115);
delay(1000);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
}
void loop() {
int distanceR = 0;
int distanceL = 0;
delay(40);
//如果检测到障碍物小于15cm就往后退,再对比左右两边障碍距离,再转弯然后直行
if (distance <= 15)
{
moveStop();
delay(100);
moveBackward();
delay(300);
moveStop();
delay(200);
distanceR = lookRight();
delay(200);
distanceL = lookLeft();
delay(200);
if (distanceR >= distanceL)
{
turnRight();
moveStop();
} else
{
turnLeft();
moveStop();
}
} else
{
moveForward();
}
distance = readPing();
}
int lookRight()
{
myservo.write(50);
delay(500);
int distance = readPing();
delay(100);
myservo.write(115);
return distance;
}
int lookLeft()
{
myservo.write(170);
delay(500);
int distance = readPing();
delay(100);
myservo.write(115);
return distance;
delay(100); //acktomas:此语句是否执行?
}
int readPing() {
delay(70);
int cm = sonar.ping_cm();
//Serial.println(cm);
if (cm == 0)
{
cm = 250;
}
return cm;
}
void moveStop() {
motor1.run(RELEASE);
motor2.run(RELEASE);
}
void moveForward() {
if (!goesForward)
{
goesForward = true;
motor1.run(FORWARD);
motor2.run(FORWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) // 缓慢增加电机速度
{
motor1.setSpeed(speedSet);
motor2.setSpeed(speedSet);
delay(5);
}
}
}
void moveBackward() {
goesForward = false;
motor1.run(BACKWARD);
motor2.run(BACKWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) // 后退逐步增加电机速度
{
motor1.setSpeed(speedSet);
motor2.setSpeed(speedSet);
delay(5);
}
}
void turnRight() {
motor1.run(FORWARD);
motor2.run(BACKWARD);
delay(500);
motor1.run(FORWARD);
motor2.run(FORWARD);
}
void turnLeft() {
motor1.run(BACKWARD);
motor2.run(FORWARD);
delay(500);
motor1.run(FORWARD);
motor2.run(FORWARD);
}
举报