- ابزارآلات و آهنربا
-
ابزارآلات
- ابزار اندازه گیری (مولتیمتر، کولیس و . . .)
- ابزار سوراخکاری (مته، سه نظام، چهار نظام، پنج نظام و . . .)
- ابزار و تجهیزات کار (پیچ گوشتی، انبردست، سیمچین، پنس و . . .)
- برد بورد، فیبر خام و سوراخدار (فیبر مدار چاپی و PCB)
- پیچ و اسپیسر (پیچ و مهره رباتیک و اسپیسر پلاستیکی و فلزی)
- سیم و کابل (سیم افشان، فلت، باندی، کابل شارژ، پرینتر، و . . .)
- لحیمکاری (هویه، نوک هویه، پایه هویه، سیم لحیم، روغن لحیم و . . . )
- منبع تغذیه، باتری و جاباتری (باتری قلمی، نیم قلمی، کتابی و . . . )
-
ابزارآلات
- برد هوشمند
- پرینتر سه بعدی
- رباتیک و پروازی
- ماژول
- قطعات الکترونیک
- کیت الکترونیکی و انواع جعبه
- موتور
- اصناف مختلف
کامل ترین آموزش راه اندازی سروو موتور با آردوینو
در این مطلب از بلاگ بهنام رباتیک ابتدا میبینیم که سروو موتورها چگونه کار میکنند و سپس به سراغ آموزش راه اندازی سروو موتور با آردوینو میرویم. دلیل استفاده از سروو موتورها در بسیاری از پروژههای آردوینو این است که هم کاربری آسانی دارند و هم به راحتی میتوان به وسیله آنها موقعیتهای مختلف را کنترل کرد. سروو موتورها برای استفاده در پروژههای رباتیک، اتوماسیونسازی، مدلهای RC و . . . بینظیر هستند.
فهرست مطالب
آشنایی با سروو موتورها پیش از آغاز پروژه راه اندازی سروو موتور با آردوینو
سروو موتور یک سیستم حلقه بسته (Closed-loop) است که از بازخورد موقعیت بهره میبرد تا حرکت و محل قرارگیری نهایی را مشخص کند. سروو موتورهای مختلفی در بازار وجود دارند اما مهمترین و اصلیترین ویژگی همه آنها، قابلیت کنترل دقیق شفت میباشد.
در سروو موتورهای صنعتی، سنسور بازخورد موقعیت غالباً یک انکودر بسیار دقیق است حال آنکه در سروو موتورهای معمولی، این سنسور یک پتانسیومتر میباشد. موقعیت دقیق دریافت شده توسط این دستگاهها، به تشخیصدهنده خطا ارسال میشود تا با موقعیت نهایی و هدف مقایسه گردد. در ادامه و طبق خطا، کنترلکننده موقعیت درست موتور را اصلاح میکند تا با موقعیت نهایی و مدنظر هماهنگ شود.
در مطلب کنترل و راه اندازی سروو موتور با آردوینو، با نوع معمولی سروو موتورها کار میکنیم و به شما میگوییم که این وسایل چگونه فعالیت خواهند کرد و در نهایت آنها را در یک پروژه آزمایشی راه اندازی سروو موتور با آردوینو به کار خواهیم گرفت.
سروو موتورهای معمولی از نظر اندازه کوچک هستند و برای کنترل ماشینهای اسباببازی، رباتهای ساده و هواپیماهای سرگرمکننده استفاده میشوند. آنها همچنین، به درد دانشجویان مهندسی نیز میخورند تا این افراد در پروژههای خود از آنها بهره ببرند و رباتهای انساننما و . . . طراحی کنند.
سروو موتورها چگونه کار میکنند؟
درون سروو موتورها، چهار قطعه اصلی وجود دارد؛ موتور DC، گیربکس، پتانسیومتر و مدار کنترل. موتور DC استفاده شده سرعت بالا و گشتاور پایینی دارد اما گیربکس سرعت را به تعداد 60 دور در دقیقه کاهش و همزمان گشتاور را افزایش میدهد.
پتانسیومتر به قسمت آخرین دنده یا شفت خروجی وصل میشود تا همزمانی که موتور میچرخد، پتانسیومتر نیز بچرخد و ولتاژ مناسب زاویه دقیق شفت خروجی ایجاد کند. در مدار کنترل، ولتاژ پتانسیومتر با ولتاژ دریافت شده از خط سیگنال مقایسه میشود تا اگر نیاز بود، کنترلکننده H-Bridge را فعال نماید تا موتور در هر سمتی بچرخد تا اینکه دو سیگنال به اختلاف 0 دست یابند.
یک سروو موتور با ارسال تعدادی پالس از طریق خط سیگنال کنترل میشود. فرکانس سیگنال کنترل میبایست 50 هرتز باشد و یا هر پالس در هر 20 میلیثانیه رخ دهد. عرض پالس موقعیت زاویه سروو را معین میکند. لازم به ذکر است که چنین سروو موتورهایی غالباً 180 درجه میچرخند زیرا از نظر فیزیکی محدودیتهایی دارند.
به طور کلی پالسهای 1 میلیثانیهای با موقعیت مکانی 0 درجهای، پالسهای 1.5 میلیثانیهای با موقعیت مکانی 90 درجهای و پالسهای 2 میلیثانیهای با موقعیت مکانی 180 درجهای سازگار هستند. البته اگرچه حداقل و حداکثر پالسها ممکن است برخی اوقات در بعضی از برندها متفاوت باشد و بعضاً در موقعیت مکانی 0 و 180 درجهای به ترتیب به 0.5 و 2.5 میلیثانیه برسد.
استفاده از سروو موتورهای محبوب برای پروژه راه اندازی سروو موتور با آردوینو
مدلها و تولیدکنندگان مختلفی از سروو موتورها وجود دارند. بر این اساس، مهمترین نکاتی که هنگام خرید سروو موتور باید به آنها توجه کرد، گشتاور، ولتاژ کاری، جریان و ابعاد است.
در این قسمت از مطلب راه اندازی سروو موتور با آردوینو، به SG90 Micro Servo و MG996R به عنوان دو عدد از سروو موتورهای محبوب بازار اشاره میکنیم.
مشخصات فنی سروو موتور SG90 Micro Servo
گشتاور |
|
ولتاژ کاری | 3.5 تا 6 ولت |
جریان بدون بار | 100 میلیآمپر |
جریان گشتاور | 650 میلیآمپر |
حداکثر سرعت | 60 درجه در 0.12 ثانیه |
وزن | 9 گرم |
مشخصات فنی MG996R Servo
گشتاور |
|
ولتاژ کاری | 4.8 تا 7.2 ولت |
جریان بدون بار |
|
جریان گشتاور | 650 میلیآمپر |
حداکثر سرعت | 60 درجه در 0.20 ثانیه |
وزن | 55 گرم |
کنترل و راه اندازی سروو موتور با آردوینو
حال بیایید توضیحاتی که دادیم را رسماً در پروژه راه اندازی سروو موتور با آردوینو به کار ببریم. در اینجا از MG996R که یک سروو موتور گشتاور بالاست و دنده فلزی و گشتاور 10 کیلوگرمی دارد، استفاده میکنیم. این وسیله که با قیمت نسبتاً مناسبی به فروش میرسد، دارای جریان گشتاور 2.5 آمپر میباشد و جریان فعال آن هم از 500 تا 900 میلیآمپر خواهد بود و برای فعالیت به ولتاژ 4.8 تا 7.2 ولت نیاز دارد.
مشخصات فنی مربوط به این سروو موتور نشان میدهد که نمیتوانیم آن را مستقیماً به آردوینو وصل کنیم و برای انجام این کار باید از یک منبع تغذیه جداگانه بهره ببریم.
دیاگرام مدار پروژه راه اندازی سروو موتور با آردوینو
در ادامه دیاگرام مدار پروژه راه اندازی سروو موتور با آردوینو را مشاهده میکنید:
طبق این تصویر، میبایست پین کنترل سروو را به هر کدام از پینهای دیجیتالی آردوینو، پین اتصال به زمین سروو را به پین اتصال به زمین آردوینو و سیمهای مثبت سروو موتور را به منبع تغذیه 5 ولت اکسترنال وصل کنیم.
در صورتی که از سروو موتور کوچکتری نظیر S90 Micro Servo استفاده میکنید، میتوانید انرژی آن را مستقیماً از پین 5 ولت آردوینو دریافت نمایید.
سروو موتور S90 جریان مصرفی کمتر (حدود 100 تا 200 میلیآمپر) و جریان بدون بار ناچیزی دارد ولی جریان گشتاور آن بین 500 تا 700 میلیآمپر است. در سمت دیگر، اگر آردوینو از طریق پورت USB تغذیه شود، پین 5 ولتی آن میتواند تنها 500 میلیآمپر خروجی ارائه دهد و یا حداکثر با کانکتور مخصوص، این جریان به 1 آمپر برسد.
اگرچه میتوان این سروو موتورهای 9 گرمی را مستقیماً با آردوینو راهاندازی کرد ولی برای فعالیت یکپارچه و یکسان، بهتر است همیشه از یک منبع تغذیه اکسترنال و مستقل استفاده شود.
کدهای مربوط به پروژه راه اندازی سروو موتور با آردوینو
اینک سراغ مرحله کدنویسی پروژه کنترل و راه اندازی سروو موتور با آردوینو میرویم. کدهای نوشته شده بسیار ساده هستند زیرا فقط باید پین مخصوصی که سروو موتور به آن وصل شده را مشخص و آن را به عنوان خروجی تعریف کنیم و در قسمت Loop نیز پالسهای مختلف را با مدت زمان به خصوص و فرکانس معین، تعمیم دهیم.
/*
Servo Motor Control - 50Hz Pulse Train Generator
by Behnam-Robotic, https://behnamrobotic.com
*/
#define servoPin 9
void setup() {
pinMode(servoPin, OUTPUT);
}
void loop() {
// A pulse each 20ms
digitalWrite(servoPin, HIGH);
delayMicroseconds(1450); // Duration of the pusle in microseconds
digitalWrite(servoPin, LOW);
delayMicroseconds(18550); // 20ms - duration of the pusle
// Pulses duration: 600 - 0deg; 1450 - 90deg; 2300 - 180deg
}
پس از چندین بررسی، میتوانیم مدت زمان پالسهایی که با سروو موتور استفاده شده سازگار هستند را تشخیص دهیم. پالسهای 0.6 میلیثانیهای دارای موقعیت 0 درجهای، پالسهای 1.45 میلیثانیهای دارای موقعیت 90 درجهای و پالسهای 2.3 میلیثانیهای دارای موقعیت 180 درجهای میباشند.
برای اینکه جریان کشیده شده توسط هر سروو موتور را اندازه بگیریم، از مولتیمتر استفاده میکنیم. حداکثر جریانی که به ثبت رسید، 0.63 آمپر بود. دلیل این اتفاق آن است که سروو موتور به کار رفته در اینجا نمونه اصلی TowerPro MG996R نیست و عملکرد مشخصاً ضعیفتری دارد.
به هر ترتیب، در ادامه به چگونگی راه اندازی سروو موتور با آردوینو اشاره میکنیم. ابتدا باید از کتابخانه سروو آردوینو بهره ببریم.
/*
Servo Motor Control using the Arduino Servo Library
by Behnam-Robotic, https://behnamrobotic.com
*/
#include
Servo myservo; // create servo object to control a servo
void setup() {
myservo.attach(9,600,2300); // (pin, min, max)
}
void loop() {
myservo.write(0); // tell servo to go to a particular angle
delay(1000);
myservo.write(90);
delay(500);
myservo.write(135);
delay(500);
myservo.write(180);
delay(1500);
}
در اینجا باید کتابخانه و هدف سروو موتور را انتخاب کنیم و از تابع attach() بهره ببریم تا پین مدنظر برای وصل کردن سروو و حداقل و حداکثر مقدار مدت پالسها را تعیین نماییم. در ادامه، با استفاده از تابع write() موقعیت مکانی سروو را از 0 تا 80 مشخص خواهیم کرد.
کنترل و راه اندازی چندین سروو موتور با آردوینو
کتابخانه مخصوص سروو موتورها این امکان را به ما میدهد تا در آنِ واحد 12 سروو موتور را با اکثر بردهای آردوینو کنترل کنیم. البته در برد آردوینو مگا میتوان این کار را با 48 سروو موتور انجام داد. علاوه بر اینها، کنترل و راه اندازی چندین سروو موتور با آردوینو بسیار آسان است.
در ادامه نمونهای از یک کد برای راه اندازی چند سروو موتور با آردوینو آورده شده است:
/*
Controlling multiple servo motors with Arduino
by Behnam-Robotic, https://behnamrobotic.com
*/
#include
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
void setup() {
servo1.attach(8);
servo2.attach(9);
servo3.attach(10);
servo4.attach(11);
servo5.attach(12);
}
void loop() {
// move all servos to position 0
servo1.write(0);
servo2.write(0);
servo3.write(0);
servo4.write(0);
servo5.write(0);
delay(2000);
// move all servos to position 90
servo1.write(90);
servo2.write(90);
servo3.write(90);
servo4.write(90);
servo5.write(90);
delay(2000);
// move all servos to position 180
servo1.write(180);
servo2.write(180);
servo3.write(180);
servo4.write(180);
servo5.write(180);
delay(2000);
}
با این اوصاف، باید از کلاس سروو، برای هر کدام از موتورها، هدف تعیین کنیم تا بگوییم کدام پین آردوینو وصل شده است. این نکته را مدنظر داشته باشید که میتوان هر سروو موتور را برای جابهجا شدن در هر مسیری و در هر زمانی تنظیم کرد.
راه اندازی سروو موتور با آردوینو و درایور سروو PCA9685
دیگر روش راه اندازی سروو موتور با آردوینو، استفاده از درایور PCA9685 است. این سروو درایور 16 کاناله 12 بیتی PWM، با استفاده از رابط I2C با آردوینو ارتباط برقرار میکند. همچنین، این درایور قابلیتی دارد که میتواند تا 16 سروو موتور را به صورت همزمان یا جداگانه کنترل کند.
نکته جالبتر در مورد این درایور آنکه میتوانیم 62 عدد از آنها را از طریق رابط I2C به یکدیگر مرتبط نماییم. بر این اساس، روی کاغذ قادر خواهیم بود تا 992 سروو موتور را تنها با استفاده از پینهای I2C آردوینو کنترل کنیم. 6 پین انتخاب آدرس برای تنظیم رابطهای I2C مختلف از درایورهای اضافه به کار میروند. با این اوصاف، فقط باید صفحات را مطابق تصویر زیر وصل کنیم.
در ادامه نیز شماتیک مدار را میبینید. بار دیگر تکرار میکنیم که برای تأمین انرژی سروو موتورها، به منبع تغذیه جداگانه و مستقل نیاز خواهیم داشت.
حالا بد نیست به کدهای مربوطه نگاهی بیندازیم. برای کنترل درایور PCA9685 به کتابخانه آن که از گیتهاب قابل دانلود است، نیاز خواهیم داشت.
/*
Servo Motor Control using Arduino and PCA9685 Driver
by Behnam-Robotic, https://behnamrobotic.com
Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/
#include
#include "PCA9685.h"
PCA9685 driver;
// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)
// Second Servo
// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)
void setup() {
Wire.begin(); // Wire must be started first
Wire.setClock(400000); // Supported baud rates are 100kHz, 400kHz, and 1000kHz
driver.resetDevices(); // Software resets all PCA9685 devices on Wire line
driver.init(B000000); // Address pins A5-A0 set to B000000
driver.setPWMFrequency(50); // Set frequency to 50Hz
}
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
delay(1000);
}
در اینجا اول باید کتابخانههای مدنظر را وارد و اهداف PCA9685 را مشخص کنیم. سپس با استفاده از Servo_Evaluator مدت زمان پالسها و یا خروجی PWM درایور را تعیین نماییم. توجه داشته باشید که خروجیها 12 بیتی هستند. بر این اساس، حداقل مدت پالس 0.5 یا 0 درجه خواهد بود که تعداد مرحلههای آن به 102 عدد میرسد و حداکثر مدت زمان پالس 2.5 میلیثانیه یا 180 درجه بر 512 مرحله میباشد. البته همانطور که توضیح دادیم، باید این اعداد و ارقام را با توجه به سروو موتوری که دارید تنظیم کنید.
در قسمت Setup، میبایست سرعت رابط I2C، آدرس درایور و فرکانس را روی 50 هرتز تنظیم کنیم.
در قسمت Loop، با استفاده از توابع setChannelPWM() و pwmForAngle() سروو موتور را روی زاویه مدنظر تنظیم خواهیم کرد.
در ادامه اگر درایور دوم را وصل کنید، مطابق انتظار، مانند درایور اول جایگیری نخواهد کرد. دلیل این اتفاق، استفاده از نمونههای غیر اصلی درایورها میباشد به همین خاطر نتایج قابل اعتمادی به دست نمیآید. با این حال، این موضوع مشکلساز نخواهد بود زیرا با استفاده از Servo_Evaluator میتوان تنظیمات خروجی مختلفی را برگزید. در این شرایط، همه سروو موتورها یک شکل کار خواهند کرد و زاویه دقیقی خواهند داشت.
کنترل و راه اندازی چندین سروو موتور با آردوینو و درایور PCA9685
در ادامه به بررسی یک مثال و کنترل تعداد زیادی از سروو موتورها با درایورهای PCA9685 میپردازیم.
برای انجام این کار، باید درایورها را به یکدیگر و به صفحههای مختلف وصل کنیم. در ادامه شماتیک مدار را میبینید:
کدهای پروژه راه اندازی سروو موتور با آردوینو و درایور PCA9685 نیز در ادامه آورده شدهاند:
/*
Servo Motor Control using Arduino and PCA9685 Driver
by Behnam-Robotic, https://behnamrobotic.com
Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/
#include
#include "PCA9685.h"
PCA9685 driver;
// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)
// Second Servo
PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)
void setup() {
Wire.begin(); // Wire must be started first
Wire.setClock(400000); // Supported baud rates are 100kHz, 400kHz, and 1000kHz
driver.resetDevices(); // Software resets all PCA9685 devices on Wire line
driver.init(B000000); // Address pins A5-A0 set to B000000
driver.setPWMFrequency(50); // Set frequency to 50Hz
}
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
delay(1000);
}
بر اساس کدهای نوشته شده، باید برای هر درایور یک هدف PCA9685 جداگانه بنویسیم و آدرسها را برای هر درایور معین کنیم و فرکانس را روی 50 هرتز بگذاریم. سپس با بهرهگیری از توابع setChannelPWM() و pwmForAngle() میتوانیم هر سروو موتور با هر نوع درایوری را در هر زاویهای که میخواهیم، تنظیم کنیم.
عیب یابی پروژه کنترل و راه اندازی سروو موتور با آردوینو
در صورتی که از سروو موتورهای معمولی استفاده کنید، رخ دادن این مشکل طبیعی خواهد بود. علت آن است که Servoهایی مانند SG90 و MG996R میتوانند مقدار زیادی از جریان را در زمان فعالیت بکشند. همین سبب میشود تا به خصوص در مواقع تأمین نیرو از طریق پین 5 ولتی، برد آردوینو ریست گردد.
برای حل این مشکل، میتوانید از یک خازن در پینهای اتصال به زمین (GND) و 5 ولت استفاده کنید. این خازن به عنوان جداکننده فعالیت خواهد کرد تا جریان مورد نیاز سیستم را در زمان فعالیت موتور DC تأمین نماید.
این هم یکی دیگر از مشکلات رایج در سروو موتورهای معمولی است. همانگونه که گفتیم، پالس عرض 1 یا 0.5 میلیثانیهای برابر با موقعیت 0 درجهای و پالس عرض 2 میلیثانیهای برابر با موقعیت 180 درجهای خواهد بود. با این حال، این مقدار ممکن است در هر سروو موتور ساخت شرکتهای مختلف متفاوت باشد.
برای حل این مشکل، باید عرض پالس ارسالی به سروو موتور را با آردوینو عوض کنیم. خوشبختانه با استفاده از کتابخانه Servo آردوینو و تابع attach() میتوانیم به آسانی این کار را انجام دهیم.
تابع attach() میتواند دو پارامتر اضافی یعنی حداقل و حداکثر عرض پالس بر مبنای میکروثانیه را دریافت کند. مقدار پیشفرض 544 میکروثانیه (0.544 میلیثانیه) برای حداقل و 2400 میکروثانیه (2.4 میلیثانیه) برای حداکثر است. بر این اساس، با تنظیم این مقادیر، میتوانیم موقعیت دلخواه سروو موتور را مشخص کنیم.
جمعبندی
سعی شد در مطلب راه اندازی سروو موتور با آردوینو، هر آنچه که لازم است در مورد این پروژه بدانید را گردآوری کرده باشیم. البته میدانیم که شرکتهای مختلفی اقدام به تولید سروو موتورها میکنند و هر کدام نیز مشخصات خاص خودشان را دارند ولی کلیت کار همانی است که گفتیم.
شما با یادگیری نحوه راه اندازی سروو موتور با آردوینو، میتوانید پروژههای بیشمار و نامحدود رباتیک، اتوماسیون و . . . بسازید اما توجه داشته باشید که انتخاب و خرید سروو موتور مناسب نیز اهمیت دارد.
سؤالات پرتکرار درباره پروژه راه اندازی سروو موتور با آردوینو
راه اندازی سروو موتور با آردوینو بسیار ساده است. سروو موتور سه سیم دارد که دو عدد از آنها اتصال به زمین (GND) و پاور هستند و سیم سوم نیز برای وصل شدن به آردوینو و کنترل آن به کار میرود.
میتوانیم مستقیماً از طریق آردوینو سروو موتورها را راهاندازی کنیم ولی شاید مشکلی از نظر تأمین انرژی به وجود بیاید. مثلاً اگر سروو موتور بیش از 500 میلیآمپر جریان میکشد، ممکن است آردوینو خاموش یا ریست شود بنابراین بهتر است همیشه از یک منبع نیروی جداگانه و مستقل برای سروو موتورها استفاده کنیم.
با استفاده از کتابخانه Servo آردوینو میتوان تا 12 سروو موتور را با اکثر بردهای آردوینو راهاندازی کرد اما با برد آردوینو مگا تعداد آنها به 48 عدد خواهد رسید. البته در این شرایط باید از یک منبع نیروی مستقل برای سروو موتورها استفاده کنیم.