Código de búsqueda

Lección 89: Usando un servomotor continuo o de 360 grados | Curso de Arduino Paso a Paso

Lección 89: Usando un servomotor continuo o de 360 grados | Curso de Arduino Paso a Paso

¿Alguna vez has querido hacer girar un motor en cualquier dirección durante el tiempo que quieras, en lugar de solo barrer de un lado a otro como un servo estándar? Esto es exactamente lo que ofrece un servo motor continuo o de 360 grados. A diferencia de un servo estándar que se mueve a un ángulo específico (generalmente de 0 a 180 grados), un servo continuo gira sin parar en sentido horario o antihorario. Esto lo hace perfecto para construir pequeños robots, plataformas de cámara o cualquier proyecto que requiera control de rotación continua.

En este proyecto, construiremos un sistema de control para un servo de 360 grados usando solo tres botones pulsadores. Podrás ordenar al servo que gire en sentido horario, antihorario o que se detenga en cualquier momento. Esta guía te llevará a través del cableado, explicará las partes configurables del código y te mostrará una demostración en vivo del sistema en acción.

Aquí tienes algunas ideas prácticas para usar un servo continuo en tus propios proyectos:

  • Construye un pequeño robot de dos ruedas: Usa dos servos continuos para impulsar las ruedas, permitiendo movimientos hacia adelante, hacia atrás y giros.
  • Crea un soporte de cámara con movimiento panorámico e inclinación: Usa un servo continuo para un paneo lento e infinito de una cámara de seguridad o de vida silvestre.
  • Automatiza una cinta transportadora: Controla un pequeño sistema de cinta para clasificar o dispensar artículos.
  • Diseña un soporte giratorio para exhibición: Muestra un modelo 3D o producto en una plataforma que gire continuamente.

Hardware Requerido

  • Placa Arduino (Uno, Nano, etc.)
  • Servo motor continuo (de 360 grados) (ej., FS90R, DS04-NFC)
  • 3 botones pulsadores
  • Cables de conexión
  • Protoboard

Guía de Cableado

El cableado para este proyecto es sencillo. El servo motor tiene tres cables: generalmente uno oscuro para tierra (GND), uno del medio (a menudo rojo) para alimentación (5V) y uno más claro (naranja, amarillo o blanco) para la señal. Como se muestra en el video, el servo se conecta al Arduino de la siguiente manera:

  • Tierra del servo (cable oscuro): Conectar a GND del Arduino.
  • Alimentación del servo (cable del medio/rojo): Conectar a 5V del Arduino.
  • Señal del servo (cable claro): Conectar al pin 9 del Arduino.

Para los tres botones pulsadores, cada botón tiene dos lados. Un lado de todos los botones se conecta junto y luego a GND del Arduino. El otro lado de cada botón se conecta a un pin digital separado, como se describe a continuación (en el video en 03:40):

  • Botón horario (CW): Conectar al pin 2 del Arduino.
  • Botón de parada: Conectar al pin 3 del Arduino.
  • Botón antihorario (CCW): Conectar al pin 4 del Arduino.
360_Serrvo_3_push_button_wiring

Explicación del Código

El código está diseñado para ser fácilmente configurable. La parte más importante que necesitarás ajustar es el arreglo sc[], que contiene los valores PWM específicos enviados al servo para controlar sus acciones. Estos valores no son universales y deben calibrarse para tu servo motor específico (en el video en 12:23).

int sc[]={106, 58, 0};// comandos del servo en orden
        //CCW, STOP,CW

Este arreglo es el corazón de la calibración. Los valores se usan en este orden:

  • sc[0] = 106: Este valor se envía para hacer girar el servo en sentido antihorario.
  • sc[1] = 58: Este es el valor de "parada". Debido al circuito interno, el valor exacto que detiene el motor varía. Puede que notes que tu servo gira lentamente incluso cuando se envía este comando, y necesitarás ajustar este número ligeramente para encontrar el valor de "parada total" para tu motor.
  • sc[2] = 0: Este valor hace girar el servo en sentido horario a máxima velocidad.

Puedes ajustar los valores en el arreglo sc[] para cambiar la velocidad de rotación. Por ejemplo, establecer sc[0] a 70 hará que la rotación antihoraria sea más lenta. Cuanto más cerca esté un valor del valor de "parada" (58), más lento girará el motor en esa dirección. Los valores más alejados de 58 aumentarán la velocidad hasta un límite máximo.

También hay otras variables clave que podrías necesitar modificar. servoPin está configurado en 9, que debe ser un pin compatible con PWM en tu Arduino. Los pines de los botones están definidos al inicio del código y se pueden cambiar si es necesario.

int servoPin = 9;// este pin debe ser uno de los que tienen PWM ~

#define STOPpin 3 // pin del botón para STOP
#define CWpin 2 //  pin del botón para CW
#define CCWpin 4 // pin del botón para CCW

Finalmente, el arreglo scText[] contiene las cadenas que se imprimen en el Monitor Serie para depuración. Puedes cambiarlas si deseas mostrar mensajes diferentes.

Cómo Usar el Código

Sube el código proporcionado a tu placa Arduino. Abre el Monitor Serie (configurado a 9600 baudios) para ver los mensajes de estado. Ahora puedes controlar el servo usando los tres botones:

  • Mantén presionado el botón CW: El servo comenzará a girar en sentido horario. El Monitor Serie mostrará "CW" y el valor que se está enviando.
  • Mantén presionado el botón CCW: El servo comenzará a girar en sentido antihorario. El Monitor Serie mostrará "CCW" y el valor que se está enviando.
  • Presiona el botón de parada: El servo intentará detenerse. El Monitor Serie mostrará "Stop".

Si tu servo no se detiene por completo cuando se presiona el botón de Stop, necesitarás calibrar el valor de sc[1] en el arreglo sc[]. Intenta cambiar el valor ligeramente (por ejemplo, de 58 a 54 o 52) y vuelve a subir el código hasta que el motor permanezca perfectamente quieto.

Demostración en Vivo

En el video, el presentador demuestra el sistema completo. Puedes ver el servo girando en ambas direcciones según las pulsaciones de los botones. También se muestra la salida del Monitor Serial, que muestra el estado actual ("CW", "Stop" o "CCW") y el valor específico que se envía al servo. Esta es una gran herramienta para depurar y encontrar los valores de calibración perfectos para tu motor específico. La demostración también muestra cómo ajustar los valores en el arreglo sc[] afecta directamente la velocidad del motor, desde un avance lento hasta su velocidad máxima de rotación.

Conclusión

Este proyecto proporciona una forma simple y efectiva de controlar un servomotor de rotación continua. Al comprender el proceso de calibración del valor de "stop", puedes asegurar un control preciso en tus propios proyectos de robótica y automatización.

Capítulos del Video

  • [00:05] Introducción al Servomotor de Rotación Continua
  • [02:02] Descripción General del Hardware del Servo
  • [02:40] Diagrama de Cableado y Conexiones
  • [05:07] Explicación del Código: Variables y Configuración
  • [08:03] Explicación del Código: Lógica del Bucle Principal
  • [09:56] La Función servoCommand()
  • [10:54] Demostración en Vivo y Salida del Monitor Serial
  • [12:23] Calibración de la Velocidad del Servo y Valores de Stop

Imágenes

360_Serrvo_3_push_button_wiring
360_Serrvo_3_push_button_wiring
209-How to control a 360 servo with push buttons
Idioma: C++
++
/*
 *  S05-13 Servo with 3 push buttons
 *  Demonstration of Controlling a Continuous Servo (360 servo)
 *  This code allows you to control a 360-degree servo using push buttons
 *
 * Modified by Ahmad Shamshiri for Robojax Robojax.com
 * on Jan 17, 2019 at 22:42 in Ajax, Ontario, Canada
 Watch the video instruction for this sketch: https://youtu.be/hVe4TSRV4ww

 Watch Introduction to  360 Servo video with code: https://youtu.be/b_xvu6wWafA
 You can get the wiring diagram from my Arduino Course at Udemy.com
 Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place
 visit my course now http://robojax.com/L/?id=62

 If you found this tutorial helpful, please support me so I can continue creating
 content like this. 
 or make a donation using PayPal http://robojax.com/L/?id=64

 Original code by BARRAGAN <http://barraganstudio.com>
 *
 * Code is available at http://robojax.com/learn/arduino

 * 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 downloaded 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/>.

*/

#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 one of those with PWM ~


#define STOPpin 3 // push button pin  for STOP
#define CWpin 2 //  push button for CW
#define CCWpin 4 // push button for CCW

int sc[]={106, 58, 0};// servo commands are in order
        //CCW, STOP,CW

String scText[]={"CCW","Stop","CW"};// define texts for 3 actions
int statusText;
int CWBS, CCWBS, SBS;
      //CW button status (CWBS)
      //CCW button status (CCWBS)
      //stop button status (SBS)

void setup() {
  Serial.begin(9600);
  pinMode(STOPpin,INPUT_PULLUP);// set pin for push button STOP
  pinMode(CCWpin,INPUT_PULLUP);// set pin for push button CCW
  pinMode(CWpin,INPUT_PULLUP);// set pin for push button CW

  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  myservo.write(sc[1]);// send STOP command
  statusText=1;// initial value is STOP
}



void loop() {

    CCWBS = digitalRead(CCWpin);// read status of button CCW
    SBS = digitalRead(STOPpin);// read status of button STOP
    CWBS = digitalRead(CWpin);// read status of button CW

    if(CCWBS ==LOW)
    {
      servoCommand(0);
    }else if(SBS ==LOW)
    {
      servoCommand(1);
    }else if(CWBS ==LOW)
    {
      servoCommand(2);
    }

  Serial.println(scText[statusText]);
  delay(50);
}// loop



void servoCommand(int n)
{
   statusText = n;
   myservo.write(sc[n]);
   Serial.print("Going to  ");
   Serial.print(scText[n]);
   Serial.print( "(");
   Serial.print(sc[n]);
   Serial.println(")");
}

Cosas que podrías necesitar

Recursos y referencias

Archivos📁

Otros archivos