Código de búsqueda

Lección 86: Control de la posición de un servomotor usando un potenciómetro

Lección 86: Control de la posición de un servomotor usando un potenciómetro

Imagina girar una simple perilla y ver cómo un brazo mecánico sigue con precisión cada uno de tus movimientos. Esa es la magia de combinar un potenciómetro con un servomotor. Este proyecto, parte del Curso Paso a Paso de Arduino de Robojax, demuestra un concepto fundamental e increíblemente útil en electrónica: traducir una entrada analógica en movimiento físico preciso. Aprenderás a leer un voltaje variable de un potenciómetro, mapear ese valor a un rango de ángulos y ordenar a un servomotor que gire a esa posición exacta. Esta es tu puerta de entrada para construir proyectos intuitivos e interactivos donde el control manual se encuentra con la automatización.

Las aplicaciones de esta habilidad son vastas y prácticas. Aquí tienes algunas ideas para inspirarte:

  • Control de brazo robótico: Usa un potenciómetro para posicionar manualmente cada articulación de un brazo robótico para operaciones precisas de recoger y colocar.
  • Sistema de paneo e inclinación de cámara: Construye un soporte de cámara controlado remotamente para lapsos de tiempo o vigilancia, paneando e inclinando suavemente con un giro de la perilla.
  • Réplica de indicador analógico: Crea un indicador físico de tablero (como un velocímetro o dial de temperatura) que se mueva según datos de sensores, con el potenciómetro actuando como control manual o herramienta de calibración.
  • Instalaciones de arte interactivo: Crea esculturas cinéticas que respondan a la entrada del espectador, donde girar una perilla cambie la posición de las partes móviles.
  • Dirección de vehículos modelo: Controla el ángulo de dirección de un coche o barco modelo de forma remota, proporcionando una sensación más intuitiva y analógica que los botones digitales.

Esta guía se basa en el tutorial en video Lección 86: Controlar la posición de un servomotor usando potenciómetro de Robojax (en el video en 00:00). Te guía a través de todo el proceso, desde entender el cableado hasta explicar el código que lo hace funcionar. Comencemos.

Hardware y Componentes

Para seguir este proyecto, necesitarás los siguientes componentes:

  • Una placa Arduino (por ejemplo, Uno, Nano)
  • Un servomotor estándar (por ejemplo, SG90 o MG996R)
  • Un potenciómetro (resistencia variable, típicamente 10kΩ)
  • Cables de puente
  • Una placa de pruebas (opcional, para conexiones más fáciles)

Entendiendo el Cableado

El cableado para este proyecto es sencillo. La clave es proporcionar las conexiones correctas de alimentación y señal tanto para el servo como para el potenciómetro. El servo es un dispositivo que consume mucha energía, por lo que recibe su alimentación directamente del pin de 5V del Arduino. El potenciómetro actúa como un divisor de voltaje, y leemos el voltaje en su cursor (el pin del medio) para determinar su posición. (en el video en 01:05)

Un truco inteligente que usa este proyecto es crear una fuente adicional de 5V en un pin digital para alimentar el potenciómetro, ya que algunas placas Arduino solo tienen un pin dedicado de 5V. Esto se hace en el código configurando un pin digital (pin 8) a HIGH, que emite 5V. (en el video en 00:39)

Aquí está el diagrama de cableado mencionado en el video:

Cableado de Arduino para servomotor con potenciómetro
Cableado de Arduino para servomotor con potenciómetro

Desglosemos las conexiones:

  • Servomotor:
    • Alimentación (cable rojo) → Pin 5V del Arduino
    • Tierra (cable marrón/negro) → Pin GND del Arduino
    • Señal (cable naranja/amarillo) → Pin 3 del Arduino (un pin compatible con PWM)
  • Potenciómetro:
    • Pin izquierdo → Pin GND del Arduino
    • Pin del medio (cursor) → Pin analógico A0 del Arduino
    • Pin derecho → Pin 8 del Arduino (definido como VCC2 en el código)

Explicación del Código

El código para este proyecto es elegantemente simple. Aprovecha algunas funciones clave de Arduino para leer el potenciómetro y controlar el servo. Centrémonos en las partes configurables por el usuario que puedes ajustar para tus propios proyectos. (en el video en 03:00)

En la parte superior del boceto, definirás los pines y crearás el objeto del servo. Estas son las variables principales que cambiarás según tu cableado:

#include <Servo.h>

Servo myservo;  // crea un objeto servo para controlar un servo

int potpin = A0;  // pin analógico usado para conectar el potenciómetro
int servoPin = 3; // define un pin digital (con PWM) para el servo. Solo se pueden usar los pines 3, 5, 6, 9, 10, 11
int VCC2 = 8;// define VCC adicional para el potenciómetro
int val;    // variable para leer el valor del pin analógico

Esto es lo que hace cada parte:

  • Servo myservo;: Esta línea crea un objeto llamado myservo que usaremos para controlar nuestro servomotor específico. Puedes renombrarlo, pero debes usar el mismo nombre más adelante en el código.
  • int potpin = A0;: Esto define qué pin analógico está conectado al cursor del potenciómetro. Si mueves el cable a un pin analógico diferente, debes actualizar este número.
  • int servoPin = 3;: Esto establece el pin digital para el cable de señal del servo. Es crucial usar un pin compatible con PWM (generalmente aquellos marcados con un '~' en la placa). El comentario lista los pines válidos para la mayoría de los Arduinos.
  • int VCC2 = 8;: Este es el pin que usamos como fuente secundaria de 5V para el potenciómetro. Si tienes una placa con múltiples pines de 5V, puedes conectarlo directamente y eliminar esta parte del código.

En la función setup(), el código inicializa el servo y configura el pin de alimentación adicional. La función myservo.attach(servoPin) es esencial, ya que le indica al Arduino qué pin está conectado al cable de señal del servo.

void setup() {
  Serial.begin(9600);          //  configura el serial
  myservo.attach(servoPin);  // conecta el servo en el pin 3 al objeto servo

  pinMode(VCC2, OUTPUT);// configura el pin 8 como salida
  digitalWrite(VCC2, HIGH);// pone el pin 8 en HIGH para que actúe como pin de 5V
}

La lógica principal está en la función loop(). Lee el valor del potenciómetro, lo escala a un ángulo y ordena al servo que se mueva. Las dos funciones críticas aquí son analogRead() y map(). (en el video en 04:27)

void loop() {
  val = analogRead(potpin);            // lee el valor del potenciómetro (valor entre 0 y 1023)
  val = map(val, 0, 1023, 0, 180);     // lo escala para usarlo con el servo (valor entre 0 y 180)
  myservo.write(val);                  // establece la posición del servo según el valor escalado
  Serial.print(val);
  Serial.println();
  delay(50);                           // espera a que el servo llegue a esa posición
}

Así es como funciona:

  • analogRead(potpin): Esta función lee el voltaje del cursor del potenciómetro y devuelve un valor entre 0 (0V) y 1023 (5V).
  • map(val, 0, 1023, 0, 180): Esta es la clave de todo el proyecto. Toma el valor bruto del potenciómetro (0 a 1023) y lo convierte proporcionalmente a un ángulo de servo (0 a 180 grados). Por ejemplo, si el potenciómetro lee 511 (aproximadamente la mitad), la función map() devolverá 90, moviendo el servo a su posición central.
  • myservo.write(val): Esta función toma el ángulo calculado (ahora almacenado en val) y le indica al servo que gire a esa posición.
  • delay(50): Esto añade una pequeña pausa al final de cada bucle. Controla la velocidad de actualización. Un retardo mayor (como 200ms) hace que el servo se mueva en pasos, mientras que un retardo menor (como 50ms) hace que el movimiento sea muy suave. Puedes ajustarlo para cambiar la capacidad de respuesta. (en el video en 07:26)

Demostración del Proyecto en Vivo

En el video, puedes ver el proyecto en acción. A medida que se gira la perilla del potenciómetro, el brazo del servomotor sigue su posición proporcionalmente. El monitor serial imprime el ángulo actual, confirmando que el mapeo está funcionando correctamente. Cuando el potenciómetro está en su posición mínima, el servo está a 0 grados. Al girar la perilla hasta su máximo, el servo rota suavemente hasta 180 grados. (en el video en 06:33)

Este bucle de retroalimentación en tiempo real demuestra la integración perfecta de un sensor analógico con un actuador digital, creando un sistema de control receptivo e intuitivo.

Capítulos

  • [00:00] Introducción y Resumen del Proyecto
  • [01:05] Esquemático y Diagrama de Conexiones
  • [02:07] Demostración de Conexiones Físicas
  • [03:00] Explicación del Código
  • [06:33] Demostración y Pruebas en Vivo
  • [07:26] Ajuste de la Velocidad de Respuesta del Servo

Imágenes

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
Idioma: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = A0;  // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  //
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object

  pinMode(VCC2, OUTPUT);// set pin 8 as output
  digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  Serial.print(val);
  Serial.println();
  delay(50);                           // waits for the servo to get there
}
 

Archivos📁

Otros archivos