Dieses Tutorial ist Teil von: Servomotoren
Hier finden Sie alle relevanten Videos zum Thema Servomotoren. Links zu weiteren Videos finden Sie unter diesem Artikel.
Arduino-Code und Video für PCA9685 16-Kanal 12-Bit Servo-Controller V1
In diesem Tutorial werden wir untersuchen, wie man den PCA9685 16-Kanal 12-Bit Servo-Controller von NXP Semiconductor verwendet. Dieses Modul ermöglicht es Ihnen, bis zu 16 Servos zu steuern oder eine LED-Bank präzise mittels Pulsweitenmodulation (PWM) zu dimmen. Am Ende dieses Tutorials haben Sie einen funktionierenden Aufbau, der mehrere Servos einzeln oder gleichzeitig steuern kann.

Um den Tutorialinhalt weiter zu verdeutlichen, empfehle ich Ihnen, das begleitende Video (im Video bei 00:00) anzusehen, das den Aufbau und den Codierprozess visuell demonstriert.
Hardware erklärt
Das PCA9685-Modul ist ein kompaktes Board, das mehrere Servos über I2C-Kommunikation steuern kann. Es verfügt über 16 Kanäle, wodurch Sie bis zu 16 Servos anschließen können, jeweils mit eigenem Steuersignal. Das Modul arbeitet mit einer 5 V Versorgungsspannung und ist dafür ausgelegt, PWM-Signale zu verarbeiten, die für die genaue Positionssteuerung von Servos unerlässlich sind.
Das Board verfügt über spezielle Pins für die Versorgung (VCC), Masse (GND) und die Kommunikation (SDA und SCL). Der SDA-Pin wird für die Datenübertragung verwendet, während der SCL-Pin das Taktsignal ist; beide sind jeweils mit den analogen Pins A4 bzw. A5 des Arduino verbunden. Diese Konfiguration gewährleistet eine zuverlässige Kommunikation zwischen dem Arduino und dem PCA9685-Modul.
Datenblattdetails
| Hersteller | NXP Halbleiter |
|---|---|
| Teilenummer | PCA9685 |
| Logik-/I/O-Spannung | 3,3 V bis 5,5 V |
| Versorgungsspannung | 2,3 V bis 5,5 V |
| Ausgangsstrom (pro Kanal) | max. 25 mA |
| Spitzenstrom (pro Kanal) | 100 mA max. |
| Hinweise zur PWM-Frequenz | 24 Hz bis 1,6 kHz |
| Schwellenwerte der Eingangslogik | 0,3 V (niedrig) / 0,7 V (hoch) |
| Spannungsabfall / RDS(on) / Sättigung | 0,5 V max. |
| Thermische Grenzwerte | -40 °C bis 125 °C |
| Paket | HTSSOP-28 |
| Notizen / Varianten | 16-Kanal-PWM-Controller |
- Sorgen Sie für eine 5-V-Stromversorgung mit ausreichendem Strom (1 A empfohlen).
- Versorgen Sie die Servos nicht direkt vom Arduino mit Strom, um Schäden zu vermeiden.
- Verwenden Sie die richtigen I2C-Pins: SDA an A4 und SCL an A5.
- Passen Sie die Pulsbreitenwerte entsprechend Ihren spezifischen Servos an.
- Überprüfen Sie die Verkabelung auf korrekte Polarität: GND, VCC und Signal.
- Berücksichtigen Sie Wärmeableitung für Hochstromanwendungen.
Verdrahtungsanleitung

Um den PCA9685 an Ihren Arduino anzuschließen, beginnen Sie damit, die Stromversorgung und die Masse zu verbinden. Verbinden Sie den VCC-Pin des PCA9685 mit dem 5V-Ausgang Ihres Arduino. Dann verbinden Sie den GND-Pin des PCA9685 mit dem GND Ihres Arduino. Verbinden Sie anschließend den SDA-Pin des PCA9685 mit Pin A4 Ihres Arduino und den SCL-Pin mit Pin A5.
Verbinden Sie für die Servos das Signalkabel mit dem entsprechenden Kanal am PCA9685 (z. B. CH0 für den ersten Servo), das Versorgungskabel mit einer separaten Stromversorgung (da die Servos möglicherweise mehr Strom benötigen, als der Arduino liefern kann) und das Massekabel mit der gemeinsamen Masse des PCA9685. Achten Sie darauf, dass Signal-, Versorgungs- und Massekabel korrekt angeschlossen sind, um Schäden an Ihren Komponenten zu vermeiden.
Codebeispiele und Schritt-für-Schritt-Anleitung
Im Setup-Abschnitt des Codes initialisieren wir das PCA9685-Modul mitpwm.begin()und die PWM-Frequenz mitpwm.setPWMFreq(60);. Dies legt die Kommunikationsfrequenz für die Servos fest.
void setup() {
Serial.begin(9600);
Serial.println("16 channel Servo test!");
pwm.begin();
pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates
}Innerhalb der Schleife steuern wir die Servos, indem wir die PWM-Werte setzen, die den gewünschten Winkeln entsprechen. Die FunktionangleToPulse(int ang)weist den Winkel der entsprechenden Pulsbreite zu, was für eine präzise Servopositionierung unerlässlich ist.
void loop() {
for( int angle =0; angle<181; angle +=20){
delay(500);
pwm.setPWM(0, 0, angleToPulse(angle) );
}
}Schließlich, die FunktionangleToPulse(int ang)Wandelt den Winkel in eine Pulsbreite um, wobei die definierten minimalen und maximalen Pulsdauern verwendet werden. Dadurch können Sie die Position des Servos anhand des gewünschten Winkels einfach steuern.
int angleToPulse(int ang){
int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);
Serial.print("Angle: ");Serial.print(ang);
Serial.print(" pulse: ");Serial.println(pulse);
return pulse;
}Demonstration / Was Sie erwartet
Sobald alles korrekt verkabelt ist und der Code hochgeladen wurde, sollten Sie sehen, dass sich der Servo in 20-Grad-Schritten durch die angegebenen Winkel bewegt. Wenn sich der Servo nicht wie erwartet verhält, prüfen Sie die Verkabelung auf korrekte Anschlüsse und stellen Sie sicher, dass die Stromversorgung ausreichend ist (im Video bei 12:30).
Video-Zeitmarken
- 00:00- Einführung in den PCA9685
- 02:30- Verdrahtungsanleitung
- 05:00- Code-Durchsprache
- 10:15- Demonstration der Servosteuerung
- 12:30- Fehlerbehebung bei häufigen Problemen
Dieses Tutorial ist Teil von: Servomotoren
- Einen Servo mit Drucktastern mit einem Arduino steuern
- Control a Servo Motor with a Push Button: Move Servo and Return SPB-1
- Control a Servo Motor with a Push Button: Move Servo in One Direction SPB-2
- Controlling a Servo Motor with a Push Button: Move Servo While Button Is Pressed (SPB-3)
- Einen Servo mit einem Potentiometer und einem Arduino steuern
- Einen Servo mit Potentiometer und LCD1602 mit Arduino steuern
- Steuerung von Servomotoren mit einer Infrarotfernbedienung und Arduino
- Arduino Servomotorsteuerung mit einem Potentiometer
- Steuerung der Servoposition mit Handgesten für Arduino
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- How to Use Continuous 360° Servo with Arduino
- Build an Arduino Servo Toggle Switch with a Push Button
/*
* Original source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
* This is the Arduino code for the PCA9685 16-channel servo controller.
* Watch the video for details and demo: http://youtu.be/y8X9X10Tn1k
* get code and wiring diagram from http://robojax.com/RTJ27
* Watch the video for this code:
*
* Related Videos:
V5 video of PCA9685 32 Servo with ESP32 with WiFi: https://youtu.be/bvqfv-FrrLM
V4 video of PCA9685 32 Servo with ESP32 (no WiFi): https://youtu.be/JFdXB8Za5Os
V3 video of PCA9685: how to control 32 servo motors: https://youtu.be/6P21wG7N6t4
V2 Video of PCA9685: 3 different ways to control servo motors: https://youtu.be/bal2STaoQ1M
V1 Video introduction to PCA9685 to control 16 servos: https://youtu.be/y8X9X10Tn1k
* Written by Ahmad Shamshiri for Robojax Video channel: www.Robojax.com
* Date: December 16, 2017, in Ajax, Ontario, Canada
* Permission granted to share this code, given that this
* note is kept with the code.
* Disclaimer: This code is "AS IS" and for educational purposes only.
* This code has been downloaded from https://robojax.com
*
*/
/***************************************************
This is an example for our Adafruit 16-channel PWM & Servo driver.
Servo test - this will drive 16 servos, one after the other.
Pick one up today in the Adafruit shop!
------> http://www.adafruit.com/products/815
These displays use I2C to communicate; 2 pins are required to
interface. For Arduino UNOs, that's SCL -> Analog 5, SDA -> Analog 4.
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution.
****************************************************/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = 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!
#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)
// our servo # counter
uint8_t servonum = 0;
void setup() {
Serial.begin(9600);
Serial.println("16 channel Servo test!");
pwm.begin();
pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates
//yield();
}
// the code inside loop() has been updated by Robojax
void loop() {
for( int angle =0; angle<181; angle +=20){
delay(500);
pwm.setPWM(0, 0, angleToPulse(angle) );
}
delay(1000);
}
/*
* angleToPulse(int ang)
* gets angle in degrees and returns the pulse width.
* Also prints the value on the serial 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;
}
/*
* Originalquelle: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
* Dies ist der Arduino-Code für den PCA9685 16-Kanal Servo-Controller.
* Siehe das Video für Details und eine Demo: http://youtu.be/y8X9X10Tn1k
*
* Geschrieben von Ahmad Nejrabi für den Robojax Video-Kanal: www.Robojax.com
* Datum: 15. Dezember 2017, in Ajax, Ontario, Kanada
* Erlaubnis zur Weitergabe dieses Codes, sofern diese
* Notiz mit dem Code beibehalten wird.
* Haftungsausschluss: Dieser Code ist "WIE ER IST" und nur zu Bildungszwecken.
*
* /
* /***************************************************
* Dies ist ein Beispiel für unseren Adafruit 16-Kanal PWM & Servo-Treiber.
* Servo-Test - dies steuert 16 Servos, einer nach dem anderen.
*
* Holen Sie sich heute einen im Adafruit-Shop!
* ------> http://www.adafruit.com/products/815
*
* Diese Displays verwenden I2C zur Kommunikation; 2 Pins sind erforderlich, um
* zu interagieren. Für Arduino UNOs ist das SCL -> Analog 5, SDA -> Analog 4.
*
* Adafruit investiert Zeit und Ressourcen in die Bereitstellung dieses Open-Source-Codes,
* bitte unterstützen Sie Adafruit und Open-Source-Hardware, indem Sie
* Produkte von Adafruit kaufen!
*
* Geschrieben von Limor Fried/Ladyada für Adafruit Industries.
* BSD-Lizenz, sämtlicher obiger Text muss in jeglicher Redistribution enthalten sein.
*/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// so genannt, verwendet es die Standardadresse 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// Sie können es auch mit einer anderen Adresse anrufen, die Sie möchten.
// Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
// Je nach Servo-Modell können die minimalen und maximalen Pulsbreiten variieren; Sie
// möchte, dass diese so klein/groß wie möglich sind, ohne den harten Stopp zu erreichen
// für maximale Reichweite. Sie müssen diese gegebenenfalls anpassen, um mit den Servos übereinzustimmen, die Sie
// haben!
#define SERVOMIN 125 // dies ist die 'minimale' Pulslängenanzahl (von 4096)
#define SERVOMAX 575 // dies ist die 'maximale' Pulsverlängerungsanzahl (von 4096)
// unser Servo # Zähler
uint8_t servonum = 0;
void setup() {
Serial.begin(9600);
Serial.println("16 channel Servo test!");
pwm.begin();
pwm.setPWMFreq(60); // Analoge Servos laufen bei ~60 Hz Aktualisierungen
// yield();
}
// Der Code innerhalb von loop() wurde von Robojax aktualisiert.
void loop() {
pwm.setPWM(0, 0, 125 );
delay(500);
pwm.setPWM(0, 0, 255 );
delay(500);
pwm.setPWM(0, 0, 450 );
delay(500);
pwm.setPWM(0, 0, 575 );
delay(500);
}
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