创客交流稿

资源包下载

概述

请添加图片描述

工具介绍

1. 软件

编程类

工具类

2. 硬件

  • 万用表
  • 电烙铁
  • 胶枪

常用网站

中文

英文

示例1:利用L298N制作红外遥控小车

红外遥控小车

组件

  1. Arduino Uno:说明书
  2. L298N电机驱动板
  3. 红外线接收模块(ir receiver)
  4. 遥控器
  5. 130电机 TT马达(motor):工作电压3-6V
  6. 9V电池( battery)

测试各个组件

1. L298N电机驱动器

Arduino TutorialPIC Tutorial

参考地址:

  1. 如何使用L298N电机驱动器|微控制器教程
  2. L298N电机驱动器 - Arduino接口,工作原理,代码,原理图 (howtomechatronics.com)

您可以使用ArduinoPIC等微控制器打开或关闭LED。这没有问题,因为来自引脚的20 mA左右的电流就足够了。显然,您无法像电机一样驱动需要更多电流的负载。这就是L298N电机控制器的用武之地。

介绍

L298N电机控制器遵循H桥配置,这在控制直流电机的旋转方向时非常方便。H 桥原理图如下所示:

在这里,电机沿开关指示的方向旋转。当S1和S4打开时,左侧电机端子比右侧端子更正,并且电机沿一定方向旋转。另一方面,当S2和S3打开时,右电机端子比左电机端子更正,使电机向另一个方向旋转。
在这里插入图片描述
使用H桥的另一个好处是,您可以为电机提供单独的电源。这在使用Arduino板时非常重要,因为5V电源根本不足以容纳两个直流电机。

L298N 集成电路

有关 L298N IC 的更多信息,请参见其数据手册:

L298N 数据表

1 文件 597.30 KB

下载

在本教程中,我们将重点介绍 L298N 分线板。

L298N电机控制器板

如前所述,L298N 有四个输入,对应于上面 H 桥图中的四个开关。您需要做的就是将信号施加到输入端,以使电机旋转到某个方向。
请添加图片描述

如上所示,控制器板具有+12V和+5V端子。+12V引脚是连接电机电源的位置。该引脚可接受+7VDC至+35VDC的电压。

重要提示:如果使用的电源高于+12V,请卸下显示的+12V跳线。

连接+12V跳线后,板载稳压器就起作用了,您可以从+5V端子获取+5V电压。这意味着+5V端子不是用于为电路板供电,而是用于连接需要5V电源的设备,例如Arduino。

我们注意到,该IC产生约2V的压降。例如,如果我们使用12V电源,电机端子的电压将约为10V,这意味着我们将无法获得12V直流电机的最大速度。
在这里插入图片描述
电机 A 和电机 B。它们连接到微控制器。电机端子连接到电机端子 1、2、3、4。具体而言,电机 A 连接到端子 1 和 2,而电机 B 连接到端子 3 和 4。

将直流电机连接到 L298N 板

以下是将两个直流电机连接到L298N驱动板的接线图。
在这里插入图片描述

如图所示,板上还有另外两个跳线。如果您使用的是直流电机,请卸下这些跳线,并将其保留用于步进电机。电机 A 和电机 B 的速度控制通过这些引脚上的 PWM 实现。稍后将对此进行详细介绍。
如果希望左侧电机沿一个方向旋转,请对 IN1 应用高脉冲,对 IN2 应用低脉冲。要反转方向,请将 IN1 和 IN2脉冲反转。这同样适用于右侧的电机。

下表总结了引脚和相应的电机方向。这些假设您遵循与上面的弗里辛相同的图。

IN1 IN2 IN3 IN4 方向
0 0 0 0
1 0 1 0 向前
0 1 0 1 反向
1 0 0 1
0 1 1 0

速度控制?

L298N电机驱动器也可以进行速度控制。您只需将 PWM 信号馈送到电机使能引脚即可。电机的速度将根据脉冲的宽度而变化。脉冲越宽,电机旋转得越快。在给定的脉冲宽度下,电机的旋转速度将因电机而异,即使它们看起来完全相同。因此,必须通过实验得出实际脉冲宽度。

将 L298N 与 Arduino 配合使用

图示为将 L298N 电机控制器板连接到 Arduino 的示例图:
在这里插入图片描述

您可以将控制引脚连接到任何数字(甚至模拟)引脚。但是,对于电机速度控制,电机使能引脚必须连接到PWM使能引脚。在这里,您可以看到电机使能引脚连接到引脚 10 和引脚 5,这两个引脚都是 PWM 引脚。

PWM 直流电机控制

PWM或脉宽调制是一种技术,它允许我们通过以快速打开和关闭电源来调整进入电子设备的电压的平均值。平均电压取决于占空比,或信号在单段时间内处于 ON 状态的时间量与信号关闭的时间量。
请添加图片描述

因此,根据电机的尺寸,我们可以简单地将Arduino PWM输出连接到晶体管的基极或MOSFET的栅极,并通过控制PWM输出来控制电机的速度。低功耗 Arduino PWM 信号在驱动高功率电机的 MOSFET 上打开和关闭栅极。
在这里插入图片描述
注意:Arduino GND 和电机电源 GND 应连接在一起。

下面是一个利用上图的 Arduino 程序示例:您可以修改此草图以包含用于向后、向左和向右转的功能。只需按照上表操作即可

//Motor Connections
//Change this if you wish to use another diagram
#define EnA 5
#define In1 6
#define In2 7
#define In3 8
#define In4 9
#define EnB 10 
 
void setup()
{
  // All motor control pins are outputs
  pinMode(EnA, OUTPUT);
  pinMode(EnB, OUTPUT);
  pinMode(In1, OUTPUT);
  pinMode(In2, OUTPUT);
  pinMode(In3, OUTPUT);
  pinMode(In4, OUTPUT);
}
void goStraight()   //run both motors in the same direction
{
  // turn on motor A
  digitalWrite(In1, HIGH);
  digitalWrite(In2, LOW);
  // set speed to 150 out 255
  analogWrite(EnA, 200);
  // turn on motor B
  digitalWrite(In3, HIGH);
  digitalWrite(In4, LOW);
  // set speed to 150 out 255
  analogWrite(EnB, 200);
  delay(2000);
  // now turn off motors
  digitalWrite(In1, LOW);
  digitalWrite(In2, LOW);  
  digitalWrite(In3, LOW);
  digitalWrite(In4, LOW);
}
void loop()
{
  goStraight();
  delay(1000);
}

2. 红外线接收器

在这里插入图片描述
注意: 读取引脚的数据是即时数据,因此需要保存到变量中,这样也减少了读取的次数。
在这里插入图片描述

IRRECV_1 0xFFA25D
IRRECV_2 0xFF629D
IRRECV_3 0xFFE21D
IRRECV_4 0xFF22DD
IRRECV_5 0xFF02FD
IRRECV_6 0xFFC23D
IRRECV_7 0xFFA25D
IRRECV_8 0xFFE01F
IRRECV_9 0xFF906F
IRRECV_0 0xFF9867
IRRECV_Hashtag 0xFFB04F    // #号
IRRECV_Asterisk 0xFF6897   //  *号
IRRECV_OK    0xFF38C7
IRRECV_UP    0xFF18E7
IRRECV_LEFT  0xFF10EF
IRRECV_RIGHT 0xFF5AA5
IRRECV_DOWN  0xFF4AB5

自动避障车

参考资料:

  1. Arduino AFMotor 电机扩展板概述
  2. 避障车(L293D电机驱动)

配件

  1. Arduino Uno:说明书
  2. 超声波传感器模块(Ultrasonic sensor Module)
  3. 舵机(servo)
  4. 130电机 TT马达(motor):工作电压3-6V
  5. 9V电池( battery)
  6. AFmotor电机驱动板1.0
    改进
    手机遥控太乐1号
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

//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);
}

版权声明:本文为CSDN博主「acktomas」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/acktomas/article/details/122853135

生成海报
点赞 0

acktomas

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

创客交流稿

资源包下载 概述 工具介绍 1. 软件 编程类: Arduino IDE:https://www.arduino.cc/mind:http://mindplus.cc/ 工具类 Fritzi

串口不定长接收

一、保留接收区和开启接收的语句    uint8_t buffer[5];HAL_UART_Transmit_IT(&huart1,buffer,3); 二、写入开启空闲中断的语句    __HAL_UART_ENABLE_IT(&huart