Cerca codice

Controllare un servomotore da 32 utilizzando un modulo PCA9685 e un ESP32 V4

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.

PCA9685 module-0

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

ESP32 wiring for PCA99685 for 32 sevo motors

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.

Collegare due schede PCA9685

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).

Modulo PCA9685
Modulo PCA9685

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

Immagini

PCA9685 module-0
PCA9685 module-0
PCA9685 module-2
PCA9685 module-2
PCA9685 module-3
PCA9685 module-3
PCA9685 module
PCA9685 module
Connecting two PCA9685 board
Connecting two PCA9685 board
ESP32 wiring for PCA99685 for 32 sevo motors
ESP32 wiring for PCA99685 for 32 sevo motors
880-new- PCA9685 Video V4, Arduino ESP32 Code : Controlling all 32 servo motor wihtout WiFi
Lingua: C++
/*
 * Biblioteca sorgente originale: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * 
 * Questo è il codice Arduino per il controllore servo PCA9685 a 16 canali
 * per controllare 32 motori servo con scheda ESP32 senza WiFi
 * 
 * ottieni questo codice e il cablaggio per questo video: http://robojax.com/RJT268
 * 
 * Questo è il video V4 su PCA9685: https://youtu.be/JFdXB8Za5Os
 * 
 * guarda il video per i dettagli (V1) e la demo http://youtu.be/y8X9X10Tn1k
 * 
 * Scritto/aggiornato da Ahmad Shamshiri per il canale video Robojax www.Robojax.com
 * Data: 15 dicembre 2019, ad Ajax, Ontario, Canada
 * 
 * Avvertenza: questo codice è "COSÌ COM'È" e solo per scopi educativi.
 * 
 * oppure fai una donazione utilizzando PayPal http://robojax.com/L/?id=64
 * 
 * Questo codice è "COSÌ COM'È" senza garanzia o responsabilità. Libero di essere utilizzato finché mantieni intatta questa nota.*
 * Questo codice è stato scaricato da Robojax.com
 * Questo programma è software libero: puoi ridistribuirlo e/o modificarlo
 * alle condizioni della GNU General Public License come pubblicato dalla
 * Free Software Foundation, sia nella versione 3 della Licenza, sia
 * (a tua scelta) in qualsiasi versione successiva.
 * 
 * Questo programma è distribuito nella speranza che possa essere utile,
 * ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita di
 * COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO. Consulta la
 * GNU General Public License per maggiori dettagli.
 * 
 * Dovresti aver ricevuto una copia della GNU General Public License
 * insieme a questo programma. In caso contrario, vai su <https://www.gnu.org/licenses/>.
 */
#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

 // chiamato in questo modo, utilizza l'indirizzo predefinito 0x40
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);

 // A seconda della marca del tuo servo, la larghezza dell'impulso minimo e massimo può variare, tu
 // voglio che questi siano il più piccoli/grandi possibile senza arrivare al limite massimo
 // per il range massimo. Dovrai modificarli secondo necessità per adattarli ai servomotori che
 // hanno!
 // Guarda il video V1 per comprendere le due righe sottostanti: http://youtu.be/y8X9X10Tn1k
#define SERVOMIN  125 // questo è il conteggio della lunghezza minima dell'impulso (su 4096)
#define SERVOMAX  575 // questo è il conteggio della lunghezza massima del impulso (su 4096)


int servoNumber = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("32 channel Servo test!");

  board1.begin();
  board2.begin();
  board1.setPWMFreq(60); // I servomotori analogici funzionano con aggiornamenti a ~60 Hz.
  board2.setPWMFreq(60);
 // yield();
}

 // il codice all'interno di loop() è stato aggiornato da 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 controllo servo a 16 canali
  delay(100);

}

/*
 * angleToPulse(int ang)  
 * ottiene l'angolo in gradi e restituisce la larghezza dell'impulso  
 * stampa anche il valore sul monitor seriale  
 * scritto da Ahmad Shamshiri per Robojax, Robojax.com
 */
int angleToPulse(int ang){
   int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX); // mappa l'angolo da 0 a 180 ai valori minimi e massimi del servo
   Serial.print("Angle: ");Serial.print(ang);
   Serial.print(" pulse: ");Serial.println(pulse);
   return pulse;
}

Cose di cui potresti avere bisogno

Risorse e riferimenti

Nessuna risorsa ancora.

File📁

Librerie Arduino (zip)