كود البحث

كود أردوينو وفيديو لمتحكم السيرفو PCA9685 ذو 16 قناة و12 بت V1

كود أردوينو وفيديو لمتحكم السيرفو PCA9685 ذو 16 قناة و12 بت V1

في هذا الدرس، سنستعرض كيفية استخدام متحكم السرفو PCA9685 ذي 16 قناة وبدقة 12 بت من شركة NXP Semiconductor. تتيح لك هذه الوحدة التحكم بما يصل إلى 16 محرك سرفو أو تعتيم مجموعة من مصابيح LED بدقة باستخدام تعديل عرض النبضة (PWM). بنهاية هذا الدرس، سيكون لديك إعداد عملي قادر على التحكم في عدة محركات سرفو بشكل فردي أو بشكل متزامن.

PCA9685 module-0

لتوضيح محتوى الشرح بشكل أكبر، أشجعك على مشاهدة الفيديو المصاحب (في الفيديو عند 00:00) للحصول على عرض مرئي لعملية الإعداد والبرمجة.

شرح الأجهزة

وحدة PCA9685 هي لوحة مدمجة يمكنها التحكم في عدة محركات سيرفو عبر اتصال I2C. تحتوي على 16 قناة، مما يتيح لك توصيل ما يصل إلى 16 محرك سيرفو، لكلٍ منها إشارة تحكم خاصة. تعمل الوحدة بجهد تغذية 5V ومصممة للتعامل مع إشارات PWM، الضرورية للتحكم بدقة في موضع محركات السيرفو.

تحتوي اللوحة على دبابيس مخصصة للطاقة (VCC) والأرضي (GND) والاتصال (SDA وSCL). يُستخدم دبوس SDA لنقل البيانات، بينما يمثل دبوس SCL إشارة الساعة، ويتصلان بالدبابيس التناظرية للأردوينو A4 وA5 على التوالي. يضمن هذا الإعداد تواصلاً موثوقاً بين الأردوينو ووحدة PCA9685.

تفاصيل ورقة البيانات

المصنّعإن إكس بي لأشباه الموصلات
رقم القطعةPCA9685
جهد المنطق/الإدخال/الإخراج3.3 V إلى 5.5 V
جهد التغذية2.3 V إلى 5.5 V
تيار الإخراج (لكل قناة)25 mA كحد أقصى
التيار الأقصى (لكل قناة)100 mA كحد أقصى
إرشادات تردد PWM24 هرتز إلى 1.6 كيلوهرتز
عتبات منطقية للإدخال0.3 V (منخفض) / 0.7 V (مرتفع)
هبوط الجهد / Rالمصرف-المصدر (عند التشغيل)/ التشبع0.5 فولت كحد أقصى
الحدود الحرارية-40 °C إلى 125 °C
حزمةHTSSOP-28
ملاحظات / متغيراتمتحكم PWM ذو 16 قناة

  • تأكد من وجود مصدر طاقة بقيمة 5 فولت وبتيار كافٍ (يوصى بتيار 1 أمبير).
  • لا تزود محركات السيرفو بالطاقة مباشرة من الأردوينو لتجنب التلف.
  • استخدم دبابيس I2C الصحيحة: SDA إلى A4 و SCL إلى A5.
  • عدل قيم عرض النبضة وفقًا للسرفوهات الخاصة بك.
  • افحص توصيل الأسلاك للتأكد من القطبية الصحيحة: GND وVCC والإشارة.
  • ضع في اعتبارك استخدام مشتت حراري للتطبيقات ذات التيار العالي.

تعليمات الأسلاك

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

لتوصيل PCA9685 بـ Arduino، ابدأ بتوصيل مصدر الطاقة والأرضي. وصل دبوس VCC في PCA9685 بمخرج 5V في الـ Arduino. ثم وصل دبوس GND في PCA9685 بالأرضي (GND) في الـ Arduino. بعد ذلك، وصل دبوس SDA في PCA9685 بالدبوس A4 في الـ Arduino، ودبوس SCL بالدبوس A5.

بالنسبة للسيرفو، قم بتوصيل سلك الإشارة بالقناة المقابلة على PCA9685 (مثلاً CH0 للسيرفو الأول)، وسلك الطاقة بمزود طاقة منفصل (لأن السيرفو قد يتطلب تياراً أكثر مما يمكن لأردوينو توفيره)، وسلك الأرضي بالأرضي المشترك مع PCA9685. تأكد من أن أسلاك الإشارة والطاقة والأرضي مصطفة بشكل صحيح لتجنب تلف المكونات.

أمثلة برمجية وشرح تفصيلي

في قسم الإعداد في الشيفرة، نهيئ وحدة PCA9685 باستخدامpwm.begin()واضبط تردد PWM باستخدامpwm.setPWMFreq(60);. يحدد هذا تردد الاتصال لمحركات السيرفو.

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
}

داخل الحلقة، نتحكم في محركات السرفو عن طريق ضبط قيم PWM المطابقة للزوايا المطلوبة. الدالةangleToPulse(int ang)يحوّل الزاوية إلى عرض نبضة مناسب، وهو أمر أساسي لتحقيق تموضع دقيق للسيرفو.

void loop() {
  for( int angle =0; angle<181; angle +=20){
    delay(500);
    pwm.setPWM(0, 0, angleToPulse(angle) );
  }
}

أخيرًا، الدالةangleToPulse(int ang)يحوّل الزاوية إلى عرض النبضة باستخدام أطوال النبضة الدنيا والقصوى المحددة. يتيح لك ذلك التحكم بسهولة في موضع السرفو بناءً على الزاوية التي تريد تحقيقها.

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;
}

عرض توضيحي / ما المتوقع

بمجرد توصيل كل شيء بشكل صحيح ورفع الكود، يجب أن ترى محرك السيرفو يتحرك عبر الزوايا المحددة بزيادات مقدارها 20 درجة. إذا لم يتصرف محرك السيرفو كما هو متوقع، فافحص الأسلاك للتأكد من الاتصالات الصحيحة وتأكد من أن مصدر الطاقة كافٍ (في الفيديو عند 12:30).

علامات زمنية للفيديو

  • 00:00- مقدمة عن PCA9685
  • 02:30- تعليمات الأسلاك
  • 05:00- استعراض الكود
  • 10:15- عرض توضيحي للتحكم في محرك السيرفو
  • 12:30- استكشاف الأخطاء الشائعة وإصلاحها

الصور

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
اللغة: 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
اللغة: C++
/*
 * المصدر الأصلي: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * هذا هو رمز Arduino لوحدة التحكم في servos PCA9685 ذات 16 قناة.
 * شاهد الفيديو لمزيد من التفاصيل والعرض التوضيحي: http://youtu.be/y8X9X10Tn1k
 * 
 * كتب بواسطة أحمد نجريبي لقناة فيديو Robojax: www.Robojax.com
 * التاريخ: 15 ديسمبر 2017، في أجاكس، أونتاريو، كندا
 * تم منح الإذن لمشاركة هذا الرمز، شريطة أن يتم الاحتفاظ بهذه
 * الملاحظة مع الرمز.
 * إخلاء المسؤولية: هذا الرمز هو "كما هو" ولأغراض تعليمية فقط.
 * 
 * /
 * /***************************************************
 * هذا مثال على سائق PWM و Servo ذو 16 قناة من Adafruit.
 * اختبار سيرفو - هذا سيقود 16 سيرفو، واحداً تلو الآخر.
 * 
 * احصل على واحدة اليوم من متجر Adafruit!
 * ------> http://www.adafruit.com/products/815
 * 
 * تستخدم هذه الشاشات I2C للتواصل؛ مطلوب دبابيسين لـ
 * واجهة الربط. بالنسبة لأجهزة Arduino UNOs، هذا هو SCL -> Analog 5، SDA -> Analog 4.
 * 
 * تستثمر Adafruit الوقت والموارد لتقديم هذا الرمز مفتوح المصدر،
 * يرجى دعم Adafruit والأجهزة المفتوحة المصدر من خلال شراء
 * المنتجات من Adafruit!
 * 
 * كتب بواسطة ليمور فريد / ليديادا لصناعة Adafruit.
 * ترخيص BSD، يجب تضمين جميع النصوص أعلاه في أي إعادة توزيع
 */
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

 // بهذه الطريقة، يستخدم العنوان الافتراضي 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
 // يمكنك أيضًا الاتصال به باستخدام عنوان مختلف تريده.
 // ادافروت_PWMServoDriver pwm = ادافروت_PWMServoDriver(0x41);

 // اعتمادًا على نوع السيرفو لديك، قد تختلف أقصى وأدنى عرض نبضة؛ أنت
 // أريد أن تكون هذه صغيرة/كبيرة قدر الإمكان دون الوصول إلى الحد الأقصى.
 // لأقصى مدى. سيتعين عليك تعديلها حسب الحاجة لتتناسب مع محركات السيرفو التي لديك.
 // لدي!
#define SERVOMIN  125 // هذا هو عدد طول النبضة 'الحد الأدنى' (من أصل 4096)
#define SERVOMAX  575 // هذه هي 'الحد الأقصى' لعدد مدة النبضة (من أصل 4096)

 // عداد السيرفو لدينا
uint8_t servonum = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");

  pwm.begin();

  pwm.setPWMFreq(60); // تعمل السيرفو التناظرية بتحديثات حوالي 60 هيرتز

 // yield();
}

 // تم تحديث الكود داخل loop() بواسطة 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);


}

الأشياء التي قد تحتاجها

الموارد والمراجع

لا توجد موارد حتى الآن.

ملفات📁

مكتبات أردوينو (ملف مضغوط)