一、简介
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
参考:
ROS机器人Diego 1#制作(三)Base Controller—Ros_arduino_bridge