小猪学arduino—使用L298驱动版控制两个直流电机

一、简介

L298N驱动模块,可以驱动2个直流电机,可分别实现正转,反转功能。

二、准备材料

Arduino Uno       * 1
L298N驱动模块   * 1
直流电机               * 2
18650电池            * 2
跳线                      若干

三、普通电机控制

1.连线方法

注意:L298N必须外接6-12v电压及一定电流的外接电池,在这里被坑了好久,用普通的6v+电池外接时,不是只转一个轮子就是在拔掉电脑数据线后完全不转了,最后把外接电源换成两节18650电池后解决

2.程序代码

选用IO口为5,6,9,10,这四个均支持PWM,可以通过占空比代码实现控制转动速度的快慢

int input1 = 5; // 定义uno的pin 5 向 input1 输出
int input2 = 6; // 定义uno的pin 6 向 input2 输出
int input3 = 9; // 定义uno的pin 9 向 input3 输出
int input4 = 10; // 定义uno的pin 10 向 input4 输出
int speed = 135; //速度
void setup() {
  //Serial.begin (9600);
  //初始化各IO,模式为OUTPUT 输出模式
  pinMode(input1,OUTPUT);
  pinMode(input2,OUTPUT);
  pinMode(input3,OUTPUT);
  pinMode(input4,OUTPUT);
}

void loop() {
  //forward 向前转
  digitalWrite(input1,HIGH); //给高电平
  //analogWrite(input1, speed); //pwm调速
  digitalWrite(input2,LOW);  //给低电平
  digitalWrite(input3,HIGH); //给高电平
  //analogWrite(input3, speed); //pwm调速
  digitalWrite(input4,LOW);  //给低电平
  delay(1000);   //延时1秒
  
  //stop 停止
  digitalWrite(input1,LOW);
  digitalWrite(input2,LOW);
  digitalWrite(input3,LOW);
  digitalWrite(input4,LOW);
  delay(500);  //延时0.5秒
  
  //back 向后转
  digitalWrite(input1,LOW);
  digitalWrite(input2,HIGH);
  //analogWrite(input2, speed);
  digitalWrite(input3,LOW);
  digitalWrite(input4,HIGH);
  //analogWrite(input4, speed);
  delay(1000);
}

注意:我在电池的选择上困扰了好久,试了1.5v南孚串联、9v方块电池、充电宝、手机锂电池,最后发现使用两节18650电池不但电压和电流够用,而且充满电能用好久,以后搞arduino用这种电池就行了,所以看到此文的人就不要再入坑了。

三、编码电机的控制与编码器数据读取

机器人需要精细控制时,会需要用到带编码器的减速电机,这类电机不只有正负极2根线。以下图的25GA-370电机为例,它有6根线:

其中电机电源+-对调可以控制正反转;编码器电源接arduino 5V电源供电;编码器A/B相连接到arduino ENC PIN口用于编码器数据读取。

1.连接方法

  • 电机电源+正-负极(红+/白-线):接L298 output 1/2或3/4口(供电+驱动板控制)
  • L298 input(控制口):接arduino D7/D8口(用于电机运动控制)
  • 电机编码器电源+正-负极(蓝+/黑-线):接arduino VIN+GND口(供电)
  • 电机编码器信号(绿A/黄B线):接arduino D3/D4口(用于电机编码器信息读取)

2.程序代码

说明文档和代码放到https://github.com/yanjingang/ros_arduino_bridge了,直接移步git继续即可。

# pc/pi安装 ros_arduino_bridge 库
cd ~/catkin_ws/src
git clone git@github.com:yanjingang/ros_arduino_bridge.git
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

#arduino 
#烧制OSArduinoBridge.ino到板子上

# pc/pi启动测试
roslaunch ros_arduino_python arduino.launch

# 尝试发布 Twist 命令:
rostopic pub /cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
rostopic pub -1 /cmd_vel geometry_msgs/Twist '{ angular: {z: 1} }'

# 查看里程计数据:
rostopic echo /odom

# 如果发布Twist后里程计数为0或/odom坐标不变,检查下编码器的电源和信号接线是否正确
get_encoder_counts: [0, 0]

三、L298P与L298N的区别

1.连线方法

L298P与L298N的原理基本类似,仅在PCB封装方式上比较方便与arduino结合插拔(一些特殊的封装板子也扩展了舵机和蓝牙等接口),它的连线特别点在于默认占用了D10-13逻辑控制输入端口,对应L298N的4个logic input端口(需要注意仅D10/11引脚支持PWM,不能像L298N那样连4个PWM引脚)。

L298P插到arduino后这4个input端口已经默认连好,不需要再进行l298到arduino的logic input连线,只需要在大马力电机时单独给l298p接>6V的电源供电即可。

2.程序代码

// L298P + jga25-370 双电机控制

// l298p固定端口
int Ea = 10;  // A motor PWM调速(控制转速)
int Eb = 11;  // B motor PWM调速(控制转速)
int Ma = 12;  // A motor 使能(控制转动方向)
int Mb = 13;  // B motor 使能(控制转动方向)

void setup() {
    pinMode(Ma, OUTPUT);
    pinMode(Mb, OUTPUT);

    Serial.begin(57600);
}
void loop() {
    // 基本测试
    // Test();

    // 移动测试
    int speed = 100;
    // 前进
    Forward(speed);
    delay(2000);
    // 后退
    Backward(speed);
    delay(2000);
    // 左转
    TurnLeft(speed);
    delay(2000);
    // 右转
    TurnRight(speed);
    delay(2000);
    // 停止
    Stop();
    delay(3000);
}

// 电机的正反调速测试
void Test() {
    // 两路电机正转
    {
        Serial.println("Forward...");
        int value;
        for (value = 0; value <= 255; value += 5) {
            Serial.println(value);

            digitalWrite(Ma, HIGH);
            digitalWrite(Mb, HIGH);
            analogWrite(Ea, value);  // PWM 调速
            analogWrite(Eb, value);  // PWM 调速
            delay(50);
        }
        delay(1000);
    }
    // 两路电机反转
    {
        Serial.println("Backward...");
        int value;
        for (value = 0; value <= 255; value += 5) {
            Serial.println(value);

            digitalWrite(Ma, LOW);
            digitalWrite(Mb, LOW);
            analogWrite(Ea, value);  // PWM 调速
            analogWrite(Eb, value);  // PWM 调速
            delay(50);
        }
        delay(1000);
    }
}

// 移动方法
// 前进
void Forward(int speed) {
    Serial.println("Forward!");

    digitalWrite(Ma, HIGH);  // 正转
    digitalWrite(Mb, LOW);   // 反转
    analogWrite(Ea, speed);  // PWM 调速
    analogWrite(Eb, speed);  // PWM 调速
}
// 后退
void Backward(int speed) {
    Serial.println("Backward!");

    digitalWrite(Ma, LOW);   // 反转
    digitalWrite(Mb, HIGH);  // 正转
    analogWrite(Ea, speed);  // PWM 调速
    analogWrite(Eb, speed);  // PWM 调速
}
// 停止
void Stop() {
    Serial.println("Stop!");

    digitalWrite(Ma, LOW);
    digitalWrite(Mb, LOW);
    digitalWrite(Ea, LOW);
    digitalWrite(Eb, LOW);
}
// 左转
void TurnLeft(int speed) {
    Serial.println("TurnLeft!");

    digitalWrite(Ma, LOW);   // 反转
    digitalWrite(Mb, LOW);   // 反转
    analogWrite(Ea, speed);  // PWM 调速
    analogWrite(Eb, speed);  // PWM 调速
}
// 右转
void TurnRight(int speed) {
    Serial.println("TurnRight!");

    digitalWrite(Ma, HIGH);  // 正转
    digitalWrite(Mb, HIGH);  // 正转
    analogWrite(Ea, speed);  // PWM 调速
    analogWrite(Eb, speed);  // PWM 调速
}

3.其他端口说明

很好奇l298p其他端口都是干啥的,在网上找到一个备注的比较详细说明放这里

 

yan 17.8.6 0:28

 

参考:

使用Arduino与L298N(红板) 驱动直流电机

ROS机器人Diego 1#制作(三)Base Controller—Ros_arduino_bridge

L298N 电机驱动板 – 详细介绍

欢迎关注下方“非著名资深码农“公众号进行交流~

发表评论

邮箱地址不会被公开。