Servo-Durchlauf
Was dieses Beispiel zeigt
Ansteuerung eines Hobby-Servos anhand des Winkels statt anhand von Roh-Ticks und Hin- und Herbewegen des Servos über seinen konfigurierten Bereich. Dies ist der wichtigste von der Platine beworbene Anwendungsfall.
Der Beispielcode
#include "PCA9685-SOLDERED.h"
PCA9685 pwm;
void setup()
{
pwm.begin(); // sets 50Hz PWM frequency by default, suitable for hobby servos
// Adjust to match your servo's datasheet if it doesn't reach full range
pwm.setServoPulseRange(500, 2500); // microseconds
pwm.setServoAngleRange(0, 180); // degrees
}
void loop()
{
for (int angle = 0; angle <= 180; angle += 1)
{
pwm.setServoAngle(0, angle);
delay(15);
}
for (int angle = 180; angle >= 0; angle -= 1)
{
pwm.setServoAngle(0, angle);
delay(15);
}
}
Erwartetes Ergebnis:
Keine serielle Ausgabe. Ein an Kanal 0 angeschlossener Hobby-Servomotor bewegt sich von 0 bis 180 Grad und zurück, wobei jede Richtung knapp unter 3 Sekunden dauert, und wiederholt diesen Vorgang anschließend.
Verwendete Funktionen
PCA9685(uint8_t _address = PCA9685_DEFAULT_ADDRESS)returns NoneNativer Konstruktor. Die I2C-Adresse der Platine wird über die Lötbrücken JP1–JP6 festgelegt. Geben Sie daher die Adresse an, die der Konfiguration Ihrer Platine entspricht, oder belassen Sie den Standardwert.
ReturnsKonstruktor; kein Rückgabewert.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | _address | I2C-Adresse der Platine. Standardwert ist PCA9685_DEFAULT_ADDRESS (0x40). |
begin()returns voidInitialisiert den PCA9685 über I2C und legt die Standard-PWM-Frequenz von 50 Hz fest, wie sie von Hobby-Servos erwartet wird. Rufe diese Funktion einmal in der Funktion setup() auf.
ReturnsNichts.
Parameter
Diese Funktion benötigt keine Parameter.
setServoPulseRange(uint16_t minPulseUs, uint16_t maxPulseUs)returns voidKonfiguriert die Impulsbreite in Mikrosekunden, die setServoAngle() dem minimalen und maximalen Winkel zuordnet. Passen Sie diesen Wert an das Datenblatt Ihres Servos an, falls dieses bei der Standardeinstellung der Bibliothek nicht seinen vollen mechanischen Bereich erreicht.
ReturnsNichts.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
uint16_t | minPulseUs | Impulsbreite in Mikrosekunden, zugeordnet zum Mindestwinkel. Standardwert der Bibliothek: 500 us. |
uint16_t | maxPulseUs | Impulsbreite in Mikrosekunden, die dem maximalen Winkel zugeordnet ist. Bibliotheksstandard: 2500 us. |
setServoAngleRange(float minAngle, float maxAngle)returns voidKonfiguriert den von setServoAngle() akzeptierten Winkelbereich in Grad.
ReturnsNichts.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
float | minAngle | Winkel in Grad, der auf minPulseUs abgebildet wird. Standardwert der Bibliothek: 0. |
float | maxAngle | Winkel in Grad, der auf maxPulseUs abgebildet wird. Bibliotheksstandard: 180. |
setServoAngle(uint8_t channel, float angle)returns voidSteuert ein Hobby-Servo auf dem angegebenen Kanal auf einen Winkel, der auf den konfigurierten Winkelbereich begrenzt ist. Wandelt den Winkel intern in eine Impulsbreite um und ruft setPWM() auf, wobei standardmäßig die von begin() festgelegte Frequenz von 50 Hz zugrunde gelegt wird.
ReturnsNichts.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | channel | Kanalnummer, 0 bis 15. |
float | angle | Winkel in Grad, begrenzt auf den durch setServoAngleRange() festgelegten Bereich. |
Zusammenfassung
setServoPulseRange() und setServoAngleRange() sind einmalige Einrichtungsaufrufe: Führen Sie
sie einmal aus, bevor Sie zum ersten Mal setServoAngle() aufrufen. Danach übernimmt setServoAngle()
die Umrechnung von Winkel in Pulsbreite und ruft setPWM() für Sie auf, sodass Sie niemals
die Tick-Anzahl für ein Servo manuell berechnen müssen.
In der Dokumentation zu setServoAngle() wird davon ausgegangen, dass setPWMFreq(50) gilt – der
Standardwert, den begin() festlegt. Falls inzwischen eine andere Komponente auf demselben Board
setPWMFreq() auf einen anderen Wert gesetzt hat, beispielsweise für eine LED auf einem anderen
Kanal, sollten Sie die Servokanäle bei 50 Hz belassen, anstatt sich auf
setServoAngle() bei einer anderen Frequenz zu verlassen.