این ماژول یک برد بر پایه چیپ PCA9685 می باشد . PCA9685 یک درایور 16 کاناله LED است ، اما در این ماژول پین های PCA9685 در جهت کنترل سروو موتور گسترش داده شده است . این ماژول به صورت یک درایور PWM با 16 خروجی می باشد که می توان توسط آن 16 عدد سرو موتور را تنها از طریق دو پین کنترل کرد . در میکروکنترلر هایی که تعداد پین های خروجی PWM آن ها کم است ، به راحتی می توان توسط این ماژول خروجی PWM آن را به 16 کانال گسترش داد . در این ماژول برای هر کانال خروجی ، سه پین هدر در نظر گرفته شده است که دو پین آن مربوط به تغذیه سرو موتور و یک پین آن خروجی PWM می باشد . علاوه بر سرو موتور ، می توان از این ماژول جهت داریو کردن LED استفاده کرد ، اما این ماژول به بهترین شکل ممکن برای راه اندازی سروو طراحی شده است . سرو موتور ها ، موتور هایی با قابلیت تنظیم میزان حرکت می باشند که از طریق یک پین ، کنترل می شوند (دو پین تغذیه و یک پین ورودی سیگنال PWM ) . ارتباط این ماژول با MCU به صورت I2C است لذا می توان چندین ماژول را از طریق تنها دو پین ارتباطی کنترل کرد .در راه اندازی سرو موتور ها ، باید از خروجی های PWM واحد MCU استفاده شود . اما در بعضی از میکروکنترلر ها تعداد پین های خروجی PWM کم است ، در این حالت می توان با استفاده از این ماژول پین های PWM واحد MCU را به 16 تا گسترش داد. به طور مثال در ساخت و راه اندازی ربات های عنکبوت نیاز به چندین سروو موتور می باشد که به راحتی توسط این ماژول می توان این سروو ها را از طریق رابط I2C کنترل کرد .
مشخصات :
- ولتاژ تغذیه 2.7 تا 5.5 ولت
- دارای ارتباط I2C
- دارای 16 کانال خروجی
- گسترش خروجی ها به 3 پین برای اتصال به سرو موتور
- دارای ترمینال اتصال تغذیه موتور ها
- امکان گسترش ماژول تا 62 ماژول ( راه اندازی 992 سروو موتور )
- دارای LED نشانگر اتصال تغذیه
- امکان تغییر آدرس ارتباط I2C (پشتیبانی از 64 آدرس )
پین های ماژول PCA9685 :
در این ماژول سه سری پین هدر به صورت زیر وجود دارد :
- 16 عدد پین هدر 3 تایی برای اتصال به سروو موتور ها
- یک ردیف پین هدر 6 تایی در سمت چپ ماژول برای اتصال به MCU
- یک ردیف پین هدر 6 تایی در سمت راست ماژول برای گسترش ماژول
راه اندازی ماژول PCA9685 توسط آردوینو :
در برنامه زیر از کتابخانه Adafruit_PWMServoDriver استفاده شده است که می توانید از این لینک آن را دانلود کنید .
#include <Wire.h>//https://www.arduino.cc/en/reference/wire #include <Adafruit_PWMServoDriver.h>//https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library //Constants #define nbPCAServo 16 //Parameters int MIN_IMP [nbPCAServo] ={500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500}; int MAX_IMP [nbPCAServo] ={2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500}; int MIN_ANG [nbPCAServo] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int MAX_ANG [nbPCAServo] ={180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180}; //Objects Adafruit_PWMServoDriver pca= Adafruit_PWMServoDriver(0x40); void setup(){ //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); pca.begin(); pca.setPWMFreq(60); // Analog servos run at ~60 Hz updates } void loop(){ pcaScenario(); } void pcaScenario(){/* function pcaScenario */ ////Scenario to test servomotors controlled by PCA9685 I2C Module for (int i=0; i<nbPCAServo; i++) { Serial.print("Servo"); Serial.println(i); //int middleVal=((MAX_IMP[i]+MIN_IMP[i])/2)/20000*4096; // conversion µs to pwmval //pca.setPWM(i,0,middleVal); for(int pos=(MAX_IMP[i]+MIN_IMP[i])/2;pos<MAX_IMP[i];pos+=10){ pca.writeMicroseconds(i,pos);delay(10); } for(int pos=MAX_IMP[i];pos>MIN_IMP[i];pos-=10){ pca.writeMicroseconds(i,pos);delay(10); } for(int pos=MIN_IMP[i];pos<(MAX_IMP[i]+MIN_IMP[i])/2;pos+=10){ pca.writeMicroseconds(i,pos);delay(10); } pca.setPin(i,0,true); // deactivate pin i } } int jointToImp(double x,int i){/* function jointToImp */ ////Convert joint angle into pwm command value int imp=(x - MIN_ANG[i]) * (MAX_IMP[i]-MIN_IMP[i]) / (MAX_ANG[i]-MIN_ANG[i]) + MIN_IMP[i]; imp=max(imp,MIN_IMP[i]); imp=min(imp,MAX_IMP[i]); return imp; }