Código de búsqueda

Lección 88: Control de un servomotor usando dos interruptores de botón pulsador

Lección 88: Control de un servomotor usando dos interruptores de botón pulsador

Este proyecto demuestra cómo controlar un motor servo utilizando dos botones pulsadores con un Arduino. En lugar de depender de un potenciómetro o un comando serial, puedes usar interruptores táctiles simples para mover manualmente un servo hacia la izquierda o la derecha. Esto es increíblemente útil para aplicaciones donde necesitas control físico directo sobre un mecanismo, como construir un brazo robótico, ajustar un cardán de cámara o crear un sistema de paneo e inclinación controlado remotamente. Los botones te permiten ajustar incrementalmente el ángulo del servo, con la capacidad de mantener presionado el botón para barrerlo a lo largo de su rango completo de movimiento.

Aquí hay algunos proyectos prácticos que puedes construir con esta configuración:

  • Construir un panel de control manual para un brazo robótico o pinza.
  • Crear un deslizador de cámara o cabezal de paneo e inclinación controlado remotamente.
  • Desarrollar una interfaz de control físico para un timón de avión modelo o barco.
  • Hacer un simple "colgante de enseñanza" para registrar posiciones para una máquina CNC o impresora 3D.

Hardware y Componentes

Este proyecto requiere solo unos pocos componentes básicos, lo que lo convierte en un excelente punto de partida para aprender sobre dispositivos de entrada y salida con el Arduino.

  • Placa Arduino (Uno, Nano, Mega, etc.)
  • Motor servo (por ejemplo, SG90 o MG995)
  • Dos botones pulsadores momentáneos
  • Cables de puente
  • Protoboard (opcional pero recomendado)

Guía de Conexiones

En el video, las conexiones son sencillas. El pin de señal del motor servo está conectado a un pin compatible con PWM en el Arduino, que es el pin 9 en este ejemplo. La alimentación y tierra del servo están conectadas a los pines 5V y GND del Arduino. Los dos botones pulsadores están cableados de manera similar entre sí. Una pata de cada botón está conectada a tierra, y la otra pata está conectada a un pin de entrada digital en el Arduino (pin 2 para el botón "izquierda" y pin 3 para el botón "derecha"). El código utiliza las resistencias pull-up internas, por lo que no se necesitan resistencias externas para los botones. (en el video en 00:57)

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

Explicación del Código

El código está diseñado para ser fácilmente configurable. Las partes clave configurables por el usuario están al principio del sketch. Aquí hay un desglose de las variables y definiciones importantes que podrías querer ajustar para tu propio proyecto.

#include <Servo.h>

Servo myservo;  // crear objeto servo para controlar un servo
int servoPin = 9;// este pin debe ser de aquellos con PWM ~
int angle =90;    // ángulo inicial para el servo
int angleStep =5;

#define LEFT 2   // el pin 2 está conectado al botón izquierdo
#define RIGHT  3  // el pin 3 está conectado al botón derecho
  • servoPin: Esta variable define el pin del Arduino al que está conectado el cable de señal del servo. Es crucial usar un pin que soporte Modulación por Ancho de Pulso (PWM), generalmente indicado con un símbolo ~ en la placa.
  • angle: Esto establece el ángulo inicial del servo cuando el Arduino se inicia. El valor predeterminado es 90 grados, que típicamente centra el servo.
  • angleStep: Este es el incremento con el que cambia el ángulo del servo cada vez que se presiona un botón. Un valor de 5 significa que cada pulsación moverá el servo 5 grados. Puedes aumentarlo para un movimiento más rápido o disminuirlo para un control más fino.
  • LEFT y RIGHT: Estas directivas #define asignan los pines digitales a los que están conectados los botones pulsadores. Si conectas tus botones a pines diferentes, debes cambiar estos valores para que coincidan con tu configuración.

La lógica central en la función loop() verifica si un botón está presionado (leyendo una señal LOW debido a la configuración pull-up). Si se presiona el botón "derecha", disminuye la variable angle en angleStep. Si se presiona el botón "izquierda", aumenta el angle. El código incluye verificaciones de límites para asegurar que el ángulo permanezca dentro del rango de 0 a 180 grados. La función myservo.write(angle) se usa luego para ordenar al servo moverse a la nueva posición.

Demostración en Vivo del Proyecto

En la demostración del video, la funcionalidad se muestra claramente. Mantener presionado el botón "izquierda" hace que el servo barra suavemente hacia la izquierda, con el ángulo incrementándose de 5 grados a la vez, hasta que alcanza 180 grados y se detiene. De manera similar, mantener presionado el botón "derecha" hace que el servo barra de vuelta hacia la derecha, disminuyendo el ángulo hasta que alcanza 0 grados. El ángulo actual se imprime en el Monitor Serial, permitiéndote ver la posición exacta del servo en tiempo real. (en el video en 05:20)

Capítulos del Video

  • [00:00] Introducción al control de un servo con botones
  • [00:57] Guía de conexiones para el servo y botones pulsadores
  • [02:12] Explicación del código, parte 1: Configuración y ajustes
  • [03:25] Explicación del código, parte 2: La lógica del bucle principal
  • [05:20] Demostración en vivo del proyecto
  • [06:23] Conclusión y aplicaciones potenciales

Imágenes

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

  
}

Archivos📁

Otros archivos