Proyecto 7

Brazo Robotico

Construye un brazo articulado con 3 servos. Gira, sube, baja y agarra objetos como un robot industrial.

🦾
Brazo que Agarra Objetos

Controla 3 articulaciones con potenciometros o programa secuencias automaticas.

1

Las 3 Articulaciones

🔄

Base

Pin 9

Gira todo el brazo de izquierda a derecha (0° - 180°)

📐

Codo

Pin 10

Sube y baja el antebrazo (30° - 150° para no golpear)

🤏

Pinza

Pin 11

Abre y cierra para agarrar objetos (30° cerrada - 90° abierta)

2

Cables del Servo

Los servos SG90 tienen 3 cables con colores estandar. Es importante conectarlos correctamente:

Marron → GND (tierra)
Rojo → 5V (alimentacion)
Naranja → Pin de senal (9, 10 u 11)
💡
Truco: Algunos servos usan Negro-Rojo-Blanco en lugar de Marron-Rojo-Naranja. Negro = GND, Blanco = Senal.
Alimentacion Externa Recomendada

Con 3 servos moviendose a la vez, el pin 5V de Arduino puede no dar suficiente corriente. Esto causa que Arduino se reinicie o los servos tiemblen.

Solucion:

  • Usa 4 pilas AA (6V) o una fuente de 5V externa para los servos
  • Conecta el GND de la fuente externa al GND de Arduino (tierra comun)
  • Los cables naranjas (senal) van a los pines de Arduino
3

Potenciometros como Joysticks

Cada potenciometro controla una articulacion. Al girarlo, Arduino lee un valor de 0 a 1023 y lo convierte al angulo del servo (0° a 180°).

Potenciometro
512
Lectura: 0 - 1023
90°
Servo: 0° - 180°
angulo = map(lectura, 0, 1023, 0, 180)
Entrada (pot)
0 → 1023
se convierte a
Salida (servo)
0° → 180°
Potenciometro Pin Analogico Controla
Pot 1 A0 Base (giro)
Pot 2 A1 Codo (arriba/abajo)
Pot 3 A2 Pinza (abrir/cerrar)
4

Diagrama del Circuito

Circuito Brazo Robotico - 3 Servos + 3 Potenciometros ARDUINO UNO DIGITAL 9 10 11 ANALOG A0 A1 A2 POWER 5V GND FUENTE EXTERNA 5V - 6V (4x AA o adaptador) SERVO BASE Pin 9 SERVO CODO Pin 10 SERVO PINZA Pin 11 + 5V (fuente externa) GND (comun) POT BASE A0 POT CODO A1 POT PINZA A2 Cables: Senal servo Senal pot 5V GND
5

Movimiento Suave

Si movemos el servo directamente al angulo objetivo, el movimiento es brusco y puede danar el brazo o tirar objetos. Usamos una funcion que mueve gradualmente, paso a paso.

❌ Movimiento Directo

Salta instantaneamente. Brusco, puede tirar objetos.

✅ Movimiento Suave

Avanza poco a poco. Suave, control preciso.

Funcion moverSuave()
int moverSuave(int actual, int objetivo, int paso) {
  if (actual < objetivo) {
    return min(actual + paso, objetivo);  // Subir
  } else if (actual > objetivo) {
    return max(actual - paso, objetivo);  // Bajar
  }
  return actual;  // Ya llegamos
}

Cada vez que se llama, avanza 2 grados hacia el objetivo. Si objetivo es 90° y actual es 80°, despues de llamarla sera 82°, luego 84°, etc.

6

El Codigo

p7_brazo_robotico.ino
#include <Servo.h>

// Pines de servos
const int PIN_BASE = 9;
const int PIN_CODO = 10;
const int PIN_PINZA = 11;

// Pines de potenciometros
const int POT_BASE = A0;
const int POT_CODO = A1;
const int POT_PINZA = A2;

// Limites de movimiento
const int BASE_MIN = 0;
const int BASE_MAX = 180;
const int CODO_MIN = 30;    // Evitar golpear la base
const int CODO_MAX = 150;
const int PINZA_ABIERTA = 90;
const int PINZA_CERRADA = 30;

// Servos
Servo servoBase;
Servo servoCodo;
Servo servoPinza;

// Posiciones actuales
int posBase = 90;
int posCodo = 90;
int posPinza = 90;

void setup() {
  Serial.begin(9600);
  Serial.println("Brazo Robotico - EigenRobotics");

  servoBase.attach(PIN_BASE);
  servoCodo.attach(PIN_CODO);
  servoPinza.attach(PIN_PINZA);

  posicionInicial();
  delay(1000);
}

void loop() {
  // Leer potenciometros
  int lecturaBase = analogRead(POT_BASE);
  int lecturaCodo = analogRead(POT_CODO);
  int lecturaPinza = analogRead(POT_PINZA);

  // Mapear a angulos
  int objetivoBase = map(lecturaBase, 0, 1023, BASE_MIN, BASE_MAX);
  int objetivoCodo = map(lecturaCodo, 0, 1023, CODO_MIN, CODO_MAX);
  int objetivoPinza = map(lecturaPinza, 0, 1023, PINZA_ABIERTA, PINZA_CERRADA);

  // Mover suavemente
  posBase = moverSuave(posBase, objetivoBase, 2);
  posCodo = moverSuave(posCodo, objetivoCodo, 2);
  posPinza = moverSuave(posPinza, objetivoPinza, 3);

  // Aplicar posiciones
  servoBase.write(posBase);
  servoCodo.write(posCodo);
  servoPinza.write(posPinza);

  delay(20);
}

int moverSuave(int actual, int objetivo, int paso) {
  if (actual < objetivo) return min(actual + paso, objetivo);
  if (actual > objetivo) return max(actual - paso, objetivo);
  return actual;
}

void posicionInicial() {
  servoBase.write(90);
  servoCodo.write(90);
  servoPinza.write(PINZA_ABIERTA);
  posBase = 90;
  posCodo = 90;
  posPinza = PINZA_ABIERTA;
}
servo.attach(pin)
Conecta el objeto servo al pin fisico. Hay que hacerlo para cada servo.
analogRead(POT)
Lee el valor del potenciometro (0-1023 segun la posicion del dial).
map(valor, ...)
Convierte el rango 0-1023 al rango de angulos del servo (ej: 0-180).
moverSuave()
Funcion que avanza gradualmente hacia el objetivo, evitando saltos bruscos.
servo.write(angulo)
Mueve el servo a la posicion indicada (0° a 180°).
delay(20)
Pequena pausa de 20ms entre actualizaciones. 50 veces por segundo.
7

Demo Interactivo

Controla el Brazo

Mueve los deslizadores como si fueran potenciometros

Base: 90°
🔄 Base (Giro) 90°
0° (izquierda) 180° (derecha)
📐 Codo (Altura) 90°
30° (abajo) 150° (arriba)
🤏 Pinza Abierta
Cerrada Abierta
Pinza abierta
8

Simulador

Wokwi Simulator
💡
En Wokwi: Anade 3 servos y 3 potenciometros. Los potenciometros se controlan con el raton para simular el giro.
9

Pasos de Construccion

1

Construye la estructura

Usa LEGO Technic o piezas impresas 3D. Necesitas base, brazo, antebrazo y pinza.

2

Monta los servos

Servo 1 en la base (giro horizontal), Servo 2 en el codo, Servo 3 en la pinza.

3

Prepara la alimentacion

Conecta 4 pilas AA (6V) o fuente 5V externa. Une el GND con el de Arduino.

4

Conecta los servos

Marron a GND, rojo a 5V (externo), naranja a pines 9, 10 y 11.

5

Coloca los potenciometros

Cada pot: extremos a 5V y GND de Arduino, centro a A0, A1 y A2.

6

Sube el codigo

Copia el codigo y subelo. Los servos iran a posicion inicial (90°).

7

Ajusta los limites

Modifica CODO_MIN, CODO_MAX etc. para que el brazo no golpee la base.

8

Prueba el control manual

Gira los potenciometros y observa como cada articulacion responde suavemente.

9

Anade objetos

Pon piezas LEGO o canicas en la mesa. Intenta agarrarlas y moverlas.

10

Programa secuencias

Usa la funcion secuenciaAgarrar() o crea las tuyas propias.

10

Experimentos

🎮

Control con Joystick

Reemplaza los potenciometros por un joystick analogico para control tipo videojuego

📡

Control Remoto IR

Integra el proyecto P6 para mover el brazo con el mando a distancia

🔄

4º Servo: Muneca

Anade un servo extra para rotar la pinza 360°

💾

Grabar Movimientos

Guarda posiciones en un array y reproducelas como "memoria muscular"

🏆

Juego de Precision

Competicion: ¿Cuantos objetos puedes mover en 1 minuto?

🎨

Brazo Dibujante

Pon un rotulador en la pinza y programa figuras geometricas