Dieses Tutorial ist Teil von: Ansteuerung von 16 oder 32 Servomotoren mit PCA9685
Diese Sammlung von Tutorials mit Videos hilft Ihnen, 32 oder mehr Servomotoren mit Arduino UNO, Nano, Mini oder ESP32 zu steuern. Alle Codes sind enthalten.
Steuerung eines 32 Servo-Motors mit einem PCA9685-Modul und einem ESP32 V4
In diesem Tutorial lernen Sie, wie Sie bis zu 32 Servomotoren mit einem ESP32-Mikrocontroller steuern, der mit einem PCA9685-Modul verbunden ist. Dies ist besonders nützlich für Projekte, die mehrere Servomotoren gleichzeitig ohne die Verwendung von Wi-Fi betreiben müssen. Das Ergebnis wird eine voll funktionsfähige Einrichtung sein, bei der Sie die Position jedes Servomotors individuell manipulieren können.

Dieses Tutorial führt Sie durch die erforderlichen Hardwarekomponenten, die Verkabelungsanweisungen und einen Überblick über den Code, der für die Umsetzung dieser Steuerung erforderlich ist. Für eine detaillierte Demonstration empfehlen wir, das zugehörige Video anzusehen (im Video bei 00:00).
Hardware erklärt
Die primären Komponenten, die in diesem Projekt verwendet werden, sind der ESP32-Mikrocontroller und das PCA9685-PWM-Treiber-Modul. Der ESP32 fungiert als Hauptsteuerung, die Signale an das PCA9685-Modul sendet, das wiederum die Servomotoren steuert. Das PCA9685 kann bis zu 16 Servomotoren pro Modul steuern, was die Verbindung von zwei Modulen ermöglicht, um insgesamt 32 Servos zu steuern.
Das PCA9685-Modul arbeitet mit I2C-Kommunikation, was bedeutet, dass es zwei Hauptleitungen für den Datentransfer hat: SDA (Datenleitung) und SCL (Taktsignal). Es benötigt auch eine Stromversorgung, um die Servos zu betreiben, typischerweise mit 5V. Der ESP32 fungiert als Master-Gerät und liefert die erforderlichen Steuersignale an die Slave-PCA9685-Module.
Technische Datenblatt Details
| Hersteller | Adafruit |
|---|---|
| Teilenummer | PCA9685 |
| Logik/I/O Spannung | 3,3 V bis 5,5 V |
| Versorgungsspannung | 5 V |
| Ausgangsstrom (pro Kanal) | ~20 mA |
| Spitzenstrom (pro Kanal) | ~25 mA |
| PWM-Frequenzrichtlinien | 60 Hz |
| Eingangslogikschwellen | 0,3*VDD(niedrig), 0,7*VDD(hoc) |
| Spannungsabfall / RDS(on)/ Sättigung | 0,5 V max |
| Thermische Grenzen | 125 °C |
| Paket | HTSSOP-28 |
| Hinweise / Varianten | 16-Kanal PWM-Controller |
- Verwenden Sie ein externes Netzteil für Servos (5V, 2A empfohlen).
- Stellen Sie eine ordnungsgemäße Erdung zwischen ESP32 und PCA9685 sicher.
- Überprüfen Sie die PWM-Frequenzeinstellungen für eine optimale Servoleistung.
- Passen Sie die Pulsbreitenbegrenzungen basierend auf den Servospezifikationen an.
- Seien Sie vorsichtig bei der Stromaufnahme, wenn mehrere Servos aktiv sind.
Verdrahtungsanweisungen

Um den PCA9685 mit dem ESP32 zu verbinden, beginnen Sie mit dem Anschluss von Stromversorgung und Masse. Schließen Sie das VCCSchließen Sie den Pin am PCA9685 an eine 5V-Stromquelle an und verbinden Sie den GND-Pin mit einem der GND-Pins am ESP32. Dies stellt sicher, dass sowohl das Modul als auch der ESP32 eine gemeinsame Masse haben.
Als nächstes verbinden Sie für die I2C-Kommunikation den SDA-Pin des PCA9685 mit GPIO 21 des ESP32 und den SCL-Pin mit GPIO 22. Diese Konfiguration ermöglicht es dem ESP32, ordnungsgemäß mit dem PCA9685-Modul zu kommunizieren. Achten Sie darauf, kurze Kabel zu verwenden, um Störungen in den Kommunikationsleitungen zu vermeiden, insbesondere wenn Sie mit mehreren Servos arbeiten.
Wie im obigen Bild gezeigt, stellen Sie für das PCA9685-Board 2 (links) sicher, dass Sie diesen Pfad verlöten, um die I2C-Adresse festzulegen, damit sie sich von Board 1 (rechts) unterscheidet.
Codebeispiele und Schritt-für-Schritt-Anleitung
Der Code initialisiert die PCA9685-Module und setzt die PWM-Frequenz. Die wichtigsten Identifikatoren im Code umfassenboard1undboard2, die die beiden an den ESP32 angeschlossenen PCA9685-Module repräsentieren. Diesetup()Die Funktion initialisiert den seriellen Monitor und setzt die PWM-Frequenz für beide Boards.
void setup() {
Serial.begin(9600);
Serial.println("32 channel Servo test!");
board1.begin();
board2.begin();
board1.setPWMFreq(60); // Analog servos run at ~60 Hz updates
board2.setPWMFreq(60);
}Dieser Auszug zeigt den Einrichtungsprozess, bei dem die serielle Kommunikation initialisiert und die PWM-Frequenz für die Servoantriebe eingestellt wird. DersetPWMFreq(60)Funktion stellt sicher, dass die Servos die richtige Frequenz für einen reibungslosen Betrieb erhalten.
In der Schleife durchläuft eine for-Schleife Winkel von 0 bis 180 Grad und sendet Pulsweitenbefehle an die Servos, die an beide PCA9685-Boards angeschlossen sind. Die FunktionangleToPulsewandelt den Winkel in die entsprechende Pulsbreite um.
void loop() {
for(int angle = 0; angle < 181; angle += 10) {
for(int i = 0; i < 16; i++) {
board2.setPWM(i, 0, angleToPulse(angle));
board1.setPWM(i, 0, angleToPulse(angle));
}
}
delay(100);
}Dieser Codeausschnitt zeigt, wie die Servos in einer Schleife gesteuert werden. Der Servo-Winkel steigt um 10 Grad, und diesetPWMDie Funktion wird für beide Platinen aufgerufen, um die Servos auf den angegebenen Winkel zu bewegen. Die Verzögerung ermöglicht eine kurze Pause zwischen den Bewegungen.
Demonstration / Was zu erwarten ist
Nachdem Sie das Verdrahten abgeschlossen und den Code hochgeladen haben, sollten Sie sehen, dass sich die Servos in Schritten von 0 bis 180 Grad bewegen. Dies wird gleichzeitig für alle 32 Servos geschehen, die mit den beiden PCA9685-Modulen verbunden sind. Wenn ein Servo nicht reagiert, überprüfen Sie die Stromversorgung und stellen Sie sicher, dass alle Verbindungen sicher sind (im Video um 12:30).
Video-Zeitstempel
- 00:00 Start
- 00:36 Einführung
- 04:01 Verdrahtung Erklärt (nur ESP32)
- 06:26 Vorbereitung der Arduino IDE für ESP32
- 08:34 Code erklärt
- 13:40 Demonstration des Betriebs von 32 Servomotoren
Dieses Tutorial ist Teil von: Ansteuerung von 16 oder 32 Servomotoren mit PCA9685
- Arduino-Code und Video für PCA9685 16-Kanal 12-Bit Servo-Controller V1
- Steuere 16 Servomotoren mit einem PCA9685-Modul und Arduino V2 Sketch #1: Eins nach dem anderen
- Steuerung von 16 Servomotoren mit einem PCA9685-Modul und Arduino V2-Sketch: Individuelle Servosteuerung
- Controlling 16 Servo Motors Using a PCA9685 Module and Arduino V2 Sketch #3: All Servos Together
- Steuerung eines 32 Servo Motors mit einem PCA9685 Modul und Arduino V3 Sketch #1: Alle Servos zusammen
- Steuere 32 Servos über Wi-Fi mit ESP32 und PCA9685 über Desktop oder Mobiltelefon V5
/*
* Original library source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
*
* This is the Arduino code PCA6985 16 channel servo controller
* to control 32 Servo Motors with ESP32 board without WiFi
get this code and wiring from for this video: http://robojax.com/RJT268
*
* This is V4 Video on PCA9685: https://youtu.be/JFdXB8Za5Os
*
* watch the video for details (V1) and demo http://youtu.be/y8X9X10Tn1k
*
* Written/updated by Ahmad Shamshiri for Robojax Video channel www.Robojax.com
* Date: Dec 15, 2019, in Ajax, Ontario, Canada
* Disclaimer: this code is "AS IS" and for educational purpose only.
or make donation using PayPal http://robojax.com/L/?id=64
* * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
// Depending on your servo make, the pulse width min and max may vary, you
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
// Watch video V1 to understand the two lines below: http://youtu.be/y8X9X10Tn1k
#define SERVOMIN 125 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 575 // this is the 'maximum' pulse length count (out of 4096)
int servoNumber = 0;
void setup() {
Serial.begin(9600);
Serial.println("32 channel Servo test!");
board1.begin();
board2.begin();
board1.setPWMFreq(60); // Analog servos run at ~60 Hz updates
board2.setPWMFreq(60);
//yield();
}
// the code inside loop() has been updated by Robojax
void loop() {
for( int angle =0; angle<181; angle +=10){
for(int i=0; i<16; i++)
{
board2.setPWM(i, 0, angleToPulse(angle) );
board1.setPWM(i, 0, angleToPulse(angle) );
}
}
// robojax PCA9865 16 channel Servo control
delay(100);
}
/*
* angleToPulse(int ang)
* gets angle in degree and returns the pulse width
* also prints the value on seial monitor
* written by Ahmad Shamshiri for Robojax, Robojax.com
*/
int angleToPulse(int ang){
int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);// map angle of 0 to 180 to Servo min and Servo max
Serial.print("Angle: ");Serial.print(ang);
Serial.print(" pulse: ");Serial.println(pulse);
return pulse;
}
Dinge, die Sie vielleicht brauchen
-
AmazonKaufe PCA9685 bei Amazonamzn.to
-
eBayPCA9685 bei eBay kaufenebay.us
-
AliExpressPCA9685 bei AliExpress kaufens.click.aliexpress.com
-
BanggoodKaufen Sie PCA9685 bei Bangoodbanggood.com
Ressourcen & Referenzen
Noch keine Ressourcen vorhanden.
Dateien📁
Arduino-Bibliotheken (zip)
-
Adafruit-PWM-Servo-Treiber-Bibliothek-master
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB