Caută cod

Lecția 88: Controlul unui servomotor folosind două butoane de tip push-button

Lecția 88: Controlul unui servomotor folosind două butoane de tip push-button

Acest proiect demonstrează cum să controlezi un motor servo folosind două butoane apăsătoare cu un Arduino. În loc să te bazezi pe un potențiometru sau pe o comandă serială, poți folosi comutatoare tactile simple pentru a muta manual un servo spre stânga sau dreapta. Acest lucru este incredibil de util pentru aplicații în care ai nevoie de control fizic direct asupra unui mecanism, cum ar fi construirea unui braț robotic, reglarea unui gimbal pentru cameră sau crearea unui sistem de panoramare și înclinare controlat de la distanță. Butoanele îți permit să ajustezi incremental unghiul servoului, cu posibilitatea de a ține apăsat butonul pentru a-l deplasa pe întreaga sa gamă de mișcare.

Iată câteva proiecte practice pe care le poți construi cu această configurație:

  • Construirea unui panou de control manual pentru un braț robotic sau o cleștă.
  • Crearea unui glisor pentru cameră sau a unui cap de panoramare-înclinare controlat de la distanță.
  • Dezvoltarea unei interfețe de control fizic pentru cârma unui avion model sau a unei bărci.
  • Realizarea unui simplu „pendant de învățare” pentru a înregistra poziții pentru o mașină CNC sau o imprimantă 3D.

Hardware și componente

Acest proiect necesită doar câteva componente de bază, fiind un punct de plecare excelent pentru a învăța despre dispozitivele de intrare și ieșire cu Arduino.

  • Placă Arduino (Uno, Nano, Mega etc.)
  • Motor servo (de exemplu, SG90 sau MG995)
  • Două butoane apăsătoare momentane
  • Fire de legătură
  • Breadboard (opțional, dar recomandat)

Ghid de cablare

În videoclip, cablarea este simplă. Pinul de semnal al motorului servo este conectat la un pin cu capacitate PWM de pe Arduino, care este pinul 9 în acest exemplu. Alimentarea și masa pentru servo sunt conectate la pinii 5V și GND ai Arduino. Cele două butoane apăsătoare sunt cablate într-un mod similar unul cu celălalt. Un picior al fiecărui buton este conectat la masă, iar celălalt picior este conectat la un pin de intrare digitală de pe Arduino (pinul 2 pentru butonul „stânga” și pinul 3 pentru butonul „dreapta”). Codul folosește rezistențele interne de pull-up, deci nu sunt necesare rezistențe externe pentru butoane. (în videoclip la 00:57)

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

Explicația codului

Codul este conceput pentru a fi ușor configurabil. Părțile cheie configurabile de utilizator sunt în partea de sus a schiței. Iată o defalcare a variabilelor și definițiilor importante pe care ai putea dori să le ajustezi pentru propriul proiect.

#include <Servo.h>

Servo myservo;  // creează obiectul servo pentru a controla un servo
int servoPin = 9;// acest pin trebuie să fie dintre cei cu PWM ~
int angle =90;    // unghiul inițial pentru servo
int angleStep =5;

#define LEFT 2   // pinul 2 este conectat la butonul stânga
#define RIGHT  3  // pinul 3 este conectat la butonul dreapta
  • servoPin: Această variabilă definește pinul Arduino la care este conectat firul de semnal al servoului. Este crucial să folosești un pin care suportă Modulația în Lățime a Impulsurilor (PWM), de obicei marcat cu simbolul ~ pe placă.
  • angle: Aceasta setează unghiul inițial al servoului când pornește Arduino. Valoarea implicită este 90 de grade, care de obicei centrează servoul.
  • angleStep: Acesta este incrementul cu care se schimbă unghiul servoului de fiecare dată când este apăsat un buton. O valoare de 5 înseamnă că fiecare apăsare va muta servoul cu 5 grade. Poți crește această valoare pentru o mișcare mai rapidă sau o poți scădea pentru un control mai fin.
  • LEFT și RIGHT: Aceste directive #define atribuie pinii digitali la care sunt conectate butoanele apăsătoare. Dacă cablați butoanele la alți pini, trebuie să schimbați aceste valori pentru a se potrivi cu configurația voastră.

Logica de bază din funcția loop() verifică dacă un buton este apăsat (citind un semnal LOW datorită configurației de pull-up). Dacă butonul „dreapta” este apăsat, scade variabila angle cu angleStep. Dacă butonul „stânga” este apăsat, crește angle. Codul include verificări ale limitelor pentru a se asigura că unghiul rămâne în intervalul de la 0 la 180 de grade. Funcția myservo.write(angle) este apoi folosită pentru a comanda servoului să se miște la noua poziție.

Demonstrație live a proiectului

În demonstrația video, funcționalitatea este clar arătată. Apăsarea și menținerea butonului „stânga” face ca servoul să se deplaseze lin spre stânga, cu unghiul incrementându-se cu 5 grade la fiecare pas, până când ajunge la 180 de grade și se oprește. În mod similar, apăsarea și menținerea butonului „dreapta” face ca servoul să se deplaseze înapoi spre dreapta, scăzând unghiul până când ajunge la 0 grade. Unghiul curent este afișat pe Monitorul Serial, permițându-ți să vezi poziția exactă a servoului în timp real. (în videoclip la 05:20)

Capitolele videoclipului

  • [00:00] Introducere în controlul unui servo cu butoane
  • [00:57] Ghid de cablare pentru servo și butoanele apăsătoare
  • [02:12] Explicația codului, partea 1: Configurare și setări
  • [03:25] Explicația codului, partea 2: Logica buclei principale
  • [05:20] Demonstrație live a proiectului
  • [06:23] Concluzie și aplicații potențiale

Imagini

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
Limba: 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
  }// 

  
}

Fișiere📁

Alte fișiere