كود البحث

الدرس 88: التحكم في محرك سيرفو باستخدام مفتاحي ضغط

الدرس 88: التحكم في محرك سيرفو باستخدام مفتاحي ضغط

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

إليك بعض المشاريع العملية التي يمكنك بناؤها باستخدام هذا الإعداد:

  • بناء لوحة تحكم يدوية لذراع آلية أو ماسك.
  • إنشاء منزلق كاميرا أو رأس إمالة وتدوير يتم التحكم فيه عن بُعد.
  • تطوير واجهة تحكم فيزيائية لدفة طائرة نموذجية أو قارب.
  • صنع "جهاز تعليم" بسيط لتسجيل المواضع لآلة CNC أو طابعة ثلاثية الأبعاد.

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

يتطلب هذا المشروع عددًا قليلاً فقط من المكونات الأساسية، مما يجعله نقطة انطلاق ممتازة لتعلم كل من أجهزة الإدخال والإخراج مع أردوينو.

  • لوحة أردوينو (Uno، Nano، Mega، إلخ)
  • محرك سيرفو (مثل SG90 أو MG995)
  • زرا ضغط لحظيان
  • أسلاك توصيل
  • لوحة تجارب (اختيارية لكن يُنصح بها)

دليل التوصيل

في الفيديو، يكون التوصيل مباشرًا. يتم توصيل دبوس إشارة محرك السيرفو بدبوس يدعم PWM على أردوينو، وهو الدبوس 9 في هذا المثال. يتم توصيل الطاقة والأرضي لمحرك السيرفو بدبوسي 5V وGND في أردوينو. يتم توصيل زري الضغط بطريقة مماثلة لبعضهما البعض. يتم توصيل أحد طرفي كل زر بالأرضي، والطرف الآخر بدبوس إدخال رقمي على أردوينو (الدبوس 2 لزر "اليسار" والدبوس 3 لزر "اليمين"). يستخدم الكود المقاومات الداخلية للسحب، لذا لا حاجة لمقاومات خارجية للأزرار. (في الفيديو عند 00:57)

Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons

شرح الكود

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

#include <Servo.h>

Servo myservo;  // إنشاء كائن سيرفو للتحكم في محرك سيرفو
int servoPin = 9;// يجب أن يكون هذا الدبوس من تلك التي تدعم PWM ~
int angle =90;    // الزاوية الأولية للسيرفو
int angleStep =5;

#define LEFT 2   // الدبوس 2 متصل بزر اليسار
#define RIGHT  3  // الدبوس 3 متصل بزر اليمين
  • servoPin: يحدد هذا المتغير دبوس أردوينو الذي يتصل به سلك إشارة السيرفو. من الضروري استخدام دبوس يدعم تعديل عرض النبضة (PWM)، ويُشار إليه عادةً برمز ~ على اللوحة.
  • angle: يضبط هذا الزاوية الأولية للسيرفو عند بدء تشغيل أردوينو. القيمة الافتراضية هي 90 درجة، والتي عادةً ما توسّط السيرفو.
  • angleStep: هذا هو مقدار الزيادة التي تتغير بها زاوية السيرفو في كل مرة يتم فيها الضغط على زر. قيمة 5 تعني أن كل ضغطة ستحرك السيرفو بمقدار 5 درجات. يمكنك زيادة هذا للحركة الأسرع أو تقليله للتحكم الأدق.
  • LEFT وRIGHT: تخصص هذه التوجيهات #define الدبابيس الرقمية التي تتصل بها أزرار الضغط. إذا قمت بتوصيل الأزرار بدبابيس مختلفة، يجب عليك تغيير هذه القيم لتتناسب مع إعدادك.

المنطق الأساسي في دالة loop() يتحقق مما إذا تم الضغط على زر (من خلال قراءة إشارة LOW بسبب تكوين السحب الداخلي). إذا تم الضغط على زر "اليمين"، فإنه يقلل متغير angle بمقدار angleStep. إذا تم الضغط على زر "اليسار"، فإنه يزيد angle. يتضمن الكود فحوصات حدودية لضمان بقاء الزاوية ضمن نطاق 0 إلى 180 درجة. ثم تُستخدم دالة myservo.write(angle) لأمر السيرفو بالتحرك إلى الموضع الجديد.

عرض توضيحي مباشر للمشروع

في العرض التوضيحي بالفيديو، تظهر الوظيفة بوضوح. يؤدي الضغط مع الاستمرار على زر "اليسار" إلى تحرك السيرفو بسلاسة إلى اليسار، مع زيادة الزاوية بمقدار 5 درجات في كل مرة، حتى تصل إلى 180 درجة وتتوقف. وبالمثل، يؤدي الضغط مع الاستمرار على زر "اليمين" إلى تحرك السيرفو عائدًا إلى اليمين، مع تقليل الزاوية حتى تصل إلى 0 درجة. تتم طباعة الزاوية الحالية على الشاشة التسلسلية، مما يتيح لك رؤية الموضع الدقيق للسيرفو في الوقت الفعلي. (في الفيديو عند 05:20)

فصول الفيديو

  • [00:00] مقدمة للتحكم في محرك سيرفو باستخدام الأزرار
  • [00:57] دليل توصيل السيرفو وأزرار الضغط
  • [02:12] شرح الكود، الجزء 1: الإعداد والتكوين
  • [03:25] شرح الكود، الجزء 2: منطق الحلقة الرئيسية
  • [05:20] عرض توضيحي مباشر للمشروع
  • [06:23] الخاتمة والتطبيقات المحتملة

الصور

2 pin tactile push button switch
2 pin tactile push button switch
SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons
891-Lesson 88: Servo control with 2 push buttons
اللغة: C++
/*
 * S05-05 Servo control with 2 push buttons
 * Download and resource page https://robojax.com/RJT764
 Watch video on YouTube https://www.youtube.com/watch?v=J_kbyAY1rLM
 * 
 * Written by Ahmad Shamshiri for Robojax.com 
 * on Jan 15, 2019 at 19:15 in Ajax, Ontario, Canada

  
 * 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 download 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/>.
 */
/*
 Controlling a servo with two Push buttons with Arduino
 when Left  push button is pressed, the servo start moving to the left until it reaches 180( or zero) degrees
 when Right  push button is pressed, the servo start moving to the right until it reaches 180( or zero) degrees
At any instance if the button is released, servo stops

*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
int servoPin = 9;// this pin must be of those with PWM ~
int angle =90;    // initial angle  for servo
int angleStep =5;

#define LEFT 2   // pin 2 is connected to left button
#define RIGHT  3  // pin 3 is connected to right button

void setup() {
  // Servo button demo by Robojax.com
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  pinMode(LEFT,INPUT_PULLUP); // assign pin 12 ass input for Left button
  pinMode(RIGHT,INPUT_PULLUP);// assing pin 2 as input for right button
  myservo.write(angle);// send servo to the middle at 90 degrees
 Serial.println("Robojax Servo 2 Buttons ");
}

void loop() {
  // Servo button demo by Robojax.com
  while(digitalRead(RIGHT) == LOW){

    if (angle > 0 && angle <= 180) {
      angle = angle - angleStep;
       if(angle < 0){
        angle = 0;
       }else{
      myservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }
    
  delay(100); // waits for the servo to get there
  }// while
 // Servo button demo by Robojax.com

  while(digitalRead(LEFT) == LOW){

    // Servo button demo by Robojax.com
    if (angle >= 0 && angle <= 180) {
      angle = angle + angleStep;
      if(angle >180){
        angle =180;
       }else{
      myservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }
    
  delay(100); // waits for the servo to get there
  }// 

  
}

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

ملفات📁

ملفات أخرى