كود البحث

التحكم في محرك سيرفو 32 باستخدام وحدة PCA9685 و ESP32 V4

التحكم في محرك سيرفو 32 باستخدام وحدة PCA9685 و ESP32 V4

في هذا الدليل، ستتعلم كيفية التحكم في ما يصل إلى 32 محرك سيرفو باستخدام وحدة تحكم دقيقة ESP32 متصلة بوحدة PCA9685. هذا مفيد بشكل خاص للمشاريع التي تتطلب تشغيل عدة محركات سيرفو في وقت واحد دون استخدام واي فاي. سيكون الناتج إعدادًا وظيفيًا بالكامل حيث يمكنك التحكم في موضع كل محرك سيرفو بشكل فردي.

PCA9685 module-0

ستقوم هذه التعليمات بإرشادك من خلال مكونات الأجهزة اللازمة، وتعليمات التوصيل، ونظرة عامة على الشيفرة المطلوبة لتحقيق هذا التحكم. لمشاهدة عرض تفصيلي، يمكنك مشاهدة الفيديو المرتبط (في الفيديو عند 00:00).

شرح الأجهزة

المكونات الرئيسية المستخدمة في هذا المشروع هي المتحكم الدقيق ESP32 ووحدة محرك PWM PCA9685. يعمل ESP32 كجهاز التحكم الرئيسي الذي يرسل إشارات إلى وحدة PCA9685، والتي بدورها تتحكم في محركات السيرفو. يمكن لوحدة PCA9685 التعامل مع ما يصل إلى 16 محرك سيرفو لكل وحدة، مما يسمح بتوصيل وحدتين للتحكم في إجمالي 32 سيرفو.

يعمل وحدة PCA9685 باستخدام اتصال I2C، مما يعني أن لديها سلكين رئيسيين لنقل البيانات: SDA (خط البيانات) و SCL (خط الساعة). كما أنها تتطلب مصدر طاقة لتشغيل السيرفو، عادةً عند 5 فولت. يعمل ESP32 كجهاز رئيسي، موفراً إشارات التحكم اللازمة لوحدات PCA9685 الفرعية.

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

الصانع أدا فروت
رقم الجزء PCA9685
جهد المنطق/الإدخال والإخراج 3.3 فولت إلى 5.5 فولت
جهد الإمداد ٥ ف
التيار الناتج (لكل قناة) ~20 مللي أمبير
التيار الذروي (لكل قناة) حوالي 25 ملي أمبير
توجيه تردد PWM 60 هرتز
عتبات منطق الإدخال 0.3*VDD(منخفض)، 0.7*فDD(مرتفع)
سقوط الجهد / ردي إس (أون)/ تشبع 0.5 فولت كحد أقصى
الحدود الحرارية ١٢٥ °م
حزمة HTSSOP-28
ملاحظات / متغيرات 16 قناة وحدة تحكم PWM

  • استخدم مصدر طاقة خارجي للمشغلات (5 فولت، 2 أمبير موصى به).
  • تأكد من وجود تأريض صحيح بين ESP32 و PCA9685.
  • تحقق من إعدادات تردد PWM لأفضل أداء للخدمة.
  • قم بتعديل حدود عرض النبضة بناءً على مواصفات السيرفو.
  • كن حذرًا من سحب التيار عند تشغيل عدة سيرفو.

تعليمات التوصيل

ESP32 wiring for PCA99685 for 32 sevo motors

لتوصيل PCA9685 بESP32، ابدأ بتوصيل الطاقة والأرضي. قم بتوصيل VCCقم بتوصيل دبوس PCA9685 بمصدر طاقة 5 فولت، وقم بتوصيل دبوس GND بأحد دبابيس GND على ESP32. يضمن ذلك أن كل من الوحدة و ESP32 يشتركان في أرضية مشتركة.

بعد ذلك، بالنسبة لتواصل I2C، قم بتوصيل دبابيس SDA على PCA9685 إلى GPIO 21 على ESP32 ودبابيس SCL إلى GPIO 22. هذا الإعداد يسمح لـ ESP32 بالتواصل مع وحدة PCA9685 بشكل صحيح. تأكد من استخدام أسلاك قصيرة لتجنب الضجيج في خطوط التواصل، خاصة إذا كنت تعمل مع عدة سيرفو.

توصيل لوحين من نوع PCA9685

كما هو موضح في الصورة أعلاه، بالنسبة للوحة PCA9685 رقم 2 (على اليسار)، تأكد من لحام هذه المسار لتعيين عنوان I2C بحيث يكون مختلفًا عن اللوحة 1 (على اليمين).

أمثلة شفرة وتجربة شاملة

يقوم الكود بتهيئة وحدات PCA9685 ويحدد تردد PWM. تتضمن هوية المفتاح في الكودboard1وboard2، والتي تمثل وحدتي PCA9685 المرتبطتين بـ ESP32. الـsetup()تقوم الدالة بتهيئة المراقب التسلسلي وتعيين تردد PWM لكل من اللوحين.

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

هذا الاقتباس يظهر عملية الإعداد، حيث يتم تهيئة الاتصال التسلسلي، ويتم تعيين تردد PWM لمحركات السيرفو.setPWMFreq(60)تضمن الوظيفة أن تحصل السيرفو على التردد الصحيح لتشغيل سلس.

في الحلقة، يقوم حلقة for بالتكرار عبر الزوايا من 0 إلى 180 درجة، مرسلاً أوامر عرض النبضة إلى الخوادم المتصلة بكل من لوحات PCA9685. الوظيفةangleToPulseيحول الزاوية إلى عرض النبضة المقابل.

void loop() {
    for(int angle = 0; angle < 181; angle += 10) {
        for(int i = 0; i < 16; i++) {      
            board2.setPWM(i, 0, angleToPulse(angle));
            board1.setPWM(i, 0, angleToPulse(angle));
        }
    }
    delay(100);
}

هذا المقتطف من الشيفرة يوضح كيفية التحكم في السيرفو في حلقة. تزداد زاوية السيرفو بمقدار 10 درجات، وsetPWMيتم استدعاء الدالة لكلتا اللوحتين لتحريك السيرفو إلى الزاوية المحددة. التأخير يسمح بوجود توقف قصير بين الحركات.

عرض / ماذا تتوقع

عند الانتهاء من توصيل الأسلاك وتحميل الشيفرة، يجب أن ترى المحركات تتحرك بزيادات من 0 إلى 180 درجة. سيحدث هذا لجميع المحركات الـ 32 المتصلة بوحدتي PCA9685 في الوقت نفسه. إذا لم تستجب أي محرك، تحقق من مصدر الطاقة وتأكد من أن جميع الاتصالات آمنة (في الفيديو عند 12:30).

وحدة PCA9685
وحدة PCA9685

توقيت الفيديو

  • 00:00 بدء
  • ٠٠:٣٦ المقدمة
  • 04:01 شرح الأسلاك (ESP32 فقط)
  • 06:26 إعداد Arduino IDE لـ ESP32
  • 08:34 شرح الكود
  • 13:40 عرض تشغيل 32 محرك سيرفو

الصور

PCA9685 module-0
PCA9685 module-0
PCA9685 module-2
PCA9685 module-2
PCA9685 module-3
PCA9685 module-3
PCA9685 module
PCA9685 module
Connecting two PCA9685 board
Connecting two PCA9685 board
ESP32 wiring for PCA99685 for 32 sevo motors
ESP32 wiring for PCA99685 for 32 sevo motors
880-new- PCA9685 Video V4, Arduino ESP32 Code : Controlling all 32 servo motor wihtout WiFi
اللغة: C++
/*
 * Original library source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * 
 * This is the Arduino code PCA6985 16 channel servo controller
 * to control 32 Servo Motors with ESP32 board without WiFi

  get this code and wiring from for this video:  http://robojax.com/RJT268
 * 
 * This is V4 Video on PCA9685: https://youtu.be/JFdXB8Za5Os
 * 
 * watch the video for details (V1) and demo http://youtu.be/y8X9X10Tn1k

 *  
   
 * Written/updated by Ahmad Shamshiri for Robojax Video channel www.Robojax.com
 * Date: Dec 15, 2019, in Ajax, Ontario, Canada

 * Disclaimer: this code is "AS IS" and for educational purpose only.


or make donation using PayPal http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = 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!
// Watch video V1 to understand the two lines below: http://youtu.be/y8X9X10Tn1k
#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)


int servoNumber = 0;

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

  board1.begin();
  board2.begin();  
  board1.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  board2.setPWMFreq(60);
  //yield();
}

// the code inside loop() has been updated by Robojax
void loop() {


    for( int angle =0; angle<181; angle +=10){
      for(int i=0; i<16; i++)
        {      
            board2.setPWM(i, 0, angleToPulse(angle) );
            board1.setPWM(i, 0, angleToPulse(angle) );
        }
    }
  
// robojax PCA9865 16 channel Servo control
  delay(100);
 
}

/*
 * angleToPulse(int ang)
 * gets angle in degree and returns the pulse width
 * also prints the value on seial 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;
}

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

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

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

ملفات📁

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