ኮድ ይፈልጉ

አርዱኖ ሰርቮ ቶግል ስዊች በፑሽ ቁልፍ ይገንቡ

አርዱኖ ሰርቮ ቶግል ስዊች በፑሽ ቁልፍ ይገንቡ

የአርዱኖ ሰርቮ ቶግል ስዊች በፑሽ ቁልፍ ይገንቡ

ይህ የፕሮጀክት መመሪያ ቀላል ግን በጣም ጠቃሚ የሆነ ወረዳ እንዴት እንደሚፈጥሩ ያሳይዎታል፡ በእያንዳንዱ የአንድ ፑሽ ቁልፍ ጭመት በሁለት ቦታዎች መካከል የሚቀያየር ሰርቮ ሞተር። በመጀመሪያው ጭመት፣ ሰርቮው ከ0 እስከ 180 ዲግሪ በተቀላጠፈ ሁኔታ ይንቀሳቀሳል። በሁለተኛው ጭመት፣ ከ180 ወደ 0 ዲግሪ ይመለሳል። ይህ በሮቦቲክስ እና አውቶሜሽን ውስጥ መሠረታዊ ፅንሰ-ሀሳብ ነው፣ እንደ አውቶማቲክ በር መቆለፊያ፣ ቀላል ሮቦቲክ ክንድ፣ ባንዲራ ማወዛወዣ፣ ወይም ሁለት-ሁኔታ አካላዊ እንቅስቃሴ የሚፈልግ ማንኛውም ፕሮጀክት ለመፍጠር ፍጹም ነው።

አስፈላጊውን ሃርድዌር፣ ሽቦ አያያዥን፣ እና ሁሉንም ነገር የሚያንቀሳቅሰውን የአርዱኖ ኮድ ዝርዝር ማብራሪያ እንመለከታለን።


ሃርድዌር እና ሽቦ አያያዥ

ለዚህ ፕሮጀክት የሚያስፈልጉት ክፍሎች አነስተኛ እና በአብዛኛዎቹ የአርዱኖ መጀመሪያ ኪቶች ውስጥ የተለመዱ ናቸው። የአርዱኖ ቦርድ (እንደ ኡኖ)፣ መደበኛ የትርፍ ጊዜ ማሳለፊያ ሰርቮ ሞተር (ለምሳሌ SG90)፣ ፑሽ ቁልፍ፣ እና ጥቂት ጃምፐር ሽቦዎች ያስፈልግዎታል።

ሽቦ አያያዥው ቀላል ነው። የሰርቮው የኃይል እና የመሬት መስመሮች ከአርዱኖው 5V እና GND ፒኖች ጋር ይገናኛሉ፣ የሲግናል መስመሩ ደግሞ PWM አቅም ካለው ፒን (በኮዳችን ውስጥ ፒን 9) ጋር ይገናኛል። ፑሽ ቁልፉ በዲጂታል ፒን 2 እና GND መካከል ይገናኛል።

ሰርቮ ሞተር እና ፑሽ ቁልፍን ከአርዱኖ ጋር ለማገናኘት የሚያሳይ የሽቦ አያያዥ ሥዕላዊ መግለጫ።

የአርዱኖ ኮድ ማብራሪያ

ስኬቹ ከአርዱኖ IDE ጋር የተካተተውን መደበኛ Servo.h ቤተ-መጻሕፍት ይጠቀማል። ኮዱ ንጹህ እና ለመረዳት ቀላል እንዲሆን የተነደፈ ነው፣ የሰርቮውን ሁኔታ ለመከታተል ባንዲራዎችን እና ለስላሳ የመንቀሳቀስ እንቅስቃሴ ለመፍጠር for loops ይጠቀማል።

ዓለም አቀፍ ተለዋዋጮች እና ውቅር

በኮዱ አናት ላይ፣ ፒኖቹን እና የሰርቮውን ባህሪ እንገልጻለን። እነዚህ ለፕሮጀክትዎ ማበጀት የሚፈልጉዋቸው ዋና ዋና እሴቶች ናቸው።


#include <Servo.h>

// ለሰርቮ እና ቁልፍ ፒኖች ተለዋዋጮችን ይግለጹ
const int servoPin = 9;   // የሰርቮ ሲግናል ሽቦን ከዲጂታል ፒን 9 ጋር ያገናኙ
const int buttonPin = 2;  // ፑሽ ቁልፍን ከዲጂታል ፒን 2 ጋር ያገናኙ

// የሰርቮ እንቅስቃሴ መለኪያዎችን ይግለጹ
const int initialAngle = 0;   // የሰርቮው መነሻ አንግል
const int targetAngle1 = 180; // የመጀመሪያ ዒላማ አንግል
const int targetAngle2 = 0;   // ሁለተኛ ዒላማ አንግል
const int movingStep = 1;     // ለስላሳ እንቅስቃሴ የእርምጃ መጠን (በአንድ ጊዜ 1 ዲግሪ)

Servo myServo; // የሰርቮ ነገር ይፍጠሩ

// ሁኔታን የሚከታተሉ ተለዋዋጮች
int currentAngle = initialAngle;
bool buttonPressed = false;
bool servoAt180 = false;
  • servoPin፡ ከሰርቮው ሲግናል ሽቦ ጋር የተገናኘው ፒን። ይህ መሆን ያለበት PWM ፒን ነው (በአብዛኛዎቹ የአርዱኖ ቦርዶች ላይ በ`~` ምልክት የተደረገበት)።
  • buttonPin፡ ፑሽ ቁልፉ የተገናኘበት ፒን።
  • initialAngletargetAngle1targetAngle2፡ እነዚህ የሰርቮውን እንቅስቃሴ መነሻ እና መጨረሻ ነጥቦች ይገልጻሉ።
  • movingStep፡ ይህ ሰርቮው በእያንዳንዱ የloop እርምጃ ስንት ዲግሪ እንደሚንቀሳቀስ ይቆጣጠራል። ትንሽ ቁጥር ለስላሳ እና ቀርፋፋ እንቅስቃሴ ይፈጥራል።

የ`setup()` ተግባር

setup() ተግባር አርዱኖ ሲበራ አንድ ጊዜ ይሰራል። ሰርቮውን ያስነሳል፣ የቁልፍ ፒንን ያዋቅራል፣ እና ሰርቮውን ወደ መነሻ ቦታው ያዘጋጃል።


void setup() {
  myServo.attach(servoPin); // ሰርቮውን ከፒኑ ጋር ያያይዙ
  pinMode(buttonPin, INPUT_PULLUP); // የቁልፍ ፒንን ከውስጥ pull-up ጋር እንደ ግብዓት ያዘጋጁ
  myServo.write(initialAngle);      // ሰርቮውን ወደ መነሻ ቦታው ያንቀሳቅሱ
  Serial.begin(9600);               // ለማረም ሴሪያልን ያስነሱ
}

ለቁልፍ ፒኑ INPUT_PULLUP እንጠቀማለን። ይህ በአርዱኖ ውስጥ ያለውን ውስጣዊ ተከላካይ ያነቃቃል፣ ይህም ቁልፉ በማይጫንበት ጊዜ የፒኑን ሁኔታ HIGH ያደርገዋል። ቁልፉ ሲጫን፣ ፒኑን ከመሬት ጋር ያገናኘዋል፣ ሁኔታውን LOW ያደርገዋል። ይህ ጠቃሚ ባህሪ ማለት በወረዳዎ ላይ ውጫዊ pull-up ተከላካይ መጨመር አያስፈልግዎትም ማለት ነው።

የ`loop()` - ዋናው አመክንዮ

ዋናው loop የቁልፍ ጭመትን ያለማቋረጥ ይፈትሻል። ጭመት ሲታወቅ፣ ሰርቮውን ወደ ቀጣዩ ዒላማ ቦታው ያንቀሳቅሰዋል።


void loop() {
  // የቁልፉን ሁኔታ ያንብቡ
  int buttonState = digitalRead(buttonPin);

  // ቁልፉ መጫኑን (LOW) እና ቀድሞውኑ ተይዞ እንዳልነበረ ያረጋግጡ
  if (buttonState == LOW && !buttonPressed) {
    delay(50); // ብዙ ጊዜ መቀስቀስን ለመከላከል የDebounce መዘግየት
    if (digitalRead(buttonPin) == LOW) { // የቁልፉን ሁኔታ እንደገና ያረጋግጡ
      buttonPressed = true; // ቁልፉ እንደተጫነ ምልክት ያድርጉ

      if (!servoAt180) {
        // በ180 ላይ ካልሆነ፣ ወደ 180 ያንቀሳቅሱ
        for (int angle = currentAngle; angle <= targetAngle1; angle += movingStep) {
          myServo.write(angle);
          delay(15); // ፍጥነትን ለመቆጣጠር በእርምጃዎች መካከል መዘግየት
        }
        currentAngle = targetAngle1;
        servoAt180 = true; // ሁኔታን ያዘምኑ
      } else {
        // በ180 ላይ ከሆነ፣ ወደ 0 ይመለሱ
        for (int angle = currentAngle; angle >= targetAngle2; angle -= movingStep) {
          myServo.write(angle);
          delay(15);
        }
        currentAngle = targetAngle2;
        servoAt180 = false; // ሁኔታን ያዘምኑ
      }
    }
  }

  // ቁልፉ ከተለቀቀ በኋላ የቁልፍ ጭመት ባንዲራውን ዳግም ያስጀምሩ
  if (buttonState == HIGH) {
    buttonPressed = false;
  }
}

ኮዱ የቦሊያን ባንዲራ፣ servoAt180ን በመጠቀም የሰርቮውን የመጨረሻ ቦታ ያስታውሳል። አዝራሩ ሲጫን፣ ይህን ባንዲራ ይፈትሻል፡ ሰርቮው በ180 ዲግሪ ላይ ካልሆነ፣ ወደዚያ ያንቀሳቅሰዋል፤ አለበለዚያ ግን፣ ወደ 0 ይመልሰዋል። የfor loops ናቸው ለስላሳ የመጥረግ እንቅስቃሴን የሚፈጥሩት፣ ሰርቮውን በአንድ ዲግሪ በአንድ ጊዜ በማንቀሳቀስ በእያንዳንዱ እርምጃ መካከል ትንሽ መዘግየት በማድረግ።


እንዴት እንደሚሰራ

ኮዱን ሰቅለው አርዱኖዎን ካበሩ በኋላ፣ ሰርቮው ወደ መጀመሪያው የ0-ዲግሪ ቦታው ይንቀሳቀሳል።

  1. የመጀመሪያ ጨመቃ፡ አዝራሩን ሲጫኑ፣ ኮዱ ግብዓቱን ይለያል እና ሰርቮውን ከ0 ወደ 180 ዲግሪ፣ በአንድ ዲግሪ በአንድ ጊዜ ማንቀሳቀስ ይጀምራል።
  2. ሁለተኛ ጨመቃ፡ ሰርቮው 180 ዲግሪ ከደረሰ በኋላ፣ የሚቀጥለው የአዝራር ጨመቃ ከ180 ወደ 0 ዲግሪ እንዲመለስ ያደርገዋል።

ይህ ዑደት በእያንዳንዱ ተከታይ የአዝራር ጨመቃ ይደገማል፣ ለፕሮጀክትዎ አስተማማኝ እና ሊገመት የሚችል የመቀያየር ዘዴን ይፈጥራል።

787-Servo with Push button each push moves the servo to final position and stop SPB-180
ቋንቋ: C++
/*
This code is provided by robojax.com
you can view the wiring diagram and details of this tutorial 
here https://robojax.com/T661
*/
#include <Servo.h>

// Define variables for servo and button pins
const int servoPin = 9;   // Connect servo signal wire to digital pin 9
const int buttonPin = 2;  // Connect push button to digital pin 2

// Define servo movement parameters
const int initialAngle = 0;   // Servo's starting angle
const int targetAngle1 = 180; // First target angle
const int targetAngle2 = 0;   // Second target angle (same as initial in this case)
const int movingStep = 1;     // Step size for smooth movement (e.g., 1 degree at a time)

Servo myServo; // Create a Servo object

int currentAngle = initialAngle; // Variable to keep track of the servo's current angle
bool buttonPressed = false;      // Flag to track button state
bool servoAt180 = false;         // Flag to track if the servo is at 180 degrees

void setup() {
  myServo.attach(servoPin); // Attaches the servo on the servoPin to the servo object
  pinMode(buttonPin, INPUT_PULLUP); // Set the button pin as input with internal pull-up resistor
  myServo.write(initialAngle);      // Set the servo to its initial angle
  Serial.begin(9600);              // Start serial communication for debugging
}

void loop() {
  // Read the state of the button
  int buttonState = digitalRead(buttonPin);

  // Check if the button is pressed (LOW because of INPUT_PULLUP) and it was not pressed before
  if (buttonState == LOW && !buttonPressed) {
    delay(50); // Debounce delay
    if (digitalRead(buttonPin) == LOW) { // Confirm button press after debounce
      buttonPressed = true; // Set flag to indicate button is currently pressed

      if (!servoAt180) {
        // Move servo to 180 degrees
        Serial.println("Moving to 180 degrees");
        for (int angle = currentAngle; angle <= targetAngle1; angle += movingStep) {
          myServo.write(angle);
          delay(15); // Adjust this delay for desired speed
        }
        currentAngle = targetAngle1;
        servoAt180 = true;
      } else {
        // Move servo to 0 degrees
        Serial.println("Moving to 0 degrees");
        for (int angle = currentAngle; angle >= targetAngle2; angle -= movingStep) {
          myServo.write(angle);
          delay(15); // Adjust this delay for desired speed
        }
        currentAngle = targetAngle2;
        servoAt180 = false;
      }
    }
  }

  // Reset buttonPressed flag when button is released
  if (buttonState == HIGH) {
    buttonPressed = false;
  }
}

ምንጮች እና ምንጮች

አሁን ምንም ምንጮች የለም።

ፋይሎች📁

የዳታ ማዕከል (pdf)