شِفر (کود) جستجو

شِفر (کود) آردوینو و ویدیو برای کنترل‌کننده سروو 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 را تضمین می‌کند.

جزئیات مشخصات فنی

تولیدکنندهNXP نیمه‌هادی
شماره قطعه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 (بالا)
افت ولتاژ روی مقاومت RDS(روشن)/ اشباعحداکثر 0.5 ولت
محدودیت‌های حرارتی-40 °C تا 125 °C
بستهHTSSOP-28
یادداشت‌ها / نسخه‌هاکنترل‌کننده PWM 16 کاناله

  • اطمینان حاصل کنید که یک منبع تغذیه ۵ ولت با جریان کافی دارید (۱ آمپر توصیه می‌شود).
  • برای جلوگیری از آسیب، سرووها را مستقیماً از آردوینو تغذیه نکنید.
  • از پایه‌های صحیح 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 به آردوینو، ابتدا با وصل کردن تغذیه و زمین شروع کنید. پایه VCC روی PCA9685 را به خروجی 5V آردوینو وصل کنید. سپس پایه GND روی PCA9685 را به GND آردوینو متصل کنید. در ادامه پایه SDA روی PCA9685 را به پایه A4 آردوینو و پایه SCL را به پایه A5 وصل کنید.

برای سرووها، سیم سیگنال را به کانال مربوطه روی PCA9685 متصل کنید (مثلاً CH0 برای سرووی اول)، سیم تغذیه را به یک منبع تغذیه جداگانه وصل کنید (زیرا سرووها ممکن است جریان بیشتری نسبت به آنچه Arduino می‌تواند تأمین کند نیاز داشته باشند)، و سیم زمین را به زمین مشترک با 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
 * این شِفر (کود) آردوینو برای کنترلر سروو 16 کاناله PCA9685 است.
 * برای جزئیات و دمو ویدیو را مشاهده کنید: http://youtu.be/y8X9X10Tn1k
 * 
 * نوشته شده توسط احمد نجربی برای کانال ویدیویی روبوجکس: www.Robojax.com
 * تاریخ: 15 دسامبر 2017، در اِجَکس، انتاریو، کانادا
 * اجازه انتشار این شِفر (کود) داده شده است به شرطی که این
 * یادداشت همراه شِفر (کود) باشد.
 * سلب مسئولیت: این شِفر (کود) "به صورت موجود" و فقط برای اهداف آموزشی ارائه شده است.
 * 
 * /
 * /***************************************************
 * این یک مثال برای درایور PWM و سروو 16 کاناله آدافرویت است.
 * آزمایش سروو - این شِفر (کود) 16 سروو را یکی بعد از دیگری راه‌اندازی می‌کند.
 * 
 * امروز یکی را از فروشگاه آدافرویت خریداری کنید!
 * ------> http://www.adafruit.com/products/815
 * 
 * این نمایشگرها از I2C برای ارتباط استفاده می‌کنند؛ برای
 * رابطه نیاز به 2 پایه است. برای آردوینو UNO، SCL -> آنالوگ 5، SDA -> آنالوگ 4 است.
 * 
 * آدافرویت زمان و منابعی را صرف ارائه این شِفر (کود) منبع باز می‌کند،
 * لطفاً با خرید محصولات از آدافرویت از آدافرویت و سخت‌افزار منبع باز حمایت کنید!
 * 
 * نوشته شده توسط لیمور فرید/لیدیادا برای صنایع آدافرویت.
 * مجوز BSD، تمام متن بالا باید در هر توزیع کپی شود.
 */
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

 // به این صورت نامیده می‌شود، از آدرس پیش‌فرض 0x40 استفاده می‌کند.
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
 // شما همچنین می‌توانید آن را با آدرس متفاوتی که می‌خواهید تماس بگیرید.
 // آدافرات_PWMServoDriver pwm = آدافرات_PWMServoDriver(0x41);

 // بسته به نوع سروو شما، حداقل و حداکثر عرض پالس ممکن است متفاوت باشد; شما
 // می‌خواهم این‌ها تا حد ممکن کوچک/بزرگ باشند بدون اینکه به حد سخت برخورد کنند.
 // برای حداکثر برد. شما باید آنها را به صورت لازم تنظیم کنید تا با سرووهایی که دارید مطابقت داشته باشند.
 // داشته باشید!
#define SERVOMIN  125 // این تعداد 'حداقل' طول پالس است (از ۴۰۹۶)
#define SERVOMAX  575 // این تعداد طول پالس 'حداکثری' است (از ۴۰۹۶)

 // سرور شماره ما
uint8_t servonum = 0;

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

  pwm.begin();

  pwm.setPWMFreq(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);


}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

منابع و مراجع

هنوز هیچ منبعی موجود نیست.

فایل‌ها📁

کتابخانه‌های آردوینو (zip)