In der Vergangenheit habe ich viele Roboter gebaut die eine L298N H-Brücke verwendet haben. Mit der L298N H-Brücke ist es möglich mit einen Raspberry Pi zwei Motoren anzusteuern und die Geschwindigkeit und die Drehrichtung zu bestimmen. Aber das Problem mit dem Raspberry Pi ist, dass kaum ein klares PWM Signal erzeugt werden kann. So passiert ist immer wieder das sich die Motoren nicht richtig drehen. Die Ursache liegt in dem durch Software erzeugten PWM Signal des Raspberry Pi. Damit ich ein sauberes und stabiles PWM Signal erzeugen kann habe ich mich dazu entschieden den Adafruit PCA9685 Servo Kontroller zu kaufen. Mit diesem Board ist es einfach ein PWM Signal für bis zu 16 Servo Motoren zu erzeugen.
Die Idee in dieser Anleitung ist es statt einem Servo Motor eine L298N H-Brücke am Servo Kontroller anzuschließen und so zwei DC Motoren über das generierte PWM Signal des PCA9685 Chips zu stuern.
Das folgende Bild zeigt meinen Versuchsaufbau mit einer L298N H-Brücke, einem Step-Down Konverter, dem PCA9685 Servo Kontroller, einem Levle-Shifter und dem Raspberry Pi. Ganz rechts sind die beiden Getriebemotoren zu sehen.
Komponenten Übersicht
Das ist die Liste der Komponenten die ich für meinen Aufbau eingesetzt habe.
- PCA9685 Servo Kontroller
- Step-Down Konverter
- L298N H-Brücke bzw. Motor Treiber
- I2C Level Shifter
- Raspberry Pi 3 Model B
- Zwei Getriebemotoren
- Female to female Kabel
- Kabel Y-Litze
Software PCA9685
Alle Programme die Du benötigst um die Getriebemotoren anzusteuern sind in Python geschrieben. Als erstes musst Du den I2C Bus an Deinem Raspberry Pi aktivieren und die Adafruit PCA9685 Bibliothek installieren.
Adafruit PCA9685 Bibliothek
Um die Adafruit Bibliothek für den PCA9685 Servo Kontroller zu installieren kannst Du die Adafruit GitHub Seite besuchen oder die nachfolgenden Befehle einem nach dem anderen ausführen im Terminal Fenster Deines Raspberry Pi. Ich habe auf Raspbian Jessie als Betriebssystem gesetzt.
Adafruit GitHub URL: https://github.com/adafruit/Adafruit_Python_PCA9685
Befehle für die Isntallation der Adafruit Bibliothek:
Befehl: sudo apt-get install git build-essential python-dev
Befehl: cd ~
Befehl: git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
Befehl: cd Adafruit_Python_PCA9685
Befehl: sudo python setup.py install
Nach der Installation der Bibliothek und nach dem alle Kabel verbunden wurden kannst Du überprüfen ob der Servo Kontroller am I2C Bus zu finden ist. Führe dazu den folgenen Befehl aus und Du solltest den Kontroller mit der initialen Adresse 40 sehen.
Befehl: sudo i2cdetect -y 1
Das folgende Bild zeigt das Ergebnis der Suche auf dem I2C Bus.
Jetzt kannst Du die beiden Python Programme herunter laden die ich geschrieben habe für die Ansteuerung der beiden Getriebemotoren über die H-Brücke zusammen mit dem PCA9685 Servo Kontroller.
Mit dem “RobotControlPCA9685.py” Programm kannst Du die Geschwindigkeit und Drehrichtung der beiden Motoren über die Konsole steuern. Dazu verwendest Du wie im Menü des Programmes beschrieben das Key Board. Das Programm wird im Terminal Fenster ausgeführt
Download: Robot Control PCA9685 Python program
Das Python Modul “L298NHBridgePCA9685.py“ kapselt die Logik wie der Adafruit Servo Kontroller mit der L298N H-Brücke sprechen muss damit sich die Motoren drehen. Das Modul wird durch das Programm “RobotControlPCA9685.py” importier und stellt so seine Funktionen bereit..
Download: L298N H-Bridge PCA9685 Python module
Meine Programme sind auch auf GitHub unter der folgenden URL verfügbar: https://github.com/custom-build-robots
Das folgende Bild zeigt den Versuchsaufbau aus einer anderen Perspektive.
Video
Das Video zeigt, wie sich die beiden Motoren drehen.
Zusammenfassung
Dieses Setup arbeitet perfekt vor allem für komplexe Roboter wie meinem Big Rob Raspberry Pi Roboter. Mit dem sehr genauen PWM Signal des PCA9685 Servo Kontroller kann ich jetzt meine Getriebemotoren sehr präzise steuern. Dieses Setup ist aus sehr kostengünstigen Komponenten aufgebaut, die es ermöglichen über die I2C Schnittstelle Getriebemotoren anzusteuern.
Übersicht der PCA9685 Servo Kontroller Anleitungen:
16-Kanal PCA9685 Servo Kontroller - Teil 1 Einführung und Aufbau16-Kanal PCA9685 Servo Kontroller - Teil 2 Software Installation und Test
16-Kanal PCA9685 Servo Kontroller - Teil 3 Ansteuerung einer L298N H-Brücke
16-Kanal PCA9685 Servo Kontroller - Teil 4 Ansteuerung eines LED Bandes mit Dimm-Funktion
16-Kanal PCA9685 Servo Kontroller - Spezial: Raspberry Pi elektronischer Modellbau Fahrtenregler
Hallo,
Super Anleitung aber funktioniert das auch mit den zwei Semiconductor BTS7960B Motortreiber vom Big Rob ?
Und könnten sie mal eine Anleitung zur Servo steuerung machen um eine Kamera mit Servo zu bewegen und zu fixieren 🙂
Hallo Morten,
generell sollte es möglich sein mit dem PCA9685 auch die BTS7960B Motortreiber zu steuern. Das Programm dazu habe ich schon geschrieben konnte es aber noch nicht testen. Das werde ich wohl am 16. / 17. Juni machen.
Den Programmcode für das Programm findet sich aber schon in seiner aktuellen Version hier:
ALPHA version – Motor Driver BTS7960B and PCA9685
Die Anleitung für die Ansteuerung von zwei Servo-Motoren hatte ich schon geschreiben und online gestellt. Du findest diese hier:
16-Kanal PCA9685 Servo Kontroller – Teil 2 Software Installation und Test
Viele Grüße,
Maker
Hallo,
bisher hatte ich mit Ihrem Buch ‚Roboter-Autos mit dem Raspberry Pi‘ viel Erfolg verbuchen können, alles auf Basis von raspbian-buster.
Auf Basis von raspios-bullseye gibt es leider Probleme mit dem I2C-Bus und dem PCA9685:
Traceback (most recent call last):
File „/home/pi/Scripts/RobiCar/robi_12+.py“, line 25, in
pwm = Adafruit_PCA9685.PCA9685()
File „/usr/local/lib/python3.9/dist-packages/Adafruit_PCA9685-1.0.1-py3.9.egg/Adafruit_PCA9685/PCA9685.py“, line 74, in __init__
self._device = i2c.get_i2c_device(address, **kwargs)
File „/usr/local/lib/python3.9/dist-packages/Adafruit_GPIO-1.0.4-py3.9.egg/Adafruit_GPIO/I2C.py“, line 65, in get_i2c_device
busnum = get_default_bus()
File „/usr/local/lib/python3.9/dist-packages/Adafruit_GPIO-1.0.4-py3.9.egg/Adafruit_GPIO/I2C.py“, line 57, in get_default_bus
raise RuntimeError(‚Could not determine default I2C bus for platform.‘)
RuntimeError: Could not determine default I2C bus for platform.
Gibt es irgendeinen Lösungshinweis für mein Problem?
Vielen Dank im voraus!
Willem Ofhuus