آموزش راه اندازی ماژول درایور PWM / سروو 12 بیتی 16 کاناله PCA9685 با آردوینو

فهرست مطالب

ویژگی های ماژول درایور PWM/سروو 12 بیتی 16 کاناله PCA9685

ماژول PCA9685 دارای 16 کانال PWM می‌باشد. این ماژول بسیار پرکاربرد بوده و زمانی که به تعداد زیادی پین خروجی PWM داریم، مورد استفاده قرار می‌گیرد. یکی از مهمترین کابردهای این ماژول کنترل سروو موتورها می‌باشد. با استفاده از این ماژول می‌توانیم تعداد زیادی از سروو موتورها را به طور همزمان کنترل کنیم.

همانطور که گفته شد از درایور PCA9685 می‌توان برای کنترل 16 سروو موتور استفاده کرد. در واقع این ماژول تنها با استفاده از 2 پین I2C میکروکنترلر این کار را انجام می‌دهد. در ضمن می‌توان با اتصال 62 عدد از این درایور ها به هم، 992 عدد سروو موتور را تنها با استفاده از همان 2 پین میکروکنترلر کنترل کرد.

دیگر ویژگی‌های این ماژول :

  • فرکانس قابل تنظیم PWM تا حدود 1.6 کیلوهرتز
  • رزولوشن 12-bit برای هر خروجی

برای راه‌اندازی این ماژول از سروو موتور MG-995 استفاده می‌کنیم. ولتاژ اعمالی این موتور بایستی در بازه 4.8 تا 7.2 ولت باشد. فرکانس این موتور 50 هرتز بوده و دوره زمانی PWM آن 20 میلی‌ثانیه می‌باشد. این موتور دارای 3 پایه به شرح زیر است:

  • PWM: نارنجی
  • VCC: قرمز
  • GND: قهوه‌ای

دیتاشیت PCA9685 را می‌توانید از اینجا دانلود کنید.

معرفی پایه های (Pinout) ماژول درایور PWM/سروو 12 بیتی 16 کاناله PCA9685

ماژول درایور 16 کاناله PCA9685 دارای پایه‌هایی به شرح زیر است:

پایه های قدرت:

  • VCC: تغذیه ماژول
  • GND: زمین
  • +V: تغذیه سروو موتورها- ولتاژ این تغذیه بایستی 5-6 ولت باشد.
  • IN2: پایه کنترلی 2

پایه های کنترل:

  • SCL: پایه کلاک I2C
  • SDA: پایه دیتای I2C
  • OE: پایه فعالسازی خروجی – اگر این پایه HIGH باشد، خروجی‌های ماژول غیرفعال می‌شوند.

پایه های خروجی:

  • PWM: خروجی PWM
  • +V: تغذیه خروجی
  • GND: زمین
اخطار

ولتاژ  VCC فقط برای تغذیه ماژول می‌باشد. اگر از سروو موتور یا LED در خروجی استفاده می‌کنید، +V را به منبع تغذیه مناسب متصل کنید.

پین اوت (Pinout) این ماژول را می توانید در تصویر زیر مشاهده کنید.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو UNO R3 × 1
ماژول درایور PWM / سروو 12 بیتی 16 کاناله PCA9685 × 1
موتور سروو دنده فلزی MG995 توان 13 کیلو - 180 درجه × 4
سیم جامپر نری-مادگی × 1

نرم افزارهای مورد نیاز

آردوینو IDE
تذکر
برای ادامه آموزش راه‌اندازی، می‌توانید به تعداد دلخواه 1 تا 16 عدد سروو موتور تهیه نمایید. ما در این آموزش از 4 عدد سروو موتور استفاده کرده‌ایم.

راه اندازی ماژول درایور PWM/سروو 12 بیتی 16 کاناله PCA9685 با آردوینو

گام اول: سیم بندی

مطابق مدار زیر ماژول را به آردوینو و سروو موتورها وصل کنید.

اخطار
به دلیل اینکه ولتاژ کاری موتور 5-6 ولت است، هرگز از منبع تغذیه بالاتر از آن استفاده نکنید.

گام دوم: نصب کتابخانه

به Library manager رفته و کلمه Servo را سرچ کنید و در ادامه مطابق با تصویر زیر کتابخانه آن با نام Adafruit PWM Servo Driver Library را نصب کنید.

توجه

اگر برای نصب کتابخانه نیاز به راهنمایی بیشتر دارید، به اینجا مراجعه کنید.

گام سوم: کد

کد زیر را روی آردوینو خود آپلود کنید.

 /*
  PCA9685-16Channel-12bit-PWM-Servo-Driver
  modified on 16 Dec 2020
  by Amir Mohammad Shojaee @ Electropeak
  
Home
based on Arduino - Adafruit library */ #include <Wire.h> #include <Adafruit_PWMServoDriver.h> // called this way, it uses the default address 0x40 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); #define SERVOMIN 150 // This is the 'minimum' pulse length count (out of 4096) #define SERVOMAX 600 // This is the 'maximum' pulse length count (out of 4096) #define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150 #define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600 #define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates // our servo # counter uint8_t servonum = 0; void setup() { Serial.begin(9600); Serial.println("4 channel Servo test!"); pwm.begin(); pwm.setOscillatorFrequency(27000000); pwm.setPWMFreq(SERVO_FREQ); // Analog servos run at ~50 Hz updates delay(10); } // You can use this function if you'd like to set the pulse length in seconds // e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. It's not precise! void setServoPulse(uint8_t n, double pulse) { double pulselength; pulselength = 1000000; // 1,000,000 us per second pulselength /= SERVO_FREQ; // Analog servos run at ~60 Hz updates Serial.print(pulselength); Serial.println(" us per period"); pulselength /= 4096; // 12 bits of resolution Serial.print(pulselength); Serial.println(" us per bit"); pulse *= 1000000; // convert input seconds to us pulse /= pulselength; Serial.println(pulse); pwm.setPWM(n, 0, pulse); } void loop() { // Drive each servo one at a time using setPWM() Serial.println(servonum); for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) { pwm.setPWM(servonum, 0, pulselen); } delay(500); for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) { pwm.setPWM(servonum, 0, pulselen); } delay(500); servonum++; if (servonum > 3) servonum = 0; // Testing the first 4 servo channels }

در ابتدای این برنامه دو کتابخانه مورد نیاز پیوست شده است. در ادامه داده‌های مربوط به سروو موتور ثبت می‌شود. در ادامه و در حلقه اصلی برنامه، هر استپر موتور به ترتیب 180 درجه در جهت مستقیم و 180 درجه هم در جهت معکوس می‌چرخند. فقط دقت داشته باشید اگر از تعداد سروو موتورهای بیشتر یا کمتر از 4 عدد استفاده می‌کنید، تعداد آن را در خط آخر برنامه تغییر دهید.

تصویر زیر خروجی سریال مانیتور می‌باشد. زمانی که هر کدام از سروو موتورها به چرخش در می‌آید، شماره آن نیز در سریال مانیتور ظاهر می‌گردد.

آموزش های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.