الدرس 89: استخدام محرك سيرفو مستمر أو 360 درجة | دورة الأردوينو خطوة بخطوة
هل سبق لك أن أردت تدوير محرك في أي اتجاه للمدة التي تريدها، بدلاً من مجرد التأرجح ذهابًا وإيابًا مثل السيرفو القياسي؟ هذا هو بالضبط ما يقدمه محرك السيرفو المستمر أو ذو 360 درجة. على عكس السيرفو القياسي الذي يتحرك إلى زاوية محددة (عادة من 0 إلى 180 درجة)، يدور السيرفو المستمر بلا نهاية في اتجاه عقارب الساعة أو عكس اتجاه عقارب الساعة. وهذا يجعله مثاليًا لبناء روبوتات صغيرة، أو منصات كاميرات، أو أي مشروع يتطلب تحكمًا في الدوران المستمر.
في هذا المشروع، سنبني نظام تحكم لسيرفو بزاوية 360 درجة باستخدام ثلاثة أزرار ضغط فقط. ستتمكن من إصدار أمر للسيرفو بالدوران في اتجاه عقارب الساعة، أو عكس اتجاه عقارب الساعة، أو التوقف في أي لحظة. سيرشدك هذا الدليل خلال التوصيلات، ويشرح الأجزاء القابلة للتخصيص من الكود، ويعرض لك عرضًا توضيحيًا مباشرًا للنظام أثناء العمل.
إليك بعض الأفكار العملية لاستخدام سيرفو مستمر في مشاريعك الخاصة:
- بناء روبوت صغير بعجلتين: استخدم سيرفوين مستمرين لقيادة العجلات، مما يسمح بالحركة للأمام والخلف والانعطاف.
- إنشاء حامل كاميرا دوّار ومائل: استخدم سيرفوًا مستمرًا واحدًا للتدوير البطيء اللامتناهي لكاميرا مراقبة أو كاميرا للحياة البرية.
- أتمتة حزام ناقل: تحكم في نظام ناقل صغير لفرز العناصر أو توزيعها.
- تصميم حامل عرض دوّار: اعرض نموذجًا ثلاثي الأبعاد أو منتجًا على منصة تدور باستمرار.
المكونات المطلوبة
- لوحة أردوينو (Uno، Nano، إلخ)
- محرك سيرفو مستمر (360 درجة) (مثل FS90R، DS04-NFC)
- 3 أزرار ضغط
- أسلاك توصيل
- لوحة تجارب (Breadboard)
دليل التوصيل
التوصيل لهذا المشروع بسيط. يحتوي محرك السيرفو على ثلاثة أسلاك: عادةً سلك داكن للأرضي (GND)، وسلك أوسط (غالبًا أحمر) للطاقة (5V)، وسلك أفتح لونًا (برتقالي أو أصفر أو أبيض) للإشارة. كما هو موضح في الفيديو، يتم توصيل السيرفو بالأردوينو على النحو التالي:
- أرضي السيرفو (السلك الداكن): قم بتوصيله بمنفذ GND في الأردوينو.
- طاقة السيرفو (السلك الأوسط/الأحمر): قم بتوصيله بمنفذ 5V في الأردوينو.
- إشارة السيرفو (السلك الفاتح): قم بتوصيله بالمنفذ رقم 9 في الأردوينو.
بالنسبة لأزرار الضغط الثلاثة، كل زر له جانبان. يتم توصيل جانب واحد من جميع الأزرار معًا ثم بمنفذ GND في الأردوينو. يتم توصيل الجانب الآخر من كل زر بمنفذ رقمي منفصل، كما هو موضح أدناه (في الفيديو عند الدقيقة 03:40):
- زر اتجاه عقارب الساعة (CW): قم بتوصيله بالمنفذ رقم 2 في الأردوينو.
- زر التوقف (Stop): قم بتوصيله بالمنفذ رقم 3 في الأردوينو.
- زر عكس اتجاه عقارب الساعة (CCW): قم بتوصيله بالمنفذ رقم 4 في الأردوينو.

شرح الكود
تم تصميم الكود ليكون سهل التخصيص. الجزء الأكثر أهمية الذي ستحتاج إلى ضبطه هو مصفوفة sc[]، التي تحتوي على قيم PWM المحددة المرسلة إلى السيرفو للتحكم في حركاته. هذه القيم ليست عالمية ويجب معايرتها لمحرك السيرفو الخاص بك (في الفيديو عند الدقيقة 12:23).
int sc[]={106, 58, 0};// أوامر السيرفو بالترتيب
//CCW, STOP,CW
هذه المصفوفة هي قلب المعايرة. تُستخدم القيم بهذا الترتيب:
- sc[0] = 106: تُرسل هذه القيمة لجعل السيرفو يدور عكس اتجاه عقارب الساعة.
- sc[1] = 58: هذه هي قيمة "التوقف". بسبب الدوائر الداخلية، تختلف القيمة الدقيقة التي تجعل المحرك يتوقف. قد تجد أن السيرفو يدور ببطء حتى عند إرسال هذا الأمر، وستحتاج إلى ضبط هذا الرقم قليلاً للعثور على قيمة "التوقف التام" الحقيقية لمحركك.
- sc[2] = 0: هذه القيمة تجعل السيرفو يدور في اتجاه عقارب الساعة بأقصى سرعة.
يمكنك ضبط القيم في مصفوفة sc[] لتغيير سرعة الدوران. على سبيل المثال، ضبط sc[0] على 70 سيجعل الدوران عكس اتجاه عقارب الساعة أبطأ. كلما اقتربت القيمة من قيمة "التوقف" (58)، كان دوران المحرك أبطأ في ذلك الاتجاه. القيم الأبعد عن 58 ستزيد السرعة حتى الحد الأقصى.
هناك أيضًا بعض المتغيرات الرئيسية الأخرى التي قد تحتاج إلى تعديلها. تم ضبط servoPin على 9، ويجب أن يكون منفذًا يدعم PWM على لوحة الأردوينو الخاصة بك. يتم تعريف منافذ الأزرار في أعلى الكود ويمكن تغييرها إذا لزم الأمر.
int servoPin = 9;// يجب أن يكون هذا المنفذ من المنافذ التي تدعم PWM ~
#define STOPpin 3 // منفذ زر الضغط للتوقف
#define CWpin 2 // منفذ زر الضغط لاتجاه عقارب الساعة
#define CCWpin 4 // منفذ زر الضغط لعكس اتجاه عقارب الساعة
أخيرًا، تحتوي مصفوفة scText[] على السلاسل النصية التي تتم طباعتها على الشاشة التسلسلية (Serial Monitor) لأغراض التصحيح. يمكنك تغييرها إذا كنت ترغب في عرض رسائل مختلفة.
كيفية استخدام الكود
ارفع الكود المقدم إلى لوحة الأردوينو الخاصة بك. افتح الشاشة التسلسلية (اضبطها على 9600 باود) لرؤية رسائل الحالة. يمكنك الآن التحكم في السيرفو باستخدام الأزرار الثلاثة:
- اضغط مع الاستمرار على زر CW: سيبدأ السيرفو في الدوران في اتجاه عقارب الساعة. ستعرض الشاشة التسلسلية "CW" والقيمة المرسلة.
- اضغط مع الاستمرار على زر CCW: سيبدأ السيرفو في الدوران عكس اتجاه عقارب الساعة. ستعرض الشاشة التسلسلية "CCW" والقيمة المرسلة.
- اضغط على زر التوقف: سيحاول السيرفو التوقف. ستعرض الشاشة التسلسلية "Stop".
إذا لم يتوقف السيرفو تمامًا عند الضغط على زر الإيقاف، فستحتاج إلى معايرة قيمة sc[1] في مصفوفة sc[]. حاول تغيير القيمة قليلاً (على سبيل المثال، من 58 إلى 54 أو 52) وأعد رفع الكود حتى يبقى المحرك ثابتًا تمامًا.
عرض توضيحي مباشر
في الفيديو، يعرض المقدم النظام الكامل. يمكنك رؤية السيرفو يدور في كلا الاتجاهين بناءً على ضغطات الأزرار. كما يتم عرض مخرجات الشاشة التسلسلية، التي تُظهر الحالة الحالية ("CW" أو "Stop" أو "CCW") والقيمة المحددة التي يتم إرسالها إلى السيرفو. هذه أداة رائعة لتصحيح الأخطاء وإيجاد قيم المعايرة المثالية لمحركك الخاص. يوضح العرض أيضًا كيف يؤثر تعديل القيم في مصفوفة sc[] مباشرة على سرعة المحرك، من حركة بطيئة جدًا إلى أقصى سرعة دوران.
الخلاصة
يوفر هذا المشروع طريقة بسيطة وفعالة للتحكم في محرك سيرفو مستمر. من خلال فهم عملية معايرة قيمة "الإيقاف"، يمكنك ضمان تحكم دقيق في مشاريع الروبوتات والأتمتة الخاصة بك.
فصول الفيديو
- [00:05] مقدمة إلى محرك السيرفو المستمر
- [02:02] نظرة عامة على أجهزة السيرفو
- [02:40] مخطط الأسلاك والتوصيلات
- [05:07] شرح الكود: المتغيرات والإعداد
- [08:03] شرح الكود: منطق الحلقة الرئيسية
- [09:56] دالة
servoCommand() - [10:54] عرض توضيحي مباشر ومخرجات الشاشة التسلسلية
- [12:23] معايرة سرعة السيرفو وقيم الإيقاف
++
/*
* S05-13 Servo with 3 push buttons
* Demonstration of Controlling a Continuous Servo (360 servo)
* This code allows you to control a 360-degree servo using push buttons
*
* Modified by Ahmad Shamshiri for Robojax Robojax.com
* on Jan 17, 2019 at 22:42 in Ajax, Ontario, Canada
Watch the video instruction for this sketch: https://youtu.be/hVe4TSRV4ww
Watch Introduction to 360 Servo video with code: https://youtu.be/b_xvu6wWafA
You can get the wiring diagram from my Arduino Course at Udemy.com
Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place
visit my course now http://robojax.com/L/?id=62
If you found this tutorial helpful, please support me so I can continue creating
content like this.
or make a donation using PayPal http://robojax.com/L/?id=64
Original code by BARRAGAN <http://barraganstudio.com>
*
* Code is available at http://robojax.com/learn/arduino
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
* This code has been downloaded from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#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 one of those with PWM ~
#define STOPpin 3 // push button pin for STOP
#define CWpin 2 // push button for CW
#define CCWpin 4 // push button for CCW
int sc[]={106, 58, 0};// servo commands are in order
//CCW, STOP,CW
String scText[]={"CCW","Stop","CW"};// define texts for 3 actions
int statusText;
int CWBS, CCWBS, SBS;
//CW button status (CWBS)
//CCW button status (CCWBS)
//stop button status (SBS)
void setup() {
Serial.begin(9600);
pinMode(STOPpin,INPUT_PULLUP);// set pin for push button STOP
pinMode(CCWpin,INPUT_PULLUP);// set pin for push button CCW
pinMode(CWpin,INPUT_PULLUP);// set pin for push button CW
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
myservo.write(sc[1]);// send STOP command
statusText=1;// initial value is STOP
}
void loop() {
CCWBS = digitalRead(CCWpin);// read status of button CCW
SBS = digitalRead(STOPpin);// read status of button STOP
CWBS = digitalRead(CWpin);// read status of button CW
if(CCWBS ==LOW)
{
servoCommand(0);
}else if(SBS ==LOW)
{
servoCommand(1);
}else if(CWBS ==LOW)
{
servoCommand(2);
}
Serial.println(scText[statusText]);
delay(50);
}// loop
void servoCommand(int n)
{
statusText = n;
myservo.write(sc[n]);
Serial.print("Going to ");
Serial.print(scText[n]);
Serial.print( "(");
Serial.print(sc[n]);
Serial.println(")");
}
الأشياء التي قد تحتاجها
-
أمازون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