RASPBERRY PI机器人-BIG ROB BTS7960B电动机驱动程序和软件
首先,我搭建了一个2.5 A的小型H桥,为直流电动机供电。但是,这种类型的电机驱动器设计得太小了,一旦机器人要在现场打开,电机驱动器就会烧坏。然后,我买了一个功能更强大的电动机驱动器,现在可以用它驱动并行驶,而电动机驱动器不会烧坏。我一直在寻找这种电机驱动器已有一段时间,并且想购买一个能够为每个电机提供至少10 A电流的驱动器。我发现一个马达驱动器可提供最大43 A的电流,并且可以通过Raspberry Pi进行控制。然后,我决定购买BTS7960B电机驱动器。原因是它可以提供43 A的电流,对于我的机器人中的DC电动机来说,这已经足够了。
下图显示了两个电机驱动器和Raspberry Pi放在Big Rob中的一块纸板上。
为使您轻松找到货源,我在亚马逊在线商店中直接添加了BTS7960B电机驱动器的链接。
淘宝中有类似的电机驱动模块。
BTS7960B电机驱动器的逻辑电缆连接
您需要六根母对母跨接电缆才能将电机驱动器连接到Raspberry Pi。需要两条电缆为电机驱动器的逻辑电路提供3.3 V电压(VCC和GND)。需要另外两条电缆来激活H桥,即,将Raspberry Pi生成的高信号发送到电动机驱动器,以确定直流电动机的旋转方向(R_EN / L_EN)。需要最后两根跨接电缆将PWM信号发送到电动机驱动器,该信号确定电动机应旋转多快(RPWM / LPWM)。
下图显示了机器人中的有线电动机驱动器。
BTS7960B RASPBERRY PI的PYTHON程序
我必须重写我现有的Python程序,到目前为止,我已经使用该程序控制了普通的小型L298N H桥,以便能够控制BTS7960B电机驱动器。通过此过程,可以更轻松地继续使用现有的Python程序RobotControl.py进行机器人的手动控制。仅需要将新创建的用于控制BTS7960B电机驱动器的模块导入控制程序。
L298NHBigrob.py
如下
#!/usr/bin/env python
# coding: latin-1
# Autor: Ingmar Stapel
# Datum: 20160731
# Version: 2.0
# Homepage: http://custom-build-robots.com
# Dieses Programm wurde fuer die Ansteuerung der linken und rechten
# Motoren des Roboter-Autos entwickelt. Es geht dabei davon aus,
# dass eine L298N H-Bruecke als Motortreiber eingesetzt wird.
# Dieses Programm muss von einem uebergeordneten Programm aufgerufen
# werden, dass die Steuerung des Programmes L298NHBridge übernimmt.
# Es wird die Klasse RPi.GPIO importiert, die die Ansteuerung
# der GPIO Pins des Raspberry Pi ermoeglicht.
import RPi.GPIO as io
io.setmode(io.BCM)
# Die Variable PWM_MAX gibt die maximale Drehgeschwindigkeit der
# Motoren als Prozentwert vor.
# Die Geschwindigkeit wird initial auf 70% der max Leistung der
# H-Bruecke gedrosselt um am Anfang mit der Steuerung des Roboter
# Autos besser zurecht zu kommen. Soll das Roboter-Auto schneller
# fahren kann hier der Wert von 70% auf maximal 100% gesetzt werden.
PWM_MAX = 100
# Mit dem folgenden Aufruf werden eventuelle Warnungen die die
# Klasse RPi.GPIO ausgibt deaktiviert.
io.setwarnings(False)
# Im folgenden Programmabschnitt wird die logische Verkabelung des
# Raspberry Pi im Programm abgebildet. Dazu werden den vom Motor
# Treiber bekannten Pins die GPIO Adressen zugewiesen.
# --- START KONFIGURATION GPIO Adressen ---
# Linker Motortreiber
L_L_EN = 22 # leftmotor_in1_pin
L_R_EN = 23 # leftmotor_in2_pin
L_L_PWM = 18 # leftmotorpwm_pin_l
L_R_PWM = 17 # leftmotorpwm_pin_r
# Rechter Motortreiber
R_L_EN = 13 # rightmotor_in1_pin
R_R_EN = 19 # rightmotor_in2_pin
R_L_PWM = 12 # rightmotorpwm_pin_l
R_R_PWM = 6 # rightmotorpwm_pin_r
# --- ENDE KONFIGURATION GPIO Adressen ---
# Der Variable leftmotor_in1_pin wird die Varibale IN1 zugeorndet.
# Der Variable leftmotor_in2_pin wird die Varibale IN2 zugeorndet.
leftmotor_in1_pin = L_L_EN
leftmotor_in2_pin = L_R_EN
# Beide Variablen leftmotor_in1_pin und leftmotor_in2_pin werden als
# Ausgaenge "OUT" definiert. Mit den beiden Variablen wird die
# Drehrichtung der Motoren gesteuert.
io.setup(leftmotor_in1_pin, io.OUT)
io.setup(leftmotor_in2_pin, io.OUT)
# Der Variable rightmotor_in1_pin wird die Varibale IN1 zugeorndet.
# Der Variable rightmotor_in2_pin wird die Varibale IN2 zugeorndet.
rightmotor_in1_pin = R_L_EN
rightmotor_in2_pin = R_R_EN
# Beide Variablen rightmotor_in1_pin und rightmotor_in2_pin werden
# als Ausgaenge "OUT" definiert. Mit den beiden Variablen wird die
# Drehrichtung der Motoren gesteuert.
io.setup(rightmotor_in1_pin, io.OUT)
io.setup(rightmotor_in2_pin, io.OUT)
# Die GPIO Pins des Raspberry Pi werden initial auf False gesetzt.
# So ist sichger gestellt, dass kein HIGH Signal anliegt und der
# Motor Treiber nicht unbeabsichtigt aktiviert wird.
io.output(leftmotor_in1_pin, True)
io.output(leftmotor_in2_pin, True)
io.output(rightmotor_in1_pin, True)
io.output(rightmotor_in2_pin, True)
# Der Variable leftmotorpwm_pin wird die Varibale ENA zugeorndet.
# Der Variable rightmotorpwm_pin wird die Varibale ENB zugeorndet.
leftmotorpwm_pin_l = L_L_PWM
leftmotorpwm_pin_r = L_R_PWM
rightmotorpwm_pin_l = R_L_PWM
rightmotorpwm_pin_r = R_R_PWM
# Die Beide Variablen leftmotorpwm_pin und rightmotorpwm_pin werden
# als Ausgaenge "OUT" definiert. Mit den beiden Variablen wird die
# Drehgeschwindigkeit der Motoren über ein PWM Signal gesteuert.
io.setup(leftmotorpwm_pin_l, io.OUT)
io.setup(leftmotorpwm_pin_r, io.OUT)
io.setup(rightmotorpwm_pin_l, io.OUT)
io.setup(rightmotorpwm_pin_r, io.OUT)
# Die Beide Variablen leftmotorpwm_pin und rightmotorpwm_pin werden
# zusätzlich zu Ihrer Eigenschaft als Ausgaenge als "PWM" Ausgaenge
# definiert.
leftmotorpwm_l = io.PWM(leftmotorpwm_pin_l,100)
leftmotorpwm_r = io.PWM(leftmotorpwm_pin_r,100)
rightmotorpwm_l = io.PWM(rightmotorpwm_pin_l,100)
rightmotorpwm_r = io.PWM(rightmotorpwm_pin_r,100)
# Die linke Motoren steht still, da das PWM Signale mit
# ChangeDutyCycle(0) auf 0 gesetzt wurde.
leftmotorpwm_l.start(0)
leftmotorpwm_r.start(0)
leftmotorpwm_l.ChangeDutyCycle(0)
leftmotorpwm_r.ChangeDutyCycle(0)
# Die rechten Motoren steht still, da das PWM Signale mit
# ChangeDutyCycle(0) auf 0 gesetzt wurde.
rightmotorpwm_l.start(0)
rightmotorpwm_r.start(0)
rightmotorpwm_l.ChangeDutyCycle(0)
rightmotorpwm_r.ChangeDutyCycle(0)
# Die Funktion setMotorMode(motor, mode) legt die Drehrichtung der
# Motoren fest. Die Funktion verfügt über zwei Eingabevariablen.
# motor -> diese Variable legt fest ob der linke oder rechte
# Motor ausgewaehlt wird.
# mode -> diese Variable legt fest welcher Modus gewaehlt ist
# Beispiel:
# setMotorMode(leftmotor, forward) Der linke Motor ist gewaehlt
# und dreht vorwaerts .
# setMotorMode(rightmotor, reverse) Der rechte Motor ist ausgewaehlt
# und dreht rueckwaerts.
# setMotorMode(rightmotor, stopp) Der rechte Motor ist ausgewaehlt
# der gestoppt wird.
def setMotorMode(motor, mode):
if motor == "leftmotor":
if mode == "reverse":
io.output(leftmotor_in1_pin, True)
io.output(leftmotor_in2_pin, False)
elif mode == "forward":
io.output(leftmotor_in1_pin, False)
io.output(leftmotor_in2_pin, True)
else:
io.output(leftmotor_in1_pin, False)
io.output(leftmotor_in2_pin, False)
elif motor == "rightmotor":
if mode == "reverse":
io.output(rightmotor_in1_pin, False)
io.output(rightmotor_in2_pin, True)
elif mode == "forward":
io.output(rightmotor_in1_pin, True)
io.output(rightmotor_in2_pin, False)
else:
io.output(rightmotor_in1_pin, False)
io.output(rightmotor_in2_pin, False)
else:
io.output(leftmotor_in1_pin, False)
io.output(leftmotor_in2_pin, False)
io.output(rightmotor_in1_pin, False)
io.output(rightmotor_in2_pin, False)
# Die Funktion setMotorLeft(power) setzt die Geschwindigkeit der
# linken Motoren. Die Geschwindigkeit wird als Wert zwischen -1
# und 1 uebergeben. Bei einem negativen Wert sollen sich die Motoren
# rueckwaerts drehen ansonsten vorwaerts.
# Anschliessend werden aus den uebergebenen Werten die notwendigen
# %-Werte fuer das PWM Signal berechnet.
# Beispiel:
# Die Geschwindigkeit kann mit +1 (max) und -1 (min) gesetzt werden.
# Das Beispielt erklaert wie die Geschwindigkeit berechnet wird.
# SetMotorLeft(0) -> der linke Motor dreht mit 0% ist gestoppt
# SetMotorLeft(0.75) -> der linke Motor dreht mit 75% vorwaerts
# SetMotorLeft(-0.5) -> der linke Motor dreht mit 50% rueckwaerts
# SetMotorLeft(1) -> der linke Motor dreht mit 100% vorwaerts
def setMotorLeft(power):
int(power)
if power < 0:
# Rueckwaertsmodus fuer den linken Motor
#setMotorMode("leftmotor", "reverse")
pwm = -int(PWM_MAX * power)
if pwm > PWM_MAX:
pwm = PWM_MAX
leftmotorpwm_l.ChangeDutyCycle(pwm)
leftmotorpwm_r.ChangeDutyCycle(0)
elif power > 0:
# Vorwaertsmodus fuer den linken Motor
#setMotorMode("leftmotor", "forward")
pwm = int(PWM_MAX * power)
if pwm > PWM_MAX:
pwm = PWM_MAX
leftmotorpwm_l.ChangeDutyCycle(0)
leftmotorpwm_r.ChangeDutyCycle(pwm)
else:
# Stoppmodus fuer den linken Motor
leftmotorpwm_l.ChangeDutyCycle(0)
leftmotorpwm_r.ChangeDutyCycle(0)
# Die Funktion setMotorRight(power) setzt die Geschwindigkeit der
# rechten Motoren. Die Geschwindigkeit wird als Wert zwischen -1
# und 1 uebergeben. Bei einem negativen Wert sollen sich die Motoren
# rueckwaerts drehen ansonsten vorwaerts.
# Anschliessend werden aus den uebergebenen Werten die notwendigen
# %-Werte fuer das PWM Signal berechnet.
# Beispiel:
# Die Geschwindigkeit kann mit +1 (max) und -1 (min) gesetzt werden.
# Das Beispielt erklaert wie die Geschwindigkeit berechnet wird.
# setMotorRight(0) -> der linke Motor dreht mit 0% ist gestoppt
# setMotorRight(0.75) -> der linke Motor dreht mit 75% vorwaerts
# setMotorRight(-0.5) -> der linke Motor dreht mit 50% rueckwaerts
# setMotorRight(1) -> der linke Motor dreht mit 100% vorwaerts
def setMotorRight(power):
int(power)
if power < 0:
# Rueckwaertsmodus fuer den rechten Motor
#setMotorMode("rightmotor", "reverse")
pwm = -int(PWM_MAX * power)
if pwm > PWM_MAX:
pwm = PWM_MAX
rightmotorpwm_l.ChangeDutyCycle(pwm)
rightmotorpwm_r.ChangeDutyCycle(0)
elif power > 0:
# Vorwaertsmodus fuer den rechten Motor
#setMotorMode("rightmotor", "forward")
pwm = int(PWM_MAX * power)
if pwm > PWM_MAX:
pwm = PWM_MAX
rightmotorpwm_l.ChangeDutyCycle(0)
rightmotorpwm_r.ChangeDutyCycle(pwm)
else:
# Stoppmodus fuer den rechten Motor
rightmotorpwm_l.ChangeDutyCycle(0)
rightmotorpwm_r.ChangeDutyCycle(0)
# Die Funktion exit() setzt die Ausgaenge die den Motor Treiber
# steuern auf False. So befindet sich der Motor Treiber nach dem
# Aufruf derFunktion in einem gesicherten Zustand und die Motoren
# sind gestopped.
def exit():
io.output(leftmotor_in1_pin, False)
io.output(leftmotor_in2_pin, False)
io.output(rightmotor_in1_pin, False)
io.output(rightmotor_in2_pin, False)
io.cleanup()
# Ende des Programmes
适用于PCA9685伺服控制器的BTS7960B PYTHON程序
由于BigRob机器人内置了两个BTS7960B电机驱动器来进行控制,因此我还需要四个PWM信号。Raspberry Pi本身很难通过其架构生成良好且恒定的PWM信号。这就是为什么我在最新程序版本中使用PCA9685伺服控制器来生成PWM信号的原因。用于激活电机驱动器的所有其他引脚仍连接到Raspberry Pi。
笔者:这里用PCA9685这个专门产生pwm的模块,不过这也是一种方案。
另外该项目在 GitHub开源
[lv]https://github.com/custom-build-robots/Motor-Driver-BTS7960B-and-PCA9685 [/lv]
总结
根据我在构建机器人中的所有经验,BTS7960B的接线简单明了。我先前编写的Python程序的进一步使用使机器人控件的开发变得更加容易。因此,我有可能在几分钟内调整必要的程序,并能够随心所欲地驾驭Big Rob。拥有如此强大的动力和扭矩的机器人真的很棒。







