Cerca codice

Codice Arduino e video per il controller per servomotori PCA9685 a 16 canali e 12 bit V1

Codice Arduino e video per il controller per servomotori PCA9685 a 16 canali e 12 bit V1

In questo tutorial esploreremo come utilizzare il controller per servomotori PCA9685 a 16 canali e 12 bit di NXP Semiconductor. Questo modulo consente di controllare fino a 16 servomotori o di regolare l'intensità di un banco di LED con precisione utilizzando la modulazione di larghezza d'impulso (PWM). Al termine di questo tutorial avrai una configurazione funzionante in grado di controllare più servomotori singolarmente o contemporaneamente.

PCA9685 module-0

Per chiarire ulteriormente il contenuto del tutorial, ti invito a guardare il video di accompagnamento (nel video alle 00:00) per una dimostrazione visiva della configurazione e del processo di codifica.

Hardware spiegato

Il modulo PCA9685 è una scheda compatta che può controllare più servomotori tramite comunicazione I2C. Dispone di 16 canali, consentendo di collegare fino a 16 servomotori, ciascuno con il proprio segnale di controllo. Il modulo funziona con alimentazione a 5V ed è progettato per gestire segnali PWM, essenziali per controllare con precisione la posizione dei servomotori.

La scheda include pin dedicati per l'alimentazione (VCC), la massa (GND) e la comunicazione (SDA e SCL). Il pin SDA viene utilizzato per la trasmissione dei dati, mentre il pin SCL è il segnale di clock, entrambi collegati rispettivamente ai pin analogici A4 e A5 dell'Arduino. Questa configurazione garantisce una comunicazione affidabile tra l'Arduino e il modulo PCA9685.

Dettagli della scheda tecnica

ProduttoreNXP Semiconductor
Numero di partePCA9685
Tensione logica/I/Oda 3,3 V a 5,5 V
Tensione di alimentazioneda 2.3 V a 5.5 V
Corrente di uscita (per canale)25 mA max
Corrente di picco (per canale)100 mA massimo
Linee guida sulla frequenza PWMDa 24 Hz a 1,6 kHz
Soglie logiche di ingresso0.3 V (basso) / 0.7 V (alto)
Caduta di tensione / RDS(on)/ saturazione0,5 V max
Limiti termicida -40 °C a 125 °C
PacchettoHTSSOP-28
Note / variantiControllore PWM a 16 canali

  • Assicurati di avere un'alimentazione a 5 V con corrente sufficiente (1 A consigliata).
  • Non alimentare i servomotori direttamente dall'Arduino per evitare danni.
  • Usare i pin I2C corretti: SDA su A4 e SCL su A5.
  • Adatta i valori della larghezza d'impulso ai tuoi servomotori specifici.
  • Controllare il cablaggio per la polarità corretta: GND, VCC e segnale.
  • Considera l'uso di dissipatori di calore per applicazioni ad alta corrente.

Istruzioni di cablaggio

Arduino wiring for PCA9685 to control 16 servo motors
Arduino wiring for PCA9685 to control 16 servo motors

Per collegare il PCA9685 al tuo Arduino, inizia collegando alimentazione e massa. Collega il pin VCC del PCA9685 all'uscita 5V dell'Arduino. Poi collega il pin GND del PCA9685 al GND dell'Arduino. Successivamente, collega il pin SDA del PCA9685 al pin A4 dell'Arduino e il pin SCL al pin A5.

Per i servomotori, collega il filo del segnale al canale corrispondente sul PCA9685 (ad es., CH0 per il primo servo), il filo di alimentazione a un'alimentazione separata (poiché i servomotori potrebbero richiedere più corrente di quella che l'Arduino può fornire) e il filo di massa alla massa comune condivisa con il PCA9685. Assicurati che i fili di segnale, alimentazione e massa siano collegati correttamente per evitare di danneggiare i componenti.

Esempi di codice e guida passo passo

Nella sezione di configurazione del codice, inizializziamo il modulo PCA9685 conpwm.begin()e impostare la frequenza PWM conpwm.setPWMFreq(60);. Questo imposta la frequenza di comunicazione per i servomotori.

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
}

All'interno del ciclo, controlliamo i servomotori impostando i valori PWM corrispondenti agli angoli desiderati. La funzioneangleToPulse(int ang)Mappa l'angolo alla larghezza d'impulso appropriata, essenziale per il posizionamento accurato del servomotore.

void loop() {
  for( int angle =0; angle<181; angle +=20){
    delay(500);
    pwm.setPWM(0, 0, angleToPulse(angle) );
  }
}

Infine, la funzioneangleToPulse(int ang)converte l'angolo in larghezza dell'impulso usando i valori minimo e massimo di durata dell'impulso definiti. Questo ti permette di controllare facilmente la posizione del servo in base all'angolo che vuoi ottenere.

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;
}

Dimostrazione / Cosa aspettarsi

Una volta che tutto è collegato correttamente e il codice è stato caricato, dovresti vedere il servo muoversi attraverso gli angoli specificati con incrementi di 20 gradi. Se il servo non si comporta come previsto, controlla i collegamenti per verificare che siano corretti e assicurati che l'alimentazione sia adeguata (nel video a 12:30).

Marcatori temporali del video

  • 00:00- Introduzione al PCA9685
  • 02:30- Istruzioni per il cablaggio
  • 05:00- Analisi del codice
  • 10:15- Dimostrazione del controllo del servomotore
  • 12:30- Risoluzione dei problemi comuni

Immagini

PCA9685 module-0
PCA9685 module-0
PCA9685 module-1
PCA9685 module-1
PCA9685 module-2
PCA9685 module-2
PCA9685 module-3
PCA9685 module-3
PCA9685 module
PCA9685 module
Arduino wiring for PCA9685 to control 16 servo motors
Arduino wiring for PCA9685 to control 16 servo motors
36-PCA9685 video V1: Arduino Code to control 16 servo motor, Basic
Lingua: C++
/*
 * 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;
}
37-PCA9685 video V1: Arduino Code with mapping PWM
Lingua: C++
/*
 * Sorgente originale: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * Questo è il codice Arduino per il controller servo PCA9685 a 16 canali.
 * Guarda il video per dettagli e dimostrazioni: http://youtu.be/y8X9X10Tn1k
 * 
 * Scritto da Ahmad Nejrabi per il canale video Robojax: www.Robojax.com
 * Data: 15 dicembre 2017, ad Ajax, Ontario, Canada
 * Consenso concesso per condividere questo codice, a condizione che questa
 * nota venga mantenuta con il codice.
 * Dichiarazione di non responsabilità: Questo codice è "COSÌ COM'È" e solo per scopi educativi.
 * 
 * /***************************************************
 * Questo è un esempio per il nostro driver PWM e servo Adafruit a 16 canali.
 * Test servo - questo controllerà 16 servomotori, uno dopo l'altro.
 * 
 * Prendine uno oggi nel negozio Adafruit!
 * ------> http://www.adafruit.com/products/815
 * 
 * Questi display utilizzano I2C per comunicare; sono necessari 2 pin per
 * l'interfaccia. Per Arduino UNOs, ciò è SCL -> Analogico 5, SDA -> Analogico 4.
 * 
 * Adafruit investe tempo e risorse per fornire questo codice open source,
 * si prega di sostenere Adafruit e l'hardware open-source acquistando
 * prodotti da Adafruit!
 * 
 * Scritto da Limor Fried/Ladyada per Adafruit Industries.
 * Licenza BSD, tutto il testo sopra deve essere incluso in qualsiasi ridistribuzione.
 */
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

 // chiamato in questo modo, utilizza l'indirizzo predefinito 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
 // puoi anche chiamarlo con un indirizzo diverso che desideri
 // Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

 // A seconda della marca del tuo servo, la larghezza minima e massima dell'impulso potrebbe variare; tu
 // voglio che questi siano il più piccoli/grandi possibile senza raggiungere il fermo definitivo
 // per la massima portata. Dovrai modificarli secondo necessità per adattarli ai servomotori che
 // abbiate!
#define SERVOMIN  125 // questo è il conteggio della lunghezza minima del impulso (su 4096)
#define SERVOMAX  575 // questo è il conteggio della lunghezza massima del impulso (su 4096)

 // il nostro servo # contatore
uint8_t servonum = 0;

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

  pwm.begin();

  pwm.setPWMFreq(60); // I servomotori analogici funzionano con aggiornamenti a ~60 Hz.

 // yield();
}

 // il codice all'interno di loop() è stato aggiornato da Robojax
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);


}

Cose di cui potresti avere bisogno

Risorse e riferimenti

Nessuna risorsa ancora.

File📁

Librerie Arduino (zip)