لا شك أن التحكم في مصباح لد بواسطة المتحكم الدقيق هو شيء ممتع، و لكن للحركة طعم آخر. توجد من حولك عدة أمثلة للتحكم في محرك بواسطة المتحكم الدقيق من بينها قارئ الأقراص، حركة الماسح الضوئي إلخ.

في هذا النشاط سوف نبين كيفية التحكم في حركة و جهة دوران محور محرط مؤازر.

التحكم في محرك مؤازر

برنامج التطوير لأردوينو يحتوي على عدة أمثلة يمكنك إستغلالها أو الاقتباس منها. كذلك توجد مكتبة servo جاهزة للاستغلال.

يمكن لهذه المكتبة التحكم في عدد من المحركات المؤازة يصل إلى 12.

التعريف بالمكتبة

هذه المكتبة تحتوي على ست تعليمات و هي:

attach()
write()
writeMicroseconds()
read()
attached()
detach()


و ليكي يتسنى استغلال هذه المكتبة يجب التعريف بها في أعلى البرنامج كما يلي:

التعليمة #include <Servo.h>

لاحظ أنه يجب عدم وضع نقطة فاصلة بعد هذه التعليمة.

إستعمال هذه المكتبة يعطل عمل التعليمة analogWrite() (PWM) من المنافذ 9 و 10

الكائن Servo

قبل التمكن من استغلال محرك مؤازر يجب التعريف به و جعله من نوع Servo. و إعطائه إسم ليتسنى تمييزه عن الآخرين.

مثال

#include <Servo.h>

Servo myservo;

التعليمة  attach()

لكي نتحكم في المحرك المؤازر يجب إخبار أردوينو بأي منفذ أوصلناه.

نص التعليمة

myservo.attach(pin)

myservo.attach(pin, min, max)

المعاملات

  • myservo : متغير من نوع Servo
  • pin : رقم المنفذ الموصل بالمحرك المؤازر.
  • min : طول النبضة بالمكرو ثانية (غير ضرورية) و تمثل، الزاوية الدنيا لدوران محور المحرك المؤازر (0o) القيمة الإفتراضية هي 544.
  • max : طول النبضة بالمكرو ثانية (غير ضرورية) و تمثل، الزاوية القصوى لدوران محور المحرك المؤازر (1800) القيمة الإفتراضية هي 2400.

مثال

#include 
Servo myservo;
void setup()
{
myservo.attach(9); // وصل المحرك المؤازر بالمنفذ رقم
}

التعليمة write()

بعد تعريف المحرك المؤازر و تعيين المنفذ، نستعمل هذه التعليمة لإرسال أمر للمحرك لكي يدير محوره بزاوية معينة:

إذا كان لدينا محرك مؤازر عادي أي أن مجمل زاوية دورانه لا تتعدى 3600، هذه التعليمة تدير المحور بالزاوية المعينة.

أما إذا كان لدينا محرك مؤازر يدور دون إنقطاع فإن المعامل يمثل سرعة الدوران:

  • 0 يتحرك المحرك المؤازر بسرعته القصوى
  • 180 يتحرك المحرك المؤازر بسرعته القصوى في الإتجاه المعاكس
  • قيمة قريبة من 90 تجعله يتوقف.

نص التعليمة

myservo.write(angle)

أين angle تمثل القيمة التي ترسل إلى المحرك المؤازر، بين 0 و 180.

مثال

#include 
Servo myservo;
void setup()
{
myservo.attach(9);
myservo.write(90);  // جعل المحور يدور إلى وسط مداه 
}

التعليمة  writeMicroseconds()

تعمل على إرسال قيم بالمكرو ثانية إلى المحرك المؤازر و تقوم بتحريك محوره إلى وضع معين:

إذا كان لدينا محرك مؤازر عادي، تمثل هذه القيمة زاوية دورانه

1000 مكرو ثانية يتحرك المحرك المؤازر إلى أقصى مدى في جهة معينة نحو 00.

2000 مكرو ثانية يتحرك المحرك المؤازر إلى أقصى مدى في الجهة المعاكسة نحو 1800.

1500 مكرو ثانية يتحرك المحرك المؤازر إلى الوسط نحو 900.

يجب الملاحظة أن كثيرا من صناع المحركات المؤازرة لا يتقيدون بهذه القيم. في غالب الأحيان يكون المجال بين 700 و 2300 (راجع عمل التعليمة attach()).

يمكنك تجريب قيم خارج المجال إذا لم يصل المحرك المؤازة ذرواته و لكن إذا سمعت صوت أزيز راجع بسرعة القيم لمخافة أي مشكل (لأن التيار الكهربائي قد يرتفع) و خاصة إذا كان المحرك يُغذى بالكهرباء من لوحة أردوينو. و الأحسن مراجعة تعليمات الصانع.

نص التعليمة

myservo.writeMicroseconds(uS)

أين uS تمثل القيمة المرسلة إلى المحرك المؤازر بالمكروثانية و هي من نوع (int)

مثال

#include  
Servo myservo ;
{
myservo.attach(9);
myservo.writeMicroseconds(1500); // جعل المحور يدور إلى وسط مداه
}

التعليمة  read()

تقوم بقراءة قيمة زاوية دوران محور المحرك المؤازر (المتمثلة في آخر قيمة أُرسلت من طرف التعليمة  write() )

نص التعليمة

myservo.read()

الإرجاع

تُرجع زاوية دوران محور المحرك بين 0 و 180 درجة.

التعليمة​  attached()

هذه التعليمة تتأكد من أن المتغير من نوع Servo هو بالفعل مرتبط بمنفذ معين.

نص التعليمة

myservo.attached()

المعامل

myservo : متغير من نوع Servo.

الإرجاع

تُرجع TRUE إذا كان المحرك المؤازر مرتبط بمنفذ و إلا FALSE.

التعليمة

detach()

هذه التعليمة تفك المتغير من نوع Servo من المنفذ. و تعيد العمل بخاصية تعديل طول النبضة إلى المنفذين 9 و 10.

نص التعليمة

myservo.detach()

المعامل

myservo : متغير من نوع Servo.

ما يلزمنا

  • لوحة أردوينو
  • لوحة تجارب
  • محرك مؤازر
  • أسلاك توصيل.

قم بإنجاز التركيب التالي

servo

إفتح واجهة التطوير و حرر نص البرنامج التالي:

#include 

Servo myservo; 
int pos = 0; 

void setup()
{
myservo.attach(9); 
}

void loop()
{
	for(pos = 0; pos < 180; pos += 1) { 
		myservo.write(pos); 
		delay(15); 
}

for(pos = 180; pos>=1; pos-=1){

myservo.write(pos);
delay(15); 
} 
} 

Serial.println(“Commande Interpreter”);

Serial.println(“_________________________”);

Serial.println(“Input 0 Turn +90 deg. “);

Serial.println(“Input 1 Turn -90 deg. “);

Serial.println(“Input 2 Back to zero “);

Serial.println(“Input 3 Turn +10 deg. “);

Serial.println(“Input 4 Turn -10 deg. “);

Serial.println(“*************************”);

قم بفحص نص البرنامج ثم إرفعه إلى اللوحة.

تلاحظ أن محور المحرك المؤازر يدور بزاوية 180 درجة في جهة ثم يدور ب 180 درجة في الجهة المعاكسة.

لاحظ كذلك أهمية المكتبة servo و التي بها إستطعنا التحكم في حركة محرك مؤازر دون الدخول في تفاصيل عملها و دون العناء من إعادة كتابتها من جديد.

ما تعلمناه

  • مبادئ التحكم في محكم مؤازر
  • كيفية عمل تعليمات المكتبة servo :
  • attach()
  • write()
  • writeMicroseconds()
  • read()
  • attached()
  • detach()

تمرين

قم بانشاء برنامج باستغلال مراقب الوصل بحيث يقوم بالتحكم في المحرك المؤازرو يكون على شكل مفسر الأوامر كما يلي:

مع الأخذ بعين الإعتبار كما في حال التعليمات 3 و 4 أنه إذا وصل المحور إلى المدى الأقصى أن يرجع إلى المدى الأدنى.