Tutorial ini adalah bagian dari: Motor Servo
Semua video terkait motor servo yang relevan tercantum di sini. Tautan ke video lain ada di bawah artikel ini.
Kode Arduino dan Video untuk Pengontrol Servo PCA9685 16 Saluran 12-Bit V1
Dalam tutorial ini, kita akan menjelajahi cara menggunakan pengontrol servo 16 saluran 12-bit PCA9685 dari NXP Semiconductor. Modul ini memungkinkan Anda mengontrol hingga 16 servo atau meredupkan bank LED dengan presisi menggunakan modulasi lebar pulsa (PWM). Di akhir tutorial ini, Anda akan memiliki pengaturan yang berfungsi yang dapat mengontrol beberapa servo secara individual atau bersamaan.

Untuk memperjelas konten tutorial lebih lanjut, saya mendorong Anda untuk menonton video pendamping (di video pada 00:00) untuk demonstrasi visual dari proses pengaturan dan pengkodean.
Penjelasan Perangkat Keras
Modul PCA9685 adalah papan ringkas yang dapat mengontrol beberapa servo melalui komunikasi I2C. Modul ini memiliki 16 saluran, memungkinkan Anda menghubungkan hingga 16 servo, masing-masing dengan sinyal kontrolnya sendiri. Modul beroperasi pada catu daya 5V dan dirancang untuk menangani sinyal PWM, yang penting untuk mengontrol posisi servo secara akurat.
Papan ini mencakup pin khusus untuk daya (VCC), ground (GND), dan komunikasi (SDA dan SCL). Pin SDA digunakan untuk transmisi data, sedangkan pin SCL adalah sinyal clock, keduanya terhubung ke pin analog Arduino A4 dan A5 masing-masing. Pengaturan ini memastikan komunikasi yang andal antara Arduino dan modul PCA9685.
Detail Datasheet
| Produsen | NXP Semiconductor |
|---|---|
| Nomor komponen | PCA9685 |
| Tegangan logika/IO | 3,3 V hingga 5,5 V |
| Tegangan catu daya | 2,3 V hingga 5,5 V |
| Arus keluaran (per saluran) | Maks 25 mA |
| Arus puncak (per saluran) | Maks 100 mA |
| Panduan frekuensi PWM | 24 Hz hingga 1,6 kHz |
| Ambang logika masukan | 0,3 V (rendah) / 0,7 V (tinggi) |
| Penurunan tegangan / RDS(on) / saturasi | Maks 0,5 V |
| Batas termal | -40 °C hingga 125 °C |
| Kemasan | HTSSOP-28 |
| Catatan / varian | Pengontrol PWM 16 saluran |
- Pastikan catu daya 5V dengan arus yang cukup (1A disarankan).
- Jangan memberi daya pada servo langsung dari Arduino untuk menghindari kerusakan.
- Gunakan pin I2C yang benar: SDA ke A4 dan SCL ke A5.
- Sesuaikan nilai lebar pulsa sesuai dengan servo spesifik Anda.
- Periksa kabel untuk polaritas yang benar: GND, VCC, dan sinyal.
- Pertimbangkan heat-sinking untuk aplikasi arus tinggi.
Instruksi Pengkabelan

Untuk menghubungkan PCA9685 ke Arduino Anda, mulailah dengan menghubungkan daya dan ground. Hubungkan pin VCC pada PCA9685 ke keluaran 5V pada Arduino. Kemudian hubungkan pin GND pada PCA9685 ke GND pada Arduino. Selanjutnya, hubungkan pin SDA pada PCA9685 ke pin A4 pada Arduino, dan pin SCL ke pin A5.
Untuk servo, hubungkan kabel sinyal ke saluran yang sesuai pada PCA9685 (misalnya, CH0 untuk servo pertama), kabel daya ke catu daya terpisah (karena servo mungkin memerlukan arus lebih dari yang dapat disediakan Arduino), dan kabel ground ke ground bersama yang digunakan dengan PCA9685. Pastikan kabel sinyal, daya, dan ground sejajar dengan benar untuk menghindari kerusakan komponen Anda.
Contoh Kode & Penjelasan
Di bagian pengaturan kode, kita menginisialisasi modul PCA9685 dengan pwm.begin() dan mengatur frekuensi PWM dengan pwm.setPWMFreq(60);. Ini mengatur frekuensi komunikasi untuk servo.
void setup() {
Serial.begin(9600);
Serial.println("16 channel Servo test!");
pwm.begin();
pwm.setPWMFreq(60); // Servo analog berjalan pada pembaruan ~60 Hz
}
Di dalam loop, kita mengontrol servo dengan mengatur nilai PWM yang sesuai dengan sudut yang diinginkan. Fungsi angleToPulse(int ang) memetakan sudut ke lebar pulsa yang sesuai, yang penting untuk penentuan posisi servo yang akurat.
void loop() {
for( int angle =0; angle<181; angle +=20){
delay(500);
pwm.setPWM(0, 0, angleToPulse(angle) );
}
}
Terakhir, fungsi angleToPulse(int ang) mengonversi sudut ke lebar pulsa menggunakan panjang pulsa minimum dan maksimum yang ditentukan. Ini memungkinkan Anda dengan mudah mengontrol posisi servo berdasarkan sudut yang ingin dicapai.
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;
}
Demonstrasi / Apa yang Diharapkan
Setelah semuanya terhubung dengan benar dan kode diunggah, Anda akan melihat servo bergerak melalui sudut yang ditentukan dalam kelipatan 20 derajat. Jika servo tidak berperilaku seperti yang diharapkan, periksa kabel untuk koneksi yang benar dan pastikan catu daya memadai (di video pada 12:30).
Stempel Waktu Video
- 00:00 - Pengenalan PCA9685
- 02:30 - Instruksi pengkabelan
- 05:00 - Penjelasan kode
- 10:15 - Demonstrasi kontrol servo
- 12:30 - Pemecahan masalah umum
Tutorial ini adalah bagian dari: Motor Servo
- Mengontrol Servo dengan Tombol Tekan Menggunakan 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)
- Mengontrol Servo dengan Potensiometer Menggunakan Arduino
- Mengontrol Servo dengan Potensiometer dan LCD1602 menggunakan Arduino
- Mengendalikan Motor Servo Menggunakan Remote Inframerah dengan Arduino
- Kontrol Motor Servo Arduino Menggunakan Potensiometer
- Mengontrol Posisi Servo dengan Gerakan Tangan untuk Arduino
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- Cara Menggunakan Servo 360° Kontinu dengan Arduino
- Buat Saklar Toggle Servo Arduino dengan Tombol Tekan
/*
* 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);
}
Hal-hal yang mungkin Anda butuhkan
-
AmazonPurchase PCA9685 from Amazonamzn.to
-
eBayPurchase PCA9685 from eBayebay.us
-
AliExpressPurchase PCA9685 from AliExpresss.click.aliexpress.com
-
BanggoodPurchase PCA9685 from Banggoodbanggood.com
Sumber daya & referensi
Belum ada sumber daya.
Berkas📁
Pustaka Arduino (zip)
-
Adafruit-PWM-Servo-Driver-Library-master
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB
File lainnya
-
Datasheet PCA9685
robojax_PCA9685.pdf0.39 MB -
PCA9685 Perpustakaan Adafruit
robojax_PCA9685-Adafruit-Library.zip0.01 MB