避障车(L293D电机驱动)

避障车

视频教程

https://www.bilibili.com/video/BV1nJ411P7dR/?spm_id_from=333.788.recommend_more_video.-1

中英文对照表:

ULTASONIC SENSOR:超声波雷达传感器

L293D电机驱动模块:

  1. L293D(双H桥路)工作原理详解:https://blog.csdn.net/acktomas/article/details/115389622
  2. 电机及底盘的介绍:https://www.bilibili.com/video/BV1EZ4y1s7BK
  3. L298N模块的使用:https://www.bilibili.com/video/BV1Xt411372X
  4. arduino智能车巡线原理实验及代码讲解
    原文链接:https://blog.csdn.net/qq_40593308/article/details/105563369
    这是一款常用的直流电机驱动模块,采用293D芯片小电流直流电机驱动芯片。管脚被做成了rduino兼容的,也方便了爱好者快速的基于rduino的开发。
  • 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做指示灯,我的板子是自己把引脚都焊上来了。

连接程序图

在这里插入图片描述

程序代码:

上传代码前确保已经安装了下面三个类库

  1. 驱动板介绍:AFMotor Library https://learn.adafruit.com/adafruit-motor-shield/library-install
    L293驱动板库函数: https://github.com/adafruit/Adafruit-Motor-Shield-library 版本1.0
  2. NewPing Library https://bitbucket.org/teckel12/arduino-new-ping/downloads/
    NewPing库介绍: https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home
  3. Servo Library https://github.com/arduino-libraries/Servo.git //
//ARDUINO OBSTACLE AVOIDING CAR//

#include <AFMotor.h>
#include <NewPing.h>
#include <Servo.h>
#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);
}
  • 9
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Arduino自动驾驶汽是一个由汽底盘,两个电动轮,一个360°轮(非机动)和一些传感器组成的项目。它由一个9伏电池供电,Arduino Nano连接到一个微型面包板以控制电机和传感器。当它打开时,它开始直行。当它发现前方的障碍物时,它寻找双方,并转向它有更多自由空间的一面。如果前方或两侧没有空余空间,则将电机反转,向后驱动。 第1步:组件 您可以从Amazon订购大部分组件。我放置了我买的汽底盘套件的链接。 1x汽底盘套件:YIKESHU 2WD智能电机机器人汽底盘 2倍齿轮马达 1x汽底盘 2倍的汽轮胎 1x 360°轮 1个Arduino纳米 1x迷你面包板 1个电机驱动L293D 3x超声波传感器HC SR04 支持3x传感器 - 3D打印(参见下图) 1x 9v电池 1x开关 5x 100uF电容器 2个0.1uF电容 1个红外接收器 1x遥控器 第2步:3D打印传感器支持 超声波传感器的支架可以打印在3D打印机上。图纸如下: 详情见上传附件。 PS:孔必须根据您的机箱进行调整。机箱的孔可能有一些小的差异。 第3步:组装机箱 按照手册组装机箱。 面包板可以固定在机箱背面。由于重量的原因,电池放置在机箱的前部非常重要。将传感器支架拧紧或粘在机箱的前面,传感器可以在其支撑上施加压力。没有必要粘上或拧上它。请参考图片以更好地了解组件的位置。 第4步:接线 如图所示连接组件。参考图片了解电容器的位置。具体文件见附件。 第5步:代码 项目的代码见附件。 第6步:准备好了!启动引擎 现在汽已经准备就绪,你可以开始玩了。 当汽放在地上时,打开开关给它供电。之后,使用遥控器上的PLAY按钮启动电机。 当您需要将其关闭时,按遥控器上的PREV按钮并关闭汽上的开关。当它开着的时候,它一直在开着,避开障碍物,但是,防止它进入有台阶或有洞的地方是很重要的。 视频观看地址:https://v.youku.com/v_show/id_XMzIzMjk3NzA2OA==.html
以下是循迹小arduino MEGA2560控制电机l258n六路循迹板代码的示例: ```arduino //定义引脚 int leftmotor1 = 22; int leftmotor2 = 23; int rightmotor1 = 24; int rightmotor2 = 25; int leftsensor1 = 2; int leftsensor2 = 3; int centersensor = 4; int rightsensor2 = 5; int rightsensor1 = 6; void setup() { //设置引脚模式 pinMode(leftmotor1, OUTPUT); pinMode(leftmotor2, OUTPUT); pinMode(rightmotor1, OUTPUT); pinMode(rightmotor2, OUTPUT); pinMode(leftsensor1, INPUT); pinMode(leftsensor2, INPUT); pinMode(centersensor, INPUT); pinMode(rightsensor2, INPUT); pinMode(rightsensor1, INPUT); } void loop() { //读取传感器值 int left1 = digitalRead(leftsensor1); int left2 = digitalRead(leftsensor2); int center = digitalRead(centersensor); int right2 = digitalRead(rightsensor2); int right1 = digitalRead(rightsensor1); //判断传感器值,控制电机 if (center == HIGH) { digitalWrite(leftmotor1, HIGH); digitalWrite(leftmotor2, LOW); digitalWrite(rightmotor1, HIGH); digitalWrite(rightmotor2, LOW); } else if (left1 == HIGH && left2 == LOW) { digitalWrite(leftmotor1, LOW); digitalWrite(leftmotor2, HIGH); digitalWrite(rightmotor1, HIGH); digitalWrite(rightmotor2, LOW); } else if (right1 == HIGH && right2 == LOW) { digitalWrite(leftmotor1, HIGH); digitalWrite(leftmotor2, LOW); digitalWrite(rightmotor1, LOW); digitalWrite(rightmotor2, HIGH); } else if (left2 == HIGH && right2 == HIGH) { digitalWrite(leftmotor1, LOW); digitalWrite(leftmotor2, HIGH); digitalWrite(rightmotor1, LOW); digitalWrite(rightmotor2, HIGH); } else if (left1 == LOW && right1 == LOW) { digitalWrite(leftmotor1, LOW); digitalWrite(leftmotor2, LOW); digitalWrite(rightmotor1, LOW); digitalWrite(rightmotor2, LOW); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔚蓝慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值