Search Code

Cod Arduino și Video pentru Controlerul de Servo PCA9685 cu 16 Canale și 12 Biți V1

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.

PCA9685 module-0

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ătorNXP Semiconductor
Număr de piesăPCA9685
Tensiune logică/IO3,3 V până la 5,5 V
Tensiune de alimentare2,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ță PWM24 Hz până la 1,6 kHz
Praguri logice de intrare0,3 V (jos) / 0,7 V (sus)
Cădere de tensiune / RDS(on) / saturație0,5 V max
Limite termice-40 °C până la 125 °C
PachetHTSSOP-28
Note / varianteControler 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

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

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

Imagini

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
Limba: 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
Limba: C++
/*
 * 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

Resurse și referințe

Încă nu sunt resurse.

Fișiere📁

Biblioteci Arduino (zip)

Alte fișiere