¡Bienvenidos al segundo parcial! Hasta ahora hemos trabajado con salidas digitales (encendido/apagado). Hoy nos adentramos en el mundo del control analógico y el movimiento de precisión. Aprenderemos a leer una perilla (potenciómetro) y a controlar un servomotor, un componente clave en robótica, automatización y cualquier proyecto que requiera mover algo a una posición exacta.
🧠 Protagonista 1: El Potenciómetro
Es una resistencia variable con tres pines. Los dos extremos se conectan a 5V y GND. El pin central (cursor) se mueve a lo largo de la resistencia, actuando como un divisor de voltaje. Al girar la perilla, el voltaje en el pin central cambia, y al leerlo con un pin analógico de Arduino, obtenemos un valor de 0 a 1023.
⚙️ Protagonista 2: El Micro Servomotor SG90
Un servomotor no gira continuamente como un motor normal. Es un motor de "posición". Le puedes ordenar que se mueva a un ángulo específico (entre 0 y 180 grados) y un circuito interno se encargará de mover el eje a esa posición y mantenerla, incluso si hay algo que intente moverlo.
🧠 El Código: Mapeando la Realidad
El reto es que el potenciómetro nos da un valor de 0 a 1023, pero el servo entiende ángulos de 0 a 180. Usaremos la poderosa función `map()` para "traducir" o re-escalar un rango de valores a otro.
/*
* Misión 07: Control Fino
* Descripción: Controla la posición de un servomotor usando un potenciómetro.
* Por: Profe Campos
* CECyTEM 05 Guacamayas
*/
#include <Servo.h> // Incluimos la librería para controlar servos.
Servo miServo; // Creamos un objeto de tipo Servo.
const int pinPot = A0; // Pin analógico para el potenciómetro.
const int pinServo = 9; // Pin PWM para la señal del servo.
int valorPot; // Para guardar la lectura del potenciómetro (0-1023).
int angulo; // Para guardar el ángulo calculado para el servo (0-180).
void setup() {
miServo.attach(pinServo); // Asociamos nuestro objeto servo al pin 9.
}
void loop() {
// 1. Leemos el valor del potenciómetro.
valorPot = analogRead(pinPot);
// 2. Usamos map() para convertir el rango de lectura al rango del servo.
// map(valor_a_convertir, min_original, max_original, min_nuevo, max_nuevo)
angulo = map(valorPot, 0, 1023, 0, 180);
// 3. Le damos la orden al servo de moverse al ángulo calculado.
miServo.write(angulo);
delay(15); // Pequeña pausa recomendada para que el servo tenga tiempo de moverse.
}
🔌 Manos a la Obra: El Circuito
Construiremos un circuito donde al girar la perilla de un potenciómetro, controlemos la posición de un servomotor en tiempo real. ¡Asegúrate de conectar correctamente los 3 cables del servo!
Diagrama del Circuito 7
💡 Conceptos Clave de la Misión
- Librerías (`#include`): Bloques de código pre-hecho que nos dan funcionalidades extra, como controlar servos de manera sencilla.
- Función `map()`: Una herramienta muy útil que re-escala un número de un rango a otro.
🚀 ¡Inténtalo Tú Mismo! (Retos)
- Rango Limitado: Modifica el código para que el servo solo se mueva en un rango más pequeño, por ejemplo, solo entre 45 y 135 grados, aunque gires toda la perilla.
- Barrido Automático: Desconecta el potenciómetro. ¿Puedes programar el servo para que se mueva lentamente de 0 a 180 grados, y luego de regreso, una y otra vez, como un limpiaparabrisas?
- Control por Botones: Añade dos botones. Uno debe mover el servo 10 grados a la derecha cada vez que se presiona, y el otro 10 grados a la izquierda.