Código de búsqueda

Lección 85: Introducción a los servomotores | Curso de Arduino Paso a Paso

Lección 85: Introducción a los servomotores | Curso de Arduino Paso a Paso

Esta guía de proyecto te introduce al mundo de los servomotores de rotación continua, también conocidos como servos de 360 grados. A diferencia de los servos estándar que se mueven a un ángulo específico (como de 0 a 180 grados), estos motores giran continuamente en cualquier dirección. Esto los hace ideales para construir pequeños robots, orugas de tanque o cualquier proyecto que requiera motores de accionamiento simples y económicos. Esta guía te mostrará cómo controlar uno usando un Arduino y algunos botones pulsadores, dándote control práctico sobre su dirección y velocidad.

Aquí hay algunas aplicaciones prácticas para un servo de 360 grados:

  • Construir un pequeño coche robot de dos ruedas.
  • Crear un soporte de cámara panorámico e inclinable que gire sin fin.
  • Accionar una pequeña cinta transportadora o un cabrestante.
  • Hacer una plataforma simple de escaneo de radar o sensor.

Hardware y Componentes

Para este proyecto, necesitarás los siguientes componentes:

  • Placa Arduino (por ejemplo, Uno)
  • Servomotor de rotación continua (por ejemplo, FS90R o similar)
  • Tres botones pulsadores
  • Cables de puente
  • Protoboard (opcional, para un cableado más fácil)

Guía de Cableado

El cableado para este proyecto es sencillo. El servomotor tiene tres cables: típicamente marrón (tierra), rojo (alimentación) y naranja o amarillo (señal). Los botones pulsadores están cableados en una configuración simple.

Aquí hay un desglose de las conexiones:

  • Servomotor:
    • El cable marrón (Tierra) se conecta al pin GND del Arduino.
    • El cable rojo (Alimentación) se conecta al pin 5V del Arduino.
    • El cable naranja/amarillo (Señal) se conecta al pin 9 del Arduino.
  • Botones Pulsadores:
    • Un lado de cada botón se conecta al pin GND del Arduino.
    • El otro lado del botón "En sentido antihorario" se conecta al pin 2.
    • El otro lado del botón "Detener" se conecta al pin 3.
    • El otro lado del botón "En sentido horario" se conecta al pin 4.

En el video, el creador enfatiza que el cable de señal del servo debe conectarse a un pin compatible con PWM en el Arduino, que a menudo está marcado con un símbolo de tilde (~). El pin 9 es uno de estos pines. Los botones pulsadores utilizan las resistencias pull-up internas del Arduino, lo que simplifica el cableado al eliminar la necesidad de resistencias externas (en el video en 07:02).

Explicación del Código

El código está diseñado para leer el estado de tres botones pulsadores y enviar el comando correspondiente al servomotor. Vamos a desglosar las partes configurables por el usuario.

Configuración de Pines y Comandos

En la parte superior del código, encontrarás las definiciones de los pines y los valores de control del servo. Aquí es donde puedes personalizar el comportamiento de tu proyecto.


const int servoPin = 9;    // Pin PWM para la señal del servo
const int stopPin = 3;     // Pin para el botón de detener
const int cwPin = 4;       // Pin para el botón de sentido horario
const int ccwPin = 2;      // Pin para el botón de sentido antihorario

Estas constantes definen qué pines del Arduino están conectados a los botones y al servo. Si usas pines diferentes para tus botones, cambiarías los números aquí. El servoPin debe ser un pin compatible con PWM.


const int csServoCommand[3] = {106, 52, 0};  // {Antihorario, DETENER, Horario}
const String csServoCommandText[3] = {"En sentido antihorario", "Detenido", "En sentido horario"};

Esta es la parte más importante de entender y ajustar. La matriz csServoCommand contiene los valores enviados al servo. Para un servo continuo, estos valores no representan un ángulo sino una velocidad y dirección.

  • 106 es el valor para la rotación en sentido antihorario a máxima velocidad.
  • 52 es el valor para una detención completa.
  • 0 es el valor para la rotación en sentido horario a máxima velocidad.

Estos valores no son universales. Debido a diferencias de fabricación, el valor de "detención" (52) puede necesitar ajustes. Si tu servo se desplaza lentamente cuando presionas el botón de detener, necesitarás ajustar este valor finamente. El video demuestra este proceso, mostrando cómo cambiar el valor a 54 o 51 puede afectar el comportamiento del motor (en el video en 13:45).

También puedes ajustar los valores de rotación para cambiar la velocidad del motor. Por ejemplo, establecer el valor en sentido antihorario a 70 hará que gire más lento que a 106 (en el video en 12:23).

La matriz csServoCommandText contiene las cadenas de texto que se imprimen en el Monitor Serie para mostrar el estado actual del comando.

Función Personalizada: servoCommand()

El código utiliza una función personalizada para manejar la lógica de comandos. Esta función toma un número (0, 1 o 2) como argumento, actualiza el texto de estado y envía el comando correspondiente al servo.


void servoCommand(int n) {
  statusText = csServoCommandText[n];
  myservo.write(csServoCommand[n]);
  Serial.println(csServoCommandText[n]);
  Serial.println(csServoCommand[n]);
}

Esta función se llama desde el bucle principal cuando se presiona un botón. Centraliza la lógica para actualizar la pantalla y controlar el servo, haciendo que el código sea más limpio y fácil de modificar.

Proyecto en Vivo y Demostración

En el video, el creador demuestra el proyecto en acción. Presionar el botón "En sentido horario" envía el valor 0 al servo, haciendo que gire en una dirección. Presionar el botón "En sentido antihorario" envía el valor 106, haciendo que gire en la otra dirección. El botón "Detener" envía 52, lo que debería detener el motor.

El Monitor Serie se utiliza para mostrar el estado actual y el valor exacto que se envía al servo. Esto es invaluable para depurar y para encontrar el valor de "parada" perfecto para tu motor específico. Como se indica en el video, el comando de parada puede no ser perfecto debido al circuito interno del servo, y es posible que observes una deriva lenta o vibración. Esta es una característica común en servos continuos más económicos y se puede minimizar ajustando el valor de parada en el código (en el video en 01:15).

Capítulos

  • [00:05] Introducción al servomotor de 360 grados
  • [02:02] Componentes y descripción general del hardware
  • [02:40] Diagrama de cableado detallado y conexiones
  • [05:07] Explicación del código: constantes, arreglos y configuración
  • [09:56] Explicación del código: la función servoCommand
  • [10:54] Demostración en vivo y salida del Monitor Serie
  • [12:23] Ajuste de la velocidad del servo y los valores de parada

Imágenes

SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
115-Arduino code to control continuous 360° servo from serial monitor command
Idioma: C++
/*
 * Demostración de Control de Servo Continuo (servo de 360 grados)  
 * Este código te permite controlar un servo de 360 grados mediante un comando del Monitor Serial.  
 * Este motor servo 350 es solo para divertirse. No se puede usar para aplicaciones reales donde se necesita una posición exacta. Consigue un motor paso a paso o un motor servo caro.  
 * 
 * Modificado por Ahmad Shamshiri para Robojax.com  
 * el domingo 1 de julio de 2018, a las 11:09 AM en Ajax, Ontario, Canadá  
 * Mira un video instructivo de este proyecto: https://youtu.be/b_xvu6wWafA  
 * Obtén este código de Robojax.com  
 * 
 * Código original de BARRAGAN <http://barraganstudio.com>  
 * Este código de ejemplo está en el dominio público.  
 * Modificado el 8 de noviembre de 2013  
 * por Scott Fitzgerald  
 * http://www.arduino.cc/en/Tutorial/Sweep
 */
#include <Servo.h>

Servo myservo; // crear objeto servo para controlar un servo
 // se pueden crear doce objetos servo en la mayoría de las placas

int pos = 0; // variable para almacenar la posición del servo
int incomingByte = 0; // para datos seriales entrantes

void setup() {
  Serial.begin(9600);
  myservo.attach(9); // conecta el servo en el pin 9 al objeto servo
}



void loop() {

 // envía datos solo cuando recibas datos:
        if (Serial.available() > 0) {
 // lee el byte entrante:
                incomingByte = Serial.read();

 // di lo que tienes:
                Serial.print("received: ");
                Serial.print (incomingByte);
                if(incomingByte == 108){
                 Serial.println(" sent 0 Rotating CW ");
                 myservo.write(0);
                }else if(incomingByte == 114){
                  Serial.println(" sent 180 Rotating CCW ");
                  myservo.write(180);
                }else if(incomingByte == 60){
                  Serial.println(" sent Stopped ");
                  myservo.write(60);
                }else{
                  Serial.println(" moving Randomly");
                  myservo.write(incomingByte);
                }


        }


}
893-Arduino code to control continuous 360° servo from serial monitor command (Code 2)
Idioma: C++
/* 
 *  
 *  Demonstration of Controlling Continuous Servo (360 servo)
360 Servo -2
 *  This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor. 
📚⬇️ Download and resource page https://robojax.com/RJT762
 *  
 * Modified by Ahmad Shamshiri for Robojax.com
 * on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
 * Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
 * Get this code from Robojax.com
 * 
 Original code by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.
 Modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int servoPin = 9;// this pin must be of those with PWM ~
int pos = 0;    // variable to store the servo position
int incomingByte = 0;   // for incoming serial data
int CWBS, CCWBS, SBS;

void setup() {
  Serial.begin(9600);
 pinMode(2,INPUT_PULLUP);// set pin for push button STOP
  pinMode(3,INPUT_PULLUP);// set pin for push button CCW  
  pinMode(4,INPUT_PULLUP);// set pin for push button CW
   
  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
}



void loop() {
    CCWBS = digitalRead(2);// read status of button CCW
    SBS = digitalRead(3);// read status of button STOP
    CWBS = digitalRead(4);// read status of button CW
                 if(CCWBS == LOW){
                 Serial.println(" sent 0 Rotaing CW "); 
                 myservo.write(0); 
                }else if(CWBS == LOW){
                  Serial.println(" sent 180 Rotaing CCW "); 
                  myservo.write(180); 
                }else if(SBS == LOW){
                  Serial.println(" sent Stopped "); 
                  myservo.write(60); 
                }else{
                  Serial.println(" moving Random"); 
                  myservo.write(48); 
                }
                  


  
}// loop 

Cosas que podrías necesitar

Archivos📁

Otros archivos