树莓派通过L298N模块控制电机运行

L298N是一款双路直流电机驱动器模块,实现较高电压、较大电流的电机驱动要求。

L298N电机驱动模块有两个供电,一个是逻辑部分的5V供电,一个是电机的供电。当5V是能有效时(Jumper连接),逻辑部分的5V供电通过内置的78M05通过驱动电源部分(电机的供电)获取,同时也可以对外提供5V供电(+5V),但为了避免稳压芯片的损坏,当电机供电大于12V时,板上5V使能(Jumper)务必断开,使用外接5V供电。电机的供电电压范围较大,一般5V ~ 35V,要看具体模块的产品规格。

L298N电机驱动模块可以驱动两路直流电机,使能端ENA、ENB为高电平时有效,控制方式及之久电机状态表如下:
使能A(ENA)

ENA IN1 IN2 Motor
0 x x 停止
1 0 0 制动(brake)
1 0 1 正转
1 1 0 反转
1 1 1 制动

使能B(ENb)

ENb IN3 IN4 Motor
0 x x 停止
1 0 0 制动(brake)
1 0 1 正转
1 1 0 反转
1 1 1 制动

本文将介绍如何使用树莓派3B+来控制电机的正、反转,以及通过PWM来控制转速。本例使用两节18650作为电机的驱动电压,同时提供板上5V使能(jumper连接)。如下是树莓派和L298N的电路连接图,通过ENA控制一路电机转动,ENA连接树莓派的GPIO25(物理针脚22),IN1和IN2分别连接树莓派GPIO23和GPIO24(物理针脚16和18):

以下是python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import RPi.GPIO as GPIO          
from time import sleep

in1 = 23
in2 = 24
ena = 25
temp1=1

GPIO.setmode(GPIO.BCM)
GPIO.setup(in1,GPIO.OUT)
GPIO.setup(in2,GPIO.OUT)
GPIO.setup(ena,GPIO.OUT)
GPIO.output(in1,GPIO.LOW)
GPIO.output(in2,GPIO.LOW)
p=GPIO.PWM(ena,1000)
p.start(25)
print("\n")
print("The default speed & direction of motor is LOW & Forward.....")
print("r-run s-stop f-forward b-backward l-low m-medium h-high e-exit")
print("\n")

while(1):
x=input()

if x=='r':
print("run")
if(temp1==1):
GPIO.output(in1,GPIO.HIGH)
GPIO.output(in2,GPIO.LOW)
print("forward")
x='z'
else:
GPIO.output(in1,GPIO.LOW)
GPIO.output(in2,GPIO.HIGH)
print("backward")
x='z'

elif x=='s':
print("stop")
GPIO.output(in1,GPIO.LOW)
GPIO.output(in2,GPIO.LOW)
x='z'

elif x=='f':
print("forward")
GPIO.output(in1,GPIO.HIGH)
GPIO.output(in2,GPIO.LOW)
temp1=1
x='z'

elif x=='b':
print("backward")
GPIO.output(in1,GPIO.LOW)
GPIO.output(in2,GPIO.HIGH)
temp1=0
x='z'

elif x=='l':
print("low")
p.ChangeDutyCycle(15)
x='z'

elif x=='m':
print("medium")
p.ChangeDutyCycle(50)
x='z'

elif x=='h':
print("high")
p.ChangeDutyCycle(75)
x='z'

elif x=='e':
GPIO.cleanup()
break

else:
print("<<< wrong data >>>")
print("please enter the defined data to continue.....")
  • r: 电机开始运行
  • s: 电机停止运行
  • f: 向前
  • b:向后
  • l: 低速
  • m: 中速
  • h: 高速
  • e: 退出

参考: