Questo tutorial è parte di: Controllo di 16 o 32 servomotori con PCA9685
Questa raccolta di tutorial con video ti aiuta a controllare 32 o più servomotori utilizzando Arduino UNO, Nano, Mini o ESP32. Tutti i codici sono forniti.
Controllare un servomotore da 32 utilizzando un modulo PCA9685 e un ESP32 V4
In questo tutorial imparerai a controllare fino a 32 servomotori utilizzando un microcontrollore ESP32 collegato a un modulo PCA9685. Questo è particolarmente utile per progetti che richiedono il funzionamento simultaneo di più servomotori senza l'uso del Wi-Fi. Il risultato sarà un'impostazione completamente funzionante in cui puoi manipolare la posizione di ciascun servomotore singolarmente.

Questo tutorial ti guiderà attraverso i componenti hardware necessari, le istruzioni di cablaggio e una panoramica del codice richiesto per raggiungere questo controllo. Per una dimostrazione dettagliata, prendi in considerazione di guardare il video associato a (nel video alle 00:00).
Hardware spiegato
I componenti principali utilizzati in questo progetto sono il microcontrollore ESP32 e il modulo driver PWM PCA9685. L'ESP32 funge da controller principale che invia segnali al modulo PCA9685, che a sua volta controlla i servomotori. Il PCA9685 può gestire fino a 16 servomotori per modulo, consentendo la connessione di due moduli per controllare un totale di 32 servomotori.
Il modulo PCA9685 opera utilizzando la comunicazione I2C, il che significa che ha due fili principali per il trasferimento dei dati: SDA (linea dei dati) e SCL (linea di clock). Richiede anche un'alimentazione per far funzionare i servomotori, tipicamente a 5V. L'ESP32 funge da dispositivo master, fornendo i segnali di controllo necessari ai moduli slave PCA9685.
Dettagli della scheda tecnica
| Produttore | Adafruit |
|---|---|
| Numero di parte | PCA9685 |
| Tensione di logica/IO | 3,3 V a 5,5 V |
| Tensione di alimentazione | 5 V |
| Corrente di uscita (per canale) | ~20 mA |
| Corrente di picco (per canale) | ~25 mA |
| Indicazioni sulla frequenza PWM | 60 Hz |
| Soglie di logica di ingresso | 0,3*VDD(basso), 0,7*VDD(alta) |
| Caduta di tensione / RDS(on)/ saturazione | 0,5 V max |
| Limiti termici | 125 °C |
| Pacchetto | HTSSOP-28 |
| Annotazioni / varianti | Controller PWM a 16 canali |
- Usa un'alimentazione esterna per i servomotori (5V, 2A consigliati).
- Assicurati di avere una corretta messa a terra tra ESP32 e PCA9685.
- Controlla le impostazioni della frequenza PWM per prestazioni ottimali del servo.
- Regolare i limiti della larghezza dell'impulso in base alle specifiche del servo.
- Fai attenzione al consumo di corrente quando più servomotori sono attivi.
Istruzioni di cablaggio

Per collegare il PCA9685 all'ESP32, inizia collegando l'alimentazione e la massa. Collega il VCCcollegare il pin del PCA9685 a una fonte di alimentazione da 5V e collegare il pin GND a uno dei pin GND dell'ESP32. Questo garantisce che sia il modulo che l'ESP32 condividano un comune riferimento di massa.
Successivamente, per la comunicazione I2C, collegare il pin SDA del PCA9685 al GPIO 21 dell'ESP32 e il pin SCL al GPIO 22. Questa configurazione consente all'ESP32 di comunicare correttamente con il modulo PCA9685. Assicurati di utilizzare cavi corti per evitare rumori nelle linee di comunicazione, specialmente se stai lavorando con più servo.
Come mostrato nell'immagine sopra, per la scheda PCA9685 2 (a sinistra), assicurati di saldare quel percorso per impostare l'indirizzo I2C in modo che sia diverso dalla scheda 1 (a destra).
Esempi di Codice e Guida Passo Passo
Il codice inizializza i moduli PCA9685 e imposta la frequenza PWM. I principali identificatori nel codice includonoboard1eboard2, che rappresentano i due moduli PCA9685 collegati all'ESP32. Ilsetup()La funzione inizializza il monitor seriale e imposta la frequenza PWM per entrambe le schede.
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);
}Questo estratto mostra il processo di configurazione, in cui viene inizializzata la comunicazione seriale e impostata la frequenza PWM per i driver dei servo. IlsetPWMFreq(60)la funzione garantisce che i servo ricevano la frequenza corretta per un funzionamento fluido.
Nel ciclo, un ciclo for itera attraverso angoli da 0 a 180 gradi, inviando comandi di larghezza d'impulso ai servomotori collegati a entrambe le schede PCA9685. La funzioneangleToPulseconverte l'angolo nella corrispondente larghezza dell'impulso.
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);
}Questo estratto di codice dimostra come i servomotori siano controllati in un ciclo. L'angolo del servomotore aumenta di 10 gradi, e ilsetPWMla funzione viene chiamata per entrambe le schede per muovere i servomotori all'angolo specificato. Il ritardo consente una breve pausa tra i movimenti.
Dimostrazione / Cosa Aspettarsi
Una volta completato il cablaggio e il caricamento del codice, dovresti vedere i servomotori muoversi in incrementi da 0 a 180 gradi. Questo accadrà per tutti i 32 servomotori collegati ai due moduli PCA9685 contemporaneamente. Se un servomotore non risponde, controlla l'alimentazione e assicurati che tutte le connessioni siano sicure (nel video alle 12:30).
Timestamp video
- 00:00 Inizio
- 00:36 Introduzione
- 04:01 Cablaggio spiegato (solo ESP32)
- 06:26 Preparazione dell'IDE Arduino per ESP32
- 08:34 Codice Spiegato
- 13:40 Dimostrazione del funzionamento di 32 motori servo
Questo tutorial è parte di: Controllo di 16 o 32 servomotori con PCA9685
- Codice Arduino e video per il controller per servomotori PCA9685 a 16 canali e 12 bit V1
- Controlla 16 Motori Servo utilizzando un modulo PCA9685 e sketch Arduino V2 #1: Uno per uno
- Controllo di 16 servomotori utilizzando un modulo PCA9685 e uno sketch Arduino V2: Controllo individuale dei servomotori
- Controlling 16 Servo Motors Using a PCA9685 Module and Arduino V2 Sketch #3: All Servos Together
- Controllare un motore servo da 32 utilizzando un modulo PCA9685 e uno sketch Arduino V3 #1: Tutti i servomotori insieme
- Controlla 32 servomotori tramite Wi-Fi utilizzando ESP32 e PCA9685 tramite desktop o telefono cellulare 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;
}
Cose di cui potresti avere bisogno
-
AmazonAcquista PCA9685 da Amazonamzn.to
-
eBayAcquista PCA9685 su eBayebay.us
-
AliExpressAcquista PCA9685 da AliExpresss.click.aliexpress.com
-
BanggoodAcquista PCA9685 da Bangoodbanggood.com
Risorse e riferimenti
Nessuna risorsa ancora.
File📁
Librerie Arduino (zip)
-
Adafruit-PWM-Servo-Driver-Library-master
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB