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。拥有如此强大的动力和扭矩的机器人真的很棒。