19. Torreta pan-tilt de 2 servos con joystick
Dos servos en cruz que apuntan en cualquier dirección, controlados con un joystick. Base de soportes de cámara y radares.
🧰 Lista de materiales
🎯 Qué vas a aprender
A coordinar dos servos en ejes perpendiculares (pan = giro horizontal, tilt = inclinación) y a alimentar varios actuadores sin reiniciar el Arduino.
📚 Teoría: alimentar varios servos
Cada servo puede pedir picos de varios cientos de mA al moverse. Dos servos a la vez superan lo que el regulador del Arduino entrega por su pin de 5 V. La solución: alimentar los servos con un pack de pilas (4×AA ≈ 6 V) y unir solo las masas (GND común) para que las señales tengan referencia.
🔌 Conexiones
| Componente | Pin |
|---|---|
| Joystick VRx / VRy | A0 / A1 |
| Joystick SW | D2 |
| Servo PAN señal | D9 (~) |
| Servo TILT señal | D10 (~) |
| Servos VCC | Pack pilas (+) |
| Servos GND | Pack (−) + GND Arduino |
💻 Código completo
// Torreta pan-tilt con joystick
#include
Servo pan, tilt;
const int VRX = A0, VRY = A1, SW = 2;
int angPan = 90, angTilt = 90;
void setup() {
pan.attach(9);
tilt.attach(10);
pinMode(SW, INPUT_PULLUP);
pan.write(angPan);
tilt.write(angTilt);
}
int aplicarZonaMuerta(int v) {
// v viene -100..100; ignora el centro
if (v > -8 && v < 8) return 0;
return v;
}
void loop() {
int x = map(analogRead(VRX), 0, 1023, -100, 100);
int y = map(analogRead(VRY), 0, 1023, -100, 100);
x = aplicarZonaMuerta(x);
y = aplicarZonaMuerta(y);
// velocidad proporcional al desplazamiento del joystick
angPan = constrain(angPan + x / 40, 0, 180);
angTilt = constrain(angTilt + y / 40, 0, 180);
pan.write(angPan);
tilt.write(angTilt);
if (digitalRead(SW) == LOW) { // recentrar
angPan = angTilt = 90;
pan.write(90); tilt.write(90);
delay(300);
}
delay(20);
} 🛠️ Montaje paso a paso
- Monta los dos servos en cruz (uno sobre el otro).
- Cablea las señales a D9 y D10, alimentación al pack de pilas.
- Une GND del pack con GND del Arduino.
- Conecta el joystick y sube el sketch.
🧩 Resolución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| Movimiento brusco | Sin zona muerta | Aumenta el umbral central |
| Reinicios | Servos en 5 V del Arduino | Usa pack de pilas + GND común |
| Un eje no responde | VRx/VRy intercambiados | Comprueba A0/A1 |
🚀 Para ir más lejos
- Monta el HC-SR04 encima y dibuja un radar en la OLED.
- Coloca la cámara OV7670 para un soporte motorizado.