كود البحث

الدرس 86: التحكم في موضع محرك سيرفو باستخدام مقياس الجهد

الدرس 86: التحكم في موضع محرك سيرفو باستخدام مقياس الجهد

تخيل أنك تدير مقبضًا بسيطًا وترى ذراعًا ميكانيكية تتبع حركتك بدقة. هذا هو سحر الجمع بين مقياس الجهد (بوتنشيوميتر) ومحرك سيرفو. هذا المشروع، وهو جزء من دورة Arduino خطوة بخطوة من Robojax، يوضح مفهومًا أساسيًا ومفيدًا للغاية في الإلكترونيات: تحويل المدخلات التناظرية إلى حركة فيزيائية دقيقة. ستتعلم كيفية قراءة جهد متغير من مقياس الجهد، وتحويل تلك القيمة إلى نطاق من الزوايا، والتحكم في محرك سيرفو ليدور إلى الموضع المحدد. هذه هي بوابتك لبناء مشاريع تفاعلية وبديهية حيث يلتقي التحكم اليدوي بالأتمتة.

تطبيقات هذه المهارة واسعة وعملية. إليك بعض الأفكار لإلهامك:

  • التحكم في الذراع الآلية: استخدم مقياس الجهد لتحديد موضع كل مفصل في ذراع آلية يدويًا لعمليات التقاط ووضع دقيقة.
  • نظام تحريك الكاميرا (بان وتيلت): قم ببناء حامل كاميرا يتم التحكم فيه عن بُعد للتصوير بفاصل زمني أو المراقبة، مع تحريك سلس للكاميرا بلف القرص.
  • نسخة طبق الأصل من مقياس تناظري: أنشئ مقياس لوحة قيادة فيزيائيًا (مثل عداد السرعة أو قرص درجة الحرارة) يتحرك بناءً على بيانات المستشعر، مع استخدام مقياس الجهد كأداة تجاوز يدوي أو معايرة.
  • منشآت فنية تفاعلية: أنشئ منحوتات حركية تستجيب لمدخلات المشاهد، حيث يؤدي لف القرص إلى تغيير موضع الأجزاء المتحركة.
  • توجيه مركبات النماذج: تحكم في زاوية توجيه سيارة أو قارب نموذجي عن بُعد، مما يوفر إحساسًا تناظريًا أكثر بديهية من الأزرار الرقمية.

يعتمد هذا الدليل على الفيديو التعليمي الدرس 86: التحكم في موضع محرك سيرفو باستخدام مقياس الجهد من Robojax (في الفيديو عند 00:00). يرشدك خلال العملية بأكملها، من فهم التوصيلات إلى شرح الكود الذي يجعل كل شيء يعمل. لنبدأ.

المكونات والأجهزة

للمتابعة مع هذا المشروع، ستحتاج إلى المكونات التالية:

  • لوحة Arduino (مثل Uno أو Nano)
  • محرك سيرفو قياسي (مثل SG90 أو MG996R)
  • مقياس جهد (مقاومة متغيرة، عادة 10kΩ)
  • أسلاك توصيل
  • لوحة تجارب (اختيارية، لتسهيل التوصيلات)

فهم التوصيلات

التوصيلات لهذا المشروع بسيطة. المفتاح هو توفير الطاقة والإشارات الصحيحة لكل من السيرفو ومقياس الجهد. السيرفو جهاز يستهلك طاقة عالية، لذا يحصل على طاقته مباشرة من منفذ 5V في Arduino. يعمل مقياس الجهد كمقسم جهد، ونقرأ الجهد عند طرفه الأوسط (المنزلق) لتحديد موضعه. (في الفيديو عند 01:05)

إحدى الحيل الذكية التي يستخدمها هذا المشروع هي إنشاء مصدر 5V إضافي على منفذ رقمي لتشغيل مقياس الجهد، حيث أن بعض لوحات Arduino تحتوي على منفذ 5V واحد فقط مخصص. يتم ذلك في الكود عن طريق ضبط منفذ رقمي (المنفذ 8) على HIGH، مما يخرج 5V. (في الفيديو عند 00:39)

إليك مخطط التوصيل المذكور في الفيديو:

توصيل Arduino لمحرك سيرفو مع مقياس جهد
توصيل Arduino لمحرك سيرفو مع مقياس جهد

دعنا نفصل التوصيلات:

  • محرك السيرفو:
    • الطاقة (السلك الأحمر) → منفذ 5V في Arduino
    • الأرضي (السلك البني/الأسود) → منفذ GND في Arduino
    • الإشارة (السلك البرتقالي/الأصفر) → المنفذ 3 في Arduino (منفذ يدعم PWM)
  • مقياس الجهد:
    • الطرف الأيسر → منفذ GND في Arduino
    • الطرف الأوسط (المنزلق) → المنفذ التناظري A0 في Arduino
    • الطرف الأيمن → المنفذ 8 في Arduino (معرّف كـ VCC2 في الكود)

شرح الكود

الكود لهذا المشروع بسيط وأنيق. يستخدم بعض دوال Arduino الأساسية لقراءة مقياس الجهد والتحكم في السيرفو. دعنا نركز على الأجزاء القابلة للتخصيص التي يمكنك تعديلها لمشاريعك الخاصة. (في الفيديو عند 03:00)

في أعلى الكود، ستقوم بتعريف المنافذ وإنشاء كائن السيرفو. هذه هي المتغيرات الأساسية التي ستغيرها بناءً على توصيلاتك:

#include <Servo.h>

Servo myservo;  // إنشاء كائن سيرفو للتحكم في محرك سيرفو

int potpin = A0;  // المنفذ التناظري المستخدم لتوصيل مقياس الجهد
int servoPin = 3; // تعريف منفذ رقمي (مع PWM) للسيرفو. يمكن استخدام المنافذ 3، 5، 6، 9، 10، 11 فقط
int VCC2 = 8;// تعريف VCC إضافي لمقياس الجهد
int val;    // متغير لقراءة القيمة من المنفذ التناظري

إليك ما يفعله كل جزء:

  • Servo myservo;: هذا السطر ينشئ كائنًا باسم myservo سنستخدمه للتحكم في محرك السيرفو الخاص بنا. يمكنك إعادة تسميته، لكن يجب استخدام نفس الاسم لاحقًا في الكود.
  • int potpin = A0;: يحدد هذا المنفذ التناظري الذي يتصل به منزلق مقياس الجهد. إذا نقلت السلك إلى منفذ تناظري مختلف، يجب تحديث هذا الرقم.
  • int servoPin = 3;: يضبط هذا المنفذ الرقمي لسلك إشارة السيرفو. من الضروري استخدام منفذ يدعم PWM (عادةً تلك المميزة بعلامة '~' على اللوحة). يوضح التعليق المنافذ الصالحة لمعظم لوحات Arduino.
  • int VCC2 = 8;: هذا هو المنفذ الذي نستخدمه كمصدر 5V ثانوي لمقياس الجهد. إذا كانت لوحتك تحتوي على منافذ 5V متعددة، يمكنك توصيله مباشرة وإزالة هذا الجزء من الكود.

في دالة setup()، يقوم الكود بتهيئة السيرفو وإعداد دبوس الطاقة الإضافي. دالة myservo.attach(servoPin) أساسية لأنها تخبر Arduino أي دبوس متصل بسلك إشارة السيرفو.

void setup() {
  Serial.begin(9600);          //  إعداد الاتصال التسلسلي
  myservo.attach(servoPin);  // يربط السيرفو على الدبوس 3 بكائن السيرفو

  pinMode(VCC2, OUTPUT);// تعيين الدبوس 8 كمخرج
  digitalWrite(VCC2, HIGH);// تعيين الدبوس 8 على HIGH ليعمل كدبوس 5V
}

المنطق الأساسي موجود في دالة loop(). فهي تقرأ قيمة مقياس الجهد (البوتنشيوميتر)، وتحولها إلى زاوية، وتأمر السيرفو بالتحرك. الدالتان الحاسمتان هنا هما analogRead() و map(). (في الفيديو عند 04:27)

void loop() {
  val = analogRead(potpin);            // يقرأ قيمة مقياس الجهد (قيمة بين 0 و 1023)
  val = map(val, 0, 1023, 0, 180);     // يحولها لاستخدامها مع السيرفو (قيمة بين 0 و 180)
  myservo.write(val);                  // يضبط موضع السيرفو وفقًا للقيمة المحولة
  Serial.print(val);
  Serial.println();
  delay(50);                           // ينتظر حتى يصل السيرفو إلى الموضع
}

إليك كيفية عمله:

  • analogRead(potpin): تقرأ هذه الدالة الجهد من ذراع مقياس الجهد وتُرجع قيمة بين 0 (0V) و 1023 (5V).
  • map(val, 0, 1023, 0, 180): هذا هو مفتاح المشروع بأكمله. يأخذ القيمة الخام من مقياس الجهد (0 إلى 1023) ويحولها تناسبيًا إلى زاوية سيرفو (0 إلى 180 درجة). على سبيل المثال، إذا قرأ مقياس الجهد 511 (حوالي النصف)، فإن دالة map() سترجع 90، مما يحرك السيرفو إلى موضعه الأوسط.
  • myservo.write(val): تأخذ هذه الدالة الزاوية المحسوبة (المخزنة الآن في val) وتطلب من السيرفو الدوران إلى ذلك الموضع.
  • delay(50): يضيف هذا توقفًا قصيرًا في نهاية كل حلقة. يتحكم في معدل التحديث. تأخير أكبر (مثل 200 مللي ثانية) يجعل السيرفو يتحرك بخطوات، بينما تأخير أصغر (مثل 50 مللي ثانية) يجعل الحركة سلسة جدًا. يمكنك ضبط هذا لتغيير الاستجابة. (في الفيديو عند 07:26)

عرض المشروع المباشر

في الفيديو، يمكنك رؤية المشروع أثناء العمل. عند تدوير مقبض مقياس الجهد، يتبع ذراع محرك السيرفو موضعه بشكل تناسبي. تعرض الشاشة التسلسلية الزاوية الحالية، مما يؤكد أن التحويل يعمل بشكل صحيح. عندما يكون مقياس الجهد في أدنى موضع له، يكون السيرفو عند 0 درجة. وعندما تدير المقبض إلى أقصى حد، يدور السيرفو بسلاسة إلى 180 درجة. (في الفيديو عند 06:33)

توضح حلقة التغذية الراجعة في الوقت الفعلي التكامل السلس بين مستشعر تناظري ومشغل رقمي، مما ينشئ نظام تحكم سريع الاستجابة وبديهي.

الفصول

  • [00:00] المقدمة ونظرة عامة على المشروع
  • [01:05] المخطط التخطيطي ومخطط الأسلاك
  • [02:07] عرض الأسلاك الفعلي
  • [03:00] شرح الكود
  • [06:33] العرض المباشر والاختبار
  • [07:26] ضبط سرعة استجابة السيرفو

الصور

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
اللغة: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = A0;  // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  //
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object

  pinMode(VCC2, OUTPUT);// set pin 8 as output
  digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  Serial.print(val);
  Serial.println();
  delay(50);                           // waits for the servo to get there
}
 

الأشياء التي قد تحتاجها

ملفات📁

ملفات أخرى