Ir al contenido
← Volver a Formación Arduino Intermedio

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.

Dificultad: Intermedio · Tiempo: 60 min · Cerebro: Arduino Uno

🧰 Lista de materiales

Arduino Uno R3 (ATmega328P)
Arduino Uno R3 (ATmega328P)
Controla los dos ejes
Joystick analógico doble eje HW-504
Joystick analógico doble eje HW-504
Mando de los dos servos
Microservo SG90 9 g
Microservo SG90 9 g
Eje horizontal (pan)
Microservo MG90S engranaje metálico
Microservo MG90S engranaje metálico
Eje vertical (tilt), más par
sin foto
Portapilas 4×AA
Alimentación de servos aparte
Breadboard 830 puntos
Breadboard 830 puntos
Montaje

🎯 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.

⚠ AtenciónNunca alimentes dos servos directamente del pin 5 V del Arduino: provoca caídas de tensión y reinicios. Pack de pilas + GND común es la regla de oro.

🔌 Conexiones

ComponentePin
Joystick VRx / VRyA0 / A1
Joystick SWD2
Servo PAN señalD9 (~)
Servo TILT señalD10 (~)
Servos VCCPack pilas (+)
Servos GNDPack (−) + 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);
}
💡 ConsejoAquí el joystick controla velocidad de giro (no posición directa): la torreta se mueve mientras mantengas el joystick desviado, como una cámara PTZ real.

🛠️ Montaje paso a paso

  1. Monta los dos servos en cruz (uno sobre el otro).
  2. Cablea las señales a D9 y D10, alimentación al pack de pilas.
  3. Une GND del pack con GND del Arduino.
  4. Conecta el joystick y sube el sketch.

🧩 Resolución de problemas

SíntomaCausaSolución
Movimiento bruscoSin zona muertaAumenta el umbral central
ReiniciosServos en 5 V del ArduinoUsa pack de pilas + GND común
Un eje no respondeVRx/VRy intercambiadosComprueba 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.
← Volver a Formación Arduino