¡Hola, equipo! En el primer parcial, aprendimos a trabajar con señales digitales: HIGH o LOW, encendido o apagado. Pero el mundo real no es tan simple. ¿Qué pasa con los valores intermedios? ¿Cómo controlamos el volumen de una bocina o la posición exacta de un brazo robótico?
Hoy nos sumergimos en el mundo analógico. Aprenderemos a leer valores "grises" con un potenciómetro y a crear movimiento preciso y controlado con un servomotor.
🧠 Protagonista 1: El Potenciómetro (La Perilla de Control)
Un potenciómetro es una resistencia variable. Piensa en él como la perilla de volumen de un estéreo o el regulador de luz de una lámpara. Al girar su eje, cambias la cantidad de resistencia que ofrece, y Arduino puede leer ese cambio como un valor de voltaje.
- ¿Cómo funciona?: Tiene 3 pines. Conectamos los extremos a 5V y a GND. El pin del medio, llamado "wiper", se mueve a lo largo de la pista resistiva. Dependiendo de su posición, entregará un voltaje entre 0V y 5V.
- Lectura en Arduino: Usamos la función
analogRead(), que convierte ese voltaje en un número entre 0 y 1023. 0 es cuando la perilla está girada completamente hacia el lado de GND, y 1023 es cuando está del lado de 5V.
⚙️ Protagonista 2: El Servomotor (El Músculo Preciso)
Un servomotor no es como un motor normal que solo gira sin parar. Un servo tiene un "cerebro" interno (un pequeño circuito de control) que le permite girar a un ángulo exacto, generalmente entre 0 y 180 grados, y mantenerse firme en esa posición. ¡Es ideal para brazos robóticos o sistemas de dirección!
- ¿Cómo funciona?: También tiene 3 cables. Dos para alimentación (5V y GND) y uno para la señal de control.
- Control en Arduino: A diferencia del potenciómetro, enviamos pulsos al servo. Para facilitarnos la vida, usamos la "librería" de Arduino llamada
Servo.h, que nos permite darle órdenes sencillas comomiServo.write(90);para que vaya al centro exacto.
🔌 El Circuito: Perilla de Mando
Construiremos un sistema donde la posición del potenciómetro controle directamente el ángulo del servomotor. ¡Es la base de un control remoto!
Componentes Necesarios:
- 1 Arduino UNO y Protoboard
- 1 Potenciómetro de 10kΩ
- 1 Micro Servomotor (SG90)
- Cables Jumper
📝 Instrucciones de Conexión:
- Potenciómetro:
- Pin izquierdo: a 5V del Arduino.
- Pin derecho: a GND del Arduino.
- Pin central: al pin analógico A0 del Arduino.
- Servomotor:
- Cable Marrón o Negro: a GND del Arduino.
- Cable Rojo: a 5V del Arduino.
- Cable Naranja o Amarillo (Señal): al pin digital 9 (fíjate que tiene el símbolo
~que soporta PWM).
⚡ Diagrama de armado
💡 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.
🧠 El Código: Traduciendo Perilla a Movimiento
El reto aquí es "mapear" o traducir el rango de lectura del potenciómetro (0 a 1023) al rango de movimiento del servo (0 a 180). Por suerte, ¡Arduino tiene una función perfecta para eso!
/*
* Misión 06: Control Fino
* Descripción: Controla el ángulo de un servomotor usando un potenciómetro.
* Por: Profe Campos
* CECyTEM 05 Guacamayas
*/
// Primero, necesitamos incluir la librería oficial de Arduino para Servos.
// Una librería es un conjunto de código pre-hecho que nos facilita la vida.
#include <Servo.h>
// --- ZONA DE CONFIGURACIÓN ---
Servo miServo; // Creamos un objeto "Servo". Piensa que es como darle un nombre a nuestro motor.
const int pinPot = A0; // Pin donde leemos el potenciómetro.
const int pinServo = 9; // Pin donde controlamos el servo.
int valorPot; // Variable para guardar la lectura del potenciómetro (0-1023).
int angulo; // Variable para guardar el ángulo calculado para el servo (0-180).
void setup() {
Serial.begin(9600); // Iniciamos el monitor para ver los valores.
// "Adjuntamos" nuestro servo al pin 9. Ahora Arduino sabe dónde está conectado.
miServo.attach(pinServo);
}
void loop() {
// 1. LEER: Obtenemos la posición de la perilla (0 a 1023).
valorPot = analogRead(pinPot);
// 2. TRADUCIR (El gran truco):
// La función map() convierte una escala en otra.
// map(variable, min_viejo, max_viejo, min_nuevo, max_nuevo);
angulo = map(valorPot, 0, 1023, 0, 180);
// 3. ACTUAR: Le decimos al servo que se mueva al nuevo ángulo.
miServo.write(angulo);
// 4. DIAGNÓSTICO: Imprimimos ambos valores para ver la traducción en vivo.
Serial.print("Perilla: ");
Serial.print(valorPot);
Serial.print(" -> Angulo: ");
Serial.println(angulo);
delay(15); // Una pausa muy cortita para darle tiempo al motor de llegar a su posición.
}
🚀 ¡Inténtalo Tú Mismo! (Retos)
- Movimiento Inverso: Modifica la función
map()para que, cuando gires la perilla hacia la derecha, el servo gire hacia la izquierda. (Pista: juega con los númerosmin_nuevoymax_nuevo). - Límites de Seguridad: ¿Qué pasa si no quieres que el servo llegue a los extremos? Modifica el código para que el ángulo máximo que alcance sea de 150 grados, sin importar si giras la perilla a fondo.
- Indicador Visual: Añade un LED al circuito. Haz que su brillo cambie en proporción a la posición de la perilla, usando
analogWrite()y la funciónmap(). ¡Controlarás luz y movimiento al mismo tiempo!