Questo tutorial è parte di: Servomotori
Tutti i video correlati ai servomotori sono elencati qui. I link ad altri video si trovano sotto questo articolo.
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.

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
| Produttore | NXP Semiconductor |
|---|---|
| Numero di parte | PCA9685 |
| Tensione logica/I/O | da 3,3 V a 5,5 V |
| Tensione di alimentazione | da 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 PWM | Da 24 Hz a 1,6 kHz |
| Soglie logiche di ingresso | 0.3 V (basso) / 0.7 V (alto) |
| Caduta di tensione / RDS(on)/ saturazione | 0,5 V max |
| Limiti termici | da -40 °C a 125 °C |
| Pacchetto | HTSSOP-28 |
| Note / varianti | Controllore 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

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
Questo tutorial è parte di: Servomotori
- Controllare un servomotore con pulsanti usando Arduino
- Control a Servo Motor with a Push Button: Move Servo and Return SPB-1
- Control a Servo Motor with a Push Button: Move Servo in One Direction SPB-2
- Controlling a Servo Motor with a Push Button: Move Servo While Button Is Pressed (SPB-3)
- Controllare un servomotore con un potenziometro usando Arduino
- Controllare un servomotore con un potenziometro e un LCD1602 usando Arduino
- Controllare i servomotori utilizzando un telecomando a infrarossi con Arduino
- Controllo del Motore Servo Arduino Utilizzando un Potenziometro
- Controllare la posizione del servo con gesti della mano per Arduino
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- How to Use Continuous 360° Servo with Arduino
- Build an Arduino Servo Toggle Switch with a Push Button
/*
* 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;
}
/*
* 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
-
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