This tutorial is part of: Servomotoare
Toate videoclipurile legate de servomotoarele conexe sunt listate aici. Linkuri către alte videoclipuri sunt sub acest articol.
Cod Arduino și Video pentru Controlerul de Servo PCA9685 cu 16 Canale și 12 Biți V1
În acest tutorial, vom explora cum să folosim controlerul de servomotoare PCA9685 cu 16 canale și 12 biți de la NXP Semiconductor. Acest modul vă permite să controlați până la 16 servomotoare sau să reglați luminozitatea unui grup de LED-uri cu precizie folosind modularea lățimii impulsurilor (PWM). La finalul acestui tutorial, veți avea o configurație funcțională care poate controla mai multe servomotoare individual sau simultan.

Pentru a clarifica și mai mult conținutul tutorialului, vă încurajez să urmăriți videoclipul atașat (în videoclip la 00:00) pentru o demonstrație vizuală a procesului de configurare și programare.
Hardware Explicat
Modulul PCA9685 este o placă compactă care poate controla mai multe servomotoare prin comunicare I2C. Dispune de 16 canale, permițându-vă să conectați până la 16 servomotoare, fiecare cu propriul semnal de control. Modulul funcționează la o sursă de alimentare de 5V și este proiectat să gestioneze semnale PWM, esențiale pentru controlul precis al poziției servomotoarelor.
Placa include pini dedicati pentru alimentare (VCC), masă (GND) și comunicare (SDA și SCL). Pinul SDA este folosit pentru transmiterea datelor, în timp ce pinul SCL este semnalul de ceas, ambele conectându-se la pinii analogici A4 și A5 ai Arduino, respectiv. Această configurație asigură o comunicare fiabilă între Arduino și modulul PCA9685.
Detalii din Fișa Tehnică
| Producător | NXP Semiconductor |
|---|---|
| Număr de piesă | PCA9685 |
| Tensiune logică/IO | 3,3 V până la 5,5 V |
| Tensiune de alimentare | 2,3 V până la 5,5 V |
| Curent de ieșire (pe canal) | 25 mA max |
| Curent de vârf (pe canal) | 100 mA max |
| Ghid frecvență PWM | 24 Hz până la 1,6 kHz |
| Praguri logice de intrare | 0,3 V (jos) / 0,7 V (sus) |
| Cădere de tensiune / RDS(on) / saturație | 0,5 V max |
| Limite termice | -40 °C până la 125 °C |
| Pachet | HTSSOP-28 |
| Note / variante | Controler PWM cu 16 canale |
- Asigurați o sursă de alimentare de 5V cu curent suficient (1A recomandat).
- Nu alimentați servomotoarele direct de la Arduino pentru a evita deteriorarea.
- Folosiți pinii I2C corecți: SDA la A4 și SCL la A5.
- Reglați valorile lățimii impulsurilor conform servomotoarelor dumneavoastră specifice.
- Verificați cablajul pentru polaritatea corectă: GND, VCC și semnal.
- Luați în considerare radiatorul pentru aplicații cu curent ridicat.
Instrucțiuni de Cablare

Pentru a conecta PCA9685 la Arduino, începeți prin conectarea alimentării și a masei. Conectați pinul VCC de pe PCA9685 la ieșirea de 5V de pe Arduino. Apoi conectați pinul GND de pe PCA9685 la GND de pe Arduino. În continuare, conectați pinul SDA de pe PCA9685 la pinul A4 de pe Arduino și pinul SCL la pinul A5.
Pentru servomotoare, conectați firul de semnal la canalul corespunzător de pe PCA9685 (de exemplu, CH0 pentru primul servomotor), firul de alimentare la o sursă de alimentare separată (deoarece servomotoarele pot necesita mai mult curent decât poate furniza Arduino), iar firul de masă la masa comună partajată cu PCA9685. Asigurați-vă că firele de semnal, alimentare și masă sunt aliniate corect pentru a evita deteriorarea componentelor.
Exemple de Cod și Explicații
În secțiunea de configurare a codului, inițializăm modulul PCA9685 cu pwm.begin() și setăm frecvența PWM cu pwm.setPWMFreq(60);. Aceasta setează frecvența de comunicare pentru servomotoare.
void setup() {
Serial.begin(9600);
Serial.println("Test servomotoare 16 canale!");
pwm.begin();
pwm.setPWMFreq(60); // Servomotoarele analogice funcționează la ~60 Hz actualizări
}
În bucla principală, controlăm servomotoarele setând valorile PWM corespunzătoare unghiurilor dorite. Funcția angleToPulse(int ang) mapează unghiul la lățimea adecvată a impulsului, esențială pentru poziționarea precisă a servomotorului.
void loop() {
for( int angle =0; angle<181; angle +=20){
delay(500);
pwm.setPWM(0, 0, angleToPulse(angle) );
}
}
În final, funcția angleToPulse(int ang) convertește unghiul în lățimea impulsului folosind lungimile minime și maxime definite ale impulsului. Aceasta vă permite să controlați ușor poziția servomotorului pe baza unghiului pe care doriți să îl atingeți.
int angleToPulse(int ang){
int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);
Serial.print("Unghi: ");Serial.print(ang);
Serial.print(" impuls: ");Serial.println(pulse);
return pulse;
}
Demonstrație / Ce să Vă Așteptați
Odată ce totul este cablat corect și codul este încărcat, ar trebui să vedeți servomotorul mișcându-se prin unghiurile specificate în incremente de 20 de grade. Dacă servomotorul nu se comportă conform așteptărilor, verificați cablajul pentru conexiuni corecte și asigurați-vă că sursa de alimentare este adecvată (în videoclip la 12:30).
Marcaje Temporale Video
- 00:00 - Introducere în PCA9685
- 02:30 - Instrucțiuni de cablare
- 05:00 - Explicația codului
- 10:15 - Demonstrația controlului servomotorului
- 12:30 - Depanarea problemelor comune
This tutorial is part of: Servomotoare
- Controlarea unui Servo cu Butoane de Apăsare Folosind 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)
- Controlul unui Servo cu un Potentiometru folosind Arduino
- Controlul unui Servo cu Potentiometru și LCD1602 folosind Arduino
- Controlling Servo Motors Using an Infrared Remote with Arduino
- Controlul motorului servo Arduino folosind un potentiometru
- Controlul poziției servo cu gesturi de mână pentru Arduino
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- Cum să folosești servomotorul continuu de 360° cu Arduino
- Construiește un comutator de tip toggle pentru servomotor cu Arduino folosind un buton
/*
* 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;
}
/*
* Original source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
* This is the Arduino code for the PCA9685 16-channel servo controller.
we have simple code with mapping PWM for simplicity explained in the video at 18:27
* Watch the video for details and demo: http://youtu.be/y8X9X10Tn1k
get this code and wiring from for this video: http://robojax.com/RJT27
* Written by Ahmad Nejrabi for Robojax Video channel: www.Robojax.com
* Date: December 15, 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 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() {
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);
}
Lucruri de care ai putea avea nevoie
-
AmazonPurchase PCA9685 from Amazonamzn.to
-
eBayPurchase PCA9685 from eBayebay.us
-
AliExpressPurchase PCA9685 from AliExpresss.click.aliexpress.com
-
BanggoodPurchase PCA9685 from Bangoodbanggood.com
Resurse și referințe
Încă nu sunt resurse.
Fișiere📁
Biblioteci Arduino (zip)
-
Adafruit-PWM-Servo-Driver-Library-master
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB
Alte fișiere
-
Foaia de date PCA9685
robojax_PCA9685.pdf0.39 MB -
Biblioteca Adafruit PCA9685
robojax_PCA9685-Adafruit-Library.zip0.01 MB