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++
/*
 * 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

Risorse e riferimenti

Nessuna risorsa ancora.

File📁

Librerie Arduino (zip)