الدرس 85: مقدمة إلى محركات السيرفو | دورة الأردوينو خطوة بخطوة
يقدم هذا الدليل الخاص بالمشروع عالم محركات السيرفو ذات الدوران المستمر، والمعروفة أيضًا بمحركات السيرفو بزاوية 360 درجة. على عكس محركات السيرفو القياسية التي تتحرك إلى زاوية محددة (مثل 0 إلى 180 درجة)، تدور هذه المحركات باستمرار في أي من الاتجاهين. وهذا يجعلها مثالية لبناء روبوتات صغيرة، أو مسارات دبابات، أو أي مشروع يتطلب محركات دفع بسيطة وبأسعار معقولة. سيوضح لك هذا الدليل كيفية التحكم في واحد منها باستخدام أردوينو وعدد قليل من أزرار الضغط، مما يمنحك تحكمًا عمليًا في اتجاهه وسرعته.
فيما يلي بعض التطبيقات العملية لمحرك سيرفو بزاوية 360 درجة:
- بناء سيارة روبوتية صغيرة بعجلتين.
- إنشاء حامل كاميرا قابل للتحريك والإمالة يدور بلا نهاية.
- تشغيل حزام ناقل صغير أو رافعة.
- صنع منصة مسح بسيطة للرادار أو أجهزة الاستشعار.

الأجهزة والمكونات
لهذا المشروع، ستحتاج إلى المكونات التالية:
- لوحة أردوينو (مثل Uno)
- محرك سيرفو ذو دوران مستمر (مثل FS90R أو ما شابه)
- ثلاثة أزرار ضغط
- أسلاك توصيل
- لوحة تجارب (اختيارية، لتسهيل التوصيل)
دليل التوصيل
التوصيل لهذا المشروع بسيط ومباشر. يحتوي محرك السيرفو على ثلاثة أسلاك: عادةً بني (أرضي)، وأحمر (طاقة)، وبرتقالي أو أصفر (إشارة). يتم توصيل أزرار الضغط في تكوين بسيط.
فيما يلي تفصيل للتوصيلات:
- محرك السيرفو:
- السلك البني (الأرضي) يتصل بمنفذ GND في الأردوينو.
- السلك الأحمر (الطاقة) يتصل بمنفذ 5V في الأردوينو.
- السلك البرتقالي/الأصفر (الإشارة) يتصل بالمنفذ 9 في الأردوينو.
- أزرار الضغط:
- جانب واحد من كل زر متصل بمنفذ GND في الأردوينو.
- الجانب الآخر من زر "عكس اتجاه عقارب الساعة" يتصل بالمنفذ 2.
- الجانب الآخر من زر "إيقاف" يتصل بالمنفذ 3.
- الجانب الآخر من زر "اتجاه عقارب الساعة" يتصل بالمنفذ 4.
في الفيديو، يؤكد المنشئ على أن سلك إشارة السيرفو يجب أن يتصل بمنفذ يدعم PWM في الأردوينو، والذي غالبًا ما يتم تمييزه برمز التلدة (~). المنفذ 9 هو أحد هذه المنافذ. تستخدم أزرار الضغط المقاومات الداخلية للسحب في الأردوينو، مما يبسط التوصيل بإلغاء الحاجة إلى مقاومات خارجية (في الفيديو عند 07:02).
شرح الكود
تم تصميم الكود لقراءة حالة ثلاثة أزرار ضغط وإرسال الأمر المقابل إلى محرك السيرفو. دعنا نحلل الأجزاء القابلة للتخصيص من قبل المستخدم.
تكوين المنافذ والأوامر
في أعلى الكود، ستجد تعريفات المنافذ وقيم التحكم في السيرفو. هذا هو المكان الذي يمكنك فيه تخصيص سلوك مشروعك.
const int servoPin = 9; // منفذ PWM لإشارة السيرفو
const int stopPin = 3; // منفذ زر الإيقاف
const int cwPin = 4; // منفذ زر اتجاه عقارب الساعة
const int ccwPin = 2; // منفذ زر عكس اتجاه عقارب الساعة
تحدد هذه الثوابت منافذ الأردوينو المتصلة بالأزرار والسيرفو. إذا كنت تستخدم منافذ مختلفة لأزرارك، فستقوم بتغيير الأرقام هنا. يجب أن يكون servoPin منفذًا يدعم PWM.
const int csServoCommand[3] = {106, 52, 0}; // {عكس عقارب الساعة، إيقاف، اتجاه عقارب الساعة}
const String csServoCommandText[3] = {"عكس اتجاه عقارب الساعة", "متوقف", "اتجاه عقارب الساعة"};
هذا هو الجزء الأكثر أهمية لفهمه وضبطه. تحتوي مصفوفة csServoCommand على القيم المرسلة إلى السيرفو. بالنسبة لسيرفو الدوران المستمر، لا تمثل هذه القيم زاوية بل سرعة واتجاهًا.
- 106 هي قيمة الدوران الكامل عكس اتجاه عقارب الساعة.
- 52 هي قيمة التوقف التام.
- 0 هي قيمة الدوران الكامل في اتجاه عقارب الساعة.
هذه القيم ليست عالمية. بسبب اختلافات التصنيع، قد تحتاج قيمة "الإيقاف" (52) إلى تعديل. إذا انجرف السيرفو ببطء عند الضغط على زر الإيقاف، فستحتاج إلى ضبط هذه القيمة بدقة. يوضح الفيديو هذه العملية، موضحًا كيف يمكن أن يؤثر تغيير القيمة إلى 54 أو 51 على سلوك المحرك (في الفيديو عند 13:45).
يمكنك أيضًا ضبط قيم الدوران لتغيير سرعة المحرك. على سبيل المثال، تعيين قيمة عكس اتجاه عقارب الساعة إلى 70 سيجعلها تدور أبطأ من 106 (في الفيديو عند 12:23).
تحتوي مصفوفة csServoCommandText على السلاسل النصية التي تتم طباعتها على الشاشة التسلسلية لإظهار حالة الأمر الحالية.
الدالة المخصصة: servoCommand()
يستخدم الكود دالة مخصصة للتعامل مع منطق الأوامر. تأخذ هذه الدالة رقمًا (0 أو 1 أو 2) كوسيطة، وتحدّث نص الحالة، وترسل الأمر المقابل إلى السيرفو.
void servoCommand(int n) {
statusText = csServoCommandText[n];
myservo.write(csServoCommand[n]);
Serial.println(csServoCommandText[n]);
Serial.println(csServoCommand[n]);
}
يتم استدعاء هذه الدالة من الحلقة الرئيسية عند الضغط على زر. تقوم بمركزة منطق تحديث العرض والتحكم في السيرفو، مما يجعل الكود أنظف وأسهل في التعديل.
المشروع الحي والعرض التوضيحي
في الفيديو، يعرض المنشئ المشروع أثناء العمل. الضغط على زر "اتجاه عقارب الساعة" يرسل القيمة 0 إلى السيرفو، مما يجعله يدور في اتجاه واحد. الضغط على زر "عكس اتجاه عقارب الساعة" يرسل القيمة 106، مما يجعله يدور في الاتجاه الآخر. زر "إيقاف" يرسل 52، والذي يجب أن يوقف المحرك.
يُستخدم جهاز المراقبة التسلسلي (Serial Monitor) لعرض الحالة الحالية والقيمة الدقيقة التي يتم إرسالها إلى السيرفو. وهذا لا يقدر بثمن لتصحيح الأخطاء ولإيجاد قيمة "الإيقاف" المثالية لمحركك المحدد. كما هو مذكور في الفيديو، قد لا يكون أمر الإيقاف مثاليًا بسبب الدوائر الداخلية للسيرفو، وقد تلاحظ انجرافًا بطيئًا أو اهتزازًا. وهذه سمة شائعة في سيرفو الدوران المستمر الأرخص ثمنًا ويمكن تقليلها عن طريق ضبط قيمة الإيقاف في الكود (في الفيديو عند الدقيقة 01:15).
الفصول
- [00:05] مقدمة إلى محرك سيرفو الدوران 360 درجة
- [02:02] نظرة عامة على المكونات والأجهزة
- [02:40] مخطط التوصيلات والوصلات بالتفصيل
- [05:07] شرح الكود: الثوابت والمصفوفات والإعداد
- [09:56] شرح الكود: دالة servoCommand
- [10:54] عرض توضيحي مباشر ومخرجات جهاز المراقبة التسلسلي
- [12:23] ضبط سرعة السيرفو وقيم الإيقاف
/*
* عرض التحكم في سيرفو مستمر (سيرفو 360)
* يسمح لك هذا الكود بالتحكم في سيرفو بزاوية 360 درجة من خلال أمر من شاشة السيريال.
* هذا الموتور السيرفو 350 هو مجرد للمتعة. لا يمكن استخدامه في تطبيقات حقيقية حيث تحتاج إلى تحديد دقيق. احصل على موتور خطوة أو سيرفو موتور مكلف.
*
* تم التعديل بواسطة أحمد شمشيري لموقع Robojax.com
* في يوم الأحد، 1 يوليو 2018، الساعة 11:09 صباحًا في أجاكس، أونتاريو، كندا
* شاهد فيديو تعليمي لهذا المشروع: https://youtu.be/b_xvu6wWafA
* احصل على هذا الكود من Robojax.com
*
* الكود الأصلي بواسطة BARRAGAN <http://barraganstudio.com>
* هذا الكود المثال في الملكية العامة.
* تم التعديل في 8 نوفمبر 2013
* بواسطة سكوت فيتزجيرالد
* http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // إنشاء كائن سيرفو للتحكم في سيرفو
// يمكن إنشاء اثني عشر كائن سيرفو على معظم اللوحات.
int pos = 0; // متغير لتخزين موضع السيرفو
int incomingByte = 0; // لبيانات السيريال الواردة
void setup() {
Serial.begin(9600);
myservo.attach(9); // يربط السيرفو بالمنفذ 9 إلى كائن السيرفو
}
void loop() {
// أرسل البيانات فقط عندما تتلقى البيانات:
if (Serial.available() > 0) {
// اقرأ البايت الوارد:
incomingByte = Serial.read();
// قل ما لديك:
Serial.print("received: ");
Serial.print (incomingByte);
if(incomingByte == 108){
Serial.println(" sent 0 Rotating CW ");
myservo.write(0);
}else if(incomingByte == 114){
Serial.println(" sent 180 Rotating CCW ");
myservo.write(180);
}else if(incomingByte == 60){
Serial.println(" sent Stopped ");
myservo.write(60);
}else{
Serial.println(" moving Randomly");
myservo.write(incomingByte);
}
}
}
/*
*
* Demonstration of Controlling Continuous Servo (360 servo)
360 Servo -2
* This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor.
📚⬇️ Download and resource page https://robojax.com/RJT762
*
* Modified by Ahmad Shamshiri for Robojax.com
* on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
* Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
* Get this code from Robojax.com
*
Original code by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
Modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int servoPin = 9;// this pin must be of those with PWM ~
int pos = 0; // variable to store the servo position
int incomingByte = 0; // for incoming serial data
int CWBS, CCWBS, SBS;
void setup() {
Serial.begin(9600);
pinMode(2,INPUT_PULLUP);// set pin for push button STOP
pinMode(3,INPUT_PULLUP);// set pin for push button CCW
pinMode(4,INPUT_PULLUP);// set pin for push button CW
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
}
void loop() {
CCWBS = digitalRead(2);// read status of button CCW
SBS = digitalRead(3);// read status of button STOP
CWBS = digitalRead(4);// read status of button CW
if(CCWBS == LOW){
Serial.println(" sent 0 Rotaing CW ");
myservo.write(0);
}else if(CWBS == LOW){
Serial.println(" sent 180 Rotaing CCW ");
myservo.write(180);
}else if(SBS == LOW){
Serial.println(" sent Stopped ");
myservo.write(60);
}else{
Serial.println(" moving Random");
myservo.write(48);
}
}// loop
الأشياء التي قد تحتاجها
-
أمازون360 Degree Servo motor on Amazonlink.amazon
-
أمازون
-
إي باي360 Degree Servo motor on eBayebay.us
-
علي إكسبريس360 Degree Servo motor on AliExpresss.click.aliexpress.com
-
علي إكسبريس360 Degree Servo motor on AliExpress-2s.click.aliexpress.com
الموارد والمراجع
ملفات📁
ملفات أخرى
-
ورقة بيانات محرك SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB