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)

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.LEFTyRIGHT: Estas directivas#defineasignan 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
/*
* 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
}//
}
Cosas que podrías necesitar
-
Amazonas
-
AmazonasMotor servo en Amazonamzn.to
-
Amazonas
-
Amazonas
-
eBay
Archivos📁
Otros archivos
-
Folleto de datos del motor Seroo SG90
robojax-servo-SG90_datasheet.pdf0.12 MB