Luka Code

Tonga motéma ya Arduino Servo Toggle Switch na Push Button

Tonga motéma ya Arduino Servo Toggle Switch na Push Button

Kokela Mokano ya Arduino Servo na Kipeke ya Kobenda

Mokano oyo ya projɛ́ mokokamba yo ndenge ya kosala circuit ya pete kasi ya ntina mingi: moteur ya servo oyo ekotambola kati na ba positions mibale na mbala na mbala ya kobenda kipeke moko. Na mbala ya liboso ya kobenda, servo ekokende malembe na malembe longwa na 0 kino na 180 degré. Na mbala ya mibale, ekokende kozonga longwa na 180 kino na 0 degré. Oyo ezali concept ya libula na robotique mpe automatisation, ya malamu mpo na kosala ba mécanismes lokola porte ya automatique, loboko ya robotique ya pete, mpele ya drapeau, to projɛ́ nyonso oyo esengeli action ya physique ya ba états mibale.

Tokotalaka na détail hardware oyo esengeli, ba connexions, mpe tokomemela explication ya détail ya code ya Arduino oyo esalaka ete nyonso esala.


Hardware mpe Ba Connexions

Ba composants ya projɛ́ oyo ezali mingi te mpe ezali na ba kits mingi ya Arduino ya ebandeli. Okosengela carte ya Arduino (lokola Uno), moteur ya servo ya hobby ya standard (lokola SG90), kipeke ya kobenda, mpe ba fils ya jumper mwa moke.

Ba connexions ezali pete. Ba lignes ya puissance mpe ya terre ya servo ekangami na ba pins 5V mpe GND ya Arduino, kasi ligne na yango ya signal ekangami na pin oyo esalaka PWM (pin 9 na code na biso). Kipeke ya kobenda ekangami kati na pin digitale 2 mpe GND.

Diagramme ya connexion mpo na kokangisa moteur ya servo mpe kipeke ya kobenda na Arduino.

Explication ya Code ya Arduino

Sketch esalelaka bibliothèque ya standard Servo.h, oyo ezwami na IDE ya Arduino. Code esalemi mpo na kozala pete mpe ya kososola, na kosalela ba flags mpo na kolandela état ya servo mpe ba boucles for mpo na kosala mouvement ya malembe mpe ya kitoko.

Ba Variables Globales mpe Configuration

Na likolo ya code, tosali définition ya ba pins mpe ndenge servo esengeli kosala. Oyo nde ba valeurs ya minene oyo okoki kosala personnaliser mpo na projɛ́ na yo.


#include <Servo.h>

// Définir ba variables mpo na ba pins ya servo mpe ya kipeke
const int servoPin = 9;   // Kokangisa fil ya signal ya servo na pin digitale 9
const int buttonPin = 2;  // Kokangisa kipeke ya kobenda na pin digitale 2

// Définir ba paramètres ya mouvement ya servo
const int initialAngle = 0;   // Angle ya ebandeli ya servo
const int targetAngle1 = 180; // Angle ya liboso ya kokende
const int targetAngle2 = 0;   // Angle ya mibale ya kokende
const int movingStep = 1;     // Taille ya étape mpo na mouvement ya malembe (1 degré na mbala)

Servo myServo; // Kosala objet ya Servo

// Ba variables ya kolandela état
int currentAngle = initialAngle;
bool buttonPressed = false;
bool servoAt180 = false;
  • servoPin: Pin oyo ekangami na fil ya signal ya servo. Esengeli kozala pin ya PWM (oyo ememami na `~` na ba cartes mingi ya Arduino).
  • buttonPin: Pin oyo kipeke ya kobenda ekangami na yango.
  • initialAngle, targetAngle1, targetAngle2: Oyo esalelami mpo na koyeba esika ya ebandeli mpe ya suka ya mouvement ya servo.
  • movingStep: Oyo ekolandela ndenge boni degré servo ekokende na étape nyonso ya boucle. Nombre moke koleka esalaka mouvement ya malembe mpe ya pete koleka.

Fonction ya setup()

Fonction ya setup() esalaka mbala moko ntango Arduino ezipamaka. Ebandisaka servo, esalaka configuration ya pin ya kipeke, mpe esalaka ete servo ekende na esika na yango ya ebandeli.


void setup() {
  myServo.attach(servoPin); // Kokangisa servo na pin na yango
  pinMode(buttonPin, INPUT_PULLUP); // Kosala pin ya kipeke lokola entrée na pull-up ya kati
  myServo.write(initialAngle);      // Kotinda servo na esika na yango ya ebandeli
  Serial.begin(9600);               // Kobanda serial mpo na débogage
}

Tosalelaka INPUT_PULLUP mpo na pin ya kipeke. Oyo ebandisaka résistance ya kati na Arduino, oyo ekolandela état ya pin ezala HIGH ntango kipeke ebendami te. Ntango kipeke ebendami, ekokangisa pin na terre, mpe état ekomi LOW. Caractéristique ya ntina oyo elimboli ete osengeli te kobakisa résistance ya pull-up ya libanda na circuit na yo.

Fonction ya loop() - Logique ya Libula

Boucle ya minene ekolandela ntango nyonso mpo na koyeba soki kipeke ebendami. Ntango kobenda emonani, ekotinda servo na esika na yango ya suka oyo elandi.


void loop() {
  // Kotanga état ya kipeke
  int buttonState = digitalRead(buttonPin);

  // Kotala soki kipeke ebendami (LOW) mpe ezalaki te ete ezali déjà na esika ya kozala
  if (buttonState == LOW && !buttonPressed) {
    delay(50); // Retard ya débounce mpo na kopekisa ba déclenchements ebele
    if (digitalRead(buttonPin) == LOW) { // Kotala lisusu état ya kipeke
      buttonPressed = true; // Komonisa ete kipeke ebendami

      if (!servoAt180) {
        // Soki ezali na 180 te, kokende na 180
        for (int angle = currentAngle; angle <= targetAngle1; angle += movingStep) {
          myServo.write(angle);
          delay(15); // Retard kati na ba étapes mpo na kokamba vitesse
        }
        currentAngle = targetAngle1;
        servoAt180 = true; // Kobongola état
      } else {
        // Soki ezali na 180, kozonga na 0
        for (int angle = currentAngle; angle >= targetAngle2; angle -= movingStep) {
          myServo.write(angle);
          delay(15);
        }
        currentAngle = targetAngle2;
        servoAt180 = false; // Kobongola état
      }
    }
  }

  // Kozongisa flag ya kobenda na esika na yango ntango kipeke elongoli
  if (buttonState == HIGH) {
    buttonPressed = false;
  }
}

Mokolo oyo esalelaka elembo ya servoAt180, oyo ezali kokanisa esika ya suka oyo servo ezalaki. Ntango bakangi bouton, ezali kotala elembo oyo: soki servo ezali te na degré 180, ezali komema yango kuna; soki te, ezali komema yango na 0. Ba boucles ya for nde ezali kosala mouvement ya pete-pete, ezali kotambwisa servo na degré moko na moko na kozelisa mwa tango moke kati na etape na etape.


Ndenge Ezali Kosala

Ntango okotisi code yango mpe opesi Arduino na yo courant, servo ekokende na esika na yango ya liboso ya degré 0.

  1. Bobakisi ya liboso: Ntango obakisi bouton, code ekoyeba ete obakisi yango mpe ekobanda kotambwisa servo longwa na 0 kino na degré 180, degré moko na moko.
  2. Bobakisi ya mibale: Soki servo esili kokoma na degré 180, bobakisi ya bouton oyo elandi ekosala ete ezonga longwa na 180 kino na degré 0.

Nzela oyo ekokoba na mbala na mbala oyo obakisi bouton, mpe ekosala mécanisme ya kotinda mpe kozongisa oyo ezali ya semba mpe ya libateli mpo na projet na yo.

787-Servo with Push button each push moves the servo to final position and stop SPB-180
Langue: 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;
  }
}

Mokili na bisika

Pas encore de ressources.

Fichiers📁

Fiche technique (pdf)