Hierdie tutorialie is deel van: Servomotors
Alle video's wat verband hou met servomotors, word hier gelys. Skakels na ander video's is onder hierdie artikel.
Arduino-kode en video vir PCA9685 16-kanaal 12-bis Servo-beheerder V1
In hierdie tutoriaal gaan ons ondersoek hoe om die PCA9685 16-kanaal 12-bis servo-beheerder van NXP Semiconductor te gebruik. Hierdie module laat jou toe om tot 16 servo's te beheer of 'n bank LED's met presisie te verdof deur gebruik te maak van polswydtemodulasie (PWM). Teen die einde van hierdie tutoriaal sal jy 'n werkende opstelling hê wat veelvuldige servo's individueel of gelyktydig kan beheer.

Om die tutoriaalinhoud verder te verduidelik, moedig ek jou aan om die gepaardgaande video (in video by 00:00) te kyk vir 'n visuele demonstrasie van die opstellings- en kodeproses.
Hardeware Verduidelik
Die PCA9685-module is 'n kompakte bord wat veelvuldige servo's via I2C-kommunikasie kan beheer. Dit beskik oor 16 kanale, wat jou toelaat om tot 16 servo's te koppel, elk met sy eie beheersein. Die module werk op 'n 5V-kragtoevoer en is ontwerp om PWM-seine te hanteer, wat noodsaaklik is vir die akkurate beheer van servo-posisies.
Die bord sluit toegewyde penne in vir krag (VCC), grond (GND), en kommunikasie (SDA en SCL). Die SDA-pen word gebruik vir data-oordrag, terwyl die SCL-pen die kloksein is, wat albei aan die Arduino se analoogpenne A4 en A5 onderskeidelik koppel. Hierdie opstelling verseker betroubare kommunikasie tussen die Arduino en die PCA9685-module.
Datablad Besonderhede
| Vervaardiger | NXP Semiconductor |
|---|---|
| Deelnommer | PCA9685 |
| Logika/IO-spanning | 3.3 V tot 5.5 V |
| Toevoerspanning | 2.3 V tot 5.5 V |
| Uitsetstroom (per kanaal) | 25 mA maks |
| Piekstroom (per kanaal) | 100 mA maks |
| PWM-frekwensie riglyn | 24 Hz tot 1.6 kHz |
| Inset-logika drempels | 0.3 V (laag) / 0.7 V (hoog) |
| Spanningsval / RDS(on) / versadiging | 0.5 V maks |
| Termiese limiete | -40 °C tot 125 °C |
| Verpakking | HTSSOP-28 |
| Notas / variante | 16-kanaal PWM-beheerder |
- Verseker 'n 5V-kragtoevoer met voldoende stroom (1A aanbeveel).
- Moenie die servo's direk vanaf die Arduino krag gee om skade te vermy nie.
- Gebruik die korrekte I2C-penne: SDA na A4 en SCL na A5.
- Pas polswydtewaardes aan volgens jou spesifieke servo's.
- Kontroleer bedrading vir korrekte polariteit: GND, VCC, en sein.
- Oorweeg hitte-sinkers vir hoëstroomtoepassings.
Bedradingsinstruksies

Om die PCA9685 aan jou Arduino te bedraad, begin deur die krag en grond te koppel. Koppel die VCC-pen op die PCA9685 aan die 5V-uitset op die Arduino. Koppel dan die GND-pen op die PCA9685 aan die GND op die Arduino. Volgende, koppel die SDA-pen op die PCA9685 aan pen A4 op die Arduino, en die SCL-pen aan pen A5.
Vir die servo's, koppel die seindraad aan die ooreenstemmende kanaal op die PCA9685 (bv. CH0 vir die eerste servo), die kragdraad aan 'n aparte kragtoevoer (aangesien die servo's meer stroom mag benodig as wat die Arduino kan verskaf), en die gronddraad aan die gemeenskaplike grond wat met die PCA9685 gedeel word. Maak seker dat die sein-, krag- en gronddrade korrek in lyn is om skade aan jou komponente te vermy.
Kode Voorbeelde & Deurloop
In die opstellingsafdeling van die kode, initialiseer ons die PCA9685-module met pwm.begin() en stel die PWM-frekwensie met pwm.setPWMFreq(60);. Dit stel die kommunikasiefrekwensie vir die servo's in.
void setup() {
Serial.begin(9600);
Serial.println("16 kanaal Servo toets!");
pwm.begin();
pwm.setPWMFreq(60); // Analoog servo's werk teen ~60 Hz opdaterings
}
Binne die lus beheer ons die servo's deur die PWM-waardes in te stel wat ooreenstem met die verlangde hoeke. Die funksie angleToPulse(int ang) karteer die hoek na die toepaslike polswydte, wat noodsaaklik is vir akkurate servo-posisionering.
void loop() {
for( int angle =0; angle<181; angle +=20){
delay(500);
pwm.setPWM(0, 0, angleToPulse(angle) );
}
}
Laastens, die funksie angleToPulse(int ang) skakel die hoek om na polswydte deur gebruik te maak van die gedefinieerde minimum en maksimum polslengtes. Dit laat jou toe om die servo se posisie maklik te beheer gebaseer op die hoek wat jy wil bereik.
int angleToPulse(int ang){
int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);
Serial.print("Hoek: ");Serial.print(ang);
Serial.print(" pols: ");Serial.println(pulse);
return pulse;
}
Demonstrasie / Wat om te Verwag
Sodra alles korrek bedraad is en die kode opgelaai is, behoort jy die servo deur die gespesifiseerde hoeke in inkremente van 20 grade te sien beweeg. As die servo nie soos verwag optree nie, kontroleer die bedrading vir korrekte verbindings en verseker dat die kragtoevoer voldoende is (in video by 12:30).
Video Tydstempels
- 00:00 - Inleiding tot PCA9685
- 02:30 - Bedradingsinstruksies
- 05:00 - Kode deurloop
- 10:15 - Demonstrasie van servo-beheer
- 12:30 - Probleemoplossing van algemene kwessies
Hierdie handleiding is deel van: Servomotors
- Beheer van 'n Servo met Drukkoppe deur Arduino te gebruik
- 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)
- Beheer van 'n Servo met 'n Potensiometer deur Arduino te gebruik
- Beheer van 'n Servo met Potensiometer en LCD1602 deur Arduino te gebruik
- Beheer van servomotors met behulp van 'n infrarooi-afstandbeheer met Arduino
- Arduino Servo Motor Beheer met 'n Potensiometer
- Beheer van Servo Posisie met Handgebare vir Arduino
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- Hoe om 'n Kontinu 360° Servo met Arduino te gebruik
- Bou 'n Arduino Servo-wisselskakelaar met 'n drukknoppie
/*
* 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);
}
Goedere wat jy dalk nodig het
-
AmazonPurchase PCA9685 from Amazonamzn.to
-
eBayPurchase PCA9685 from eBayebay.us
-
AliExpressPurchase PCA9685 from AliExpresss.click.aliexpress.com
-
BanggoodPurchase PCA9685 from Banggoodbanggood.com
Hulpbronne en verwysings
Geen hulpbronne nog.
Lêers📁
Arduino Biblioteke (zip)
-
Adafruit-PWM-Servo-Driver-Biblioteek-meester
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB
Ander lêers
-
PCA9685 Datablad
robojax_PCA9685.pdf0.39 MB -
PCA9685 Adafruit-biblioteek
robojax_PCA9685-Adafruit-Library.zip0.01 MB