Cari Kode

Kode Arduino dan Video untuk Pengontrol Servo PCA9685 16 Saluran 12-Bit V1

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.

PCA9685 module-0

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

ProdusenNXP Semiconductor
Nomor komponenPCA9685
Tegangan logika/IO3,3 V hingga 5,5 V
Tegangan catu daya2,3 V hingga 5,5 V
Arus keluaran (per saluran)Maks 25 mA
Arus puncak (per saluran)Maks 100 mA
Panduan frekuensi PWM24 Hz hingga 1,6 kHz
Ambang logika masukan0,3 V (rendah) / 0,7 V (tinggi)
Penurunan tegangan / RDS(on) / saturasiMaks 0,5 V
Batas termal-40 °C hingga 125 °C
KemasanHTSSOP-28
Catatan / varianPengontrol 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

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

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

Gambar

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
Bahasa: 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
Bahasa: 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);	

 
}

Hal-hal yang mungkin Anda butuhkan

Sumber daya & referensi

Belum ada sumber daya.

Berkas📁

Pustaka Arduino (zip)

File lainnya