¿Te imaginas construir tu propio brazo robótico y controlarlo con solo presionar botones? ¡Hoy lo vas a lograr! Vamos a combinar todo lo aprendido sobre servomotores, motores paso a paso y entradas digitales para crear un sistema completo. Esta es tu oportunidad de construir algo real que responda a tus comandos.
¿Cómo funciona este sistema?
Servos
Cada servo controla una articulación del brazo. Cuando presionas un botón, el servo se mueve hacia adelante o hacia atrás dependiendo del botón.
Ejemplo:
Botón A: mueve el hombro hacia arriba
Botón B: mueve el hombro hacia abajo
Motor paso a paso
Está controlado por un encoder rotatorio, una perilla que detecta giros en ambas direcciones.
• Si giras el encoder a la derecha, la base del brazo gira en ese sentido
• Si giras el encoder a la izquierda, la base gira hacia el lado contrario
Botones
El Arduino detecta cuál botón estás presionando y envía la señal adecuada al componente. No se usan joysticks ni potenciómetros, solo entradas digitales.
¿Qué es un Encoder Rotatorio?
Un encoder rotatorio es como una perilla que gira infinitamente a la izquierda o a la derecha. Pero en lugar de enviar un valor analógico, envía pulsos digitales codificados que el Arduino interpreta como “gira a la izquierda” o “gira a la derecha”.
¿Cómo detecta la dirección de giro?
Cada vez que giras el encoder, genera dos señales digitales (CLK y DT) desfasadas entre sí. Arduino compara cuál cambia primero:
Si CLK cambia antes que DT, el giro es hacia la derecha.
Si DT cambia antes que CLK, el giro es hacia la izquierda.
¿Qué son las resistencias pull-down y por qué son importantes?
Cuando conectamos un botón o un encoder a una entrada digital de Arduino, necesitamos asegurarnos de que esa entrada tenga un valor definido (HIGH o LOW) todo el tiempo, incluso cuando el botón no está siendo presionado.
➔ Sin pull-down: el pin puede leer valores aleatorios (flotar).
➔ Con pull-down: el pin siempre lee LOW (0V) cuando el botón no se presiona.
Cada botón de dirección va a un pin digital del Arduino, y necesita una resistencia pull-down (~10kΩ) conectada a GND.
Así, cuando el botón no está presionado, el pin se mantiene estable en LOW.
Cuando se presiona, se conecta a 5V → el pin cambia a HIGH y el Arduino lo detecta.
Actividad 1: Ensamblar el brazo robótico
Vamos a crear la estructura física del brazo usando materiales sencillos pero efectivos.
3 servomotores
1 motor paso a paso (28BYJ-48)
1 caja de cartón
Palitos de paleta
Pistola de silicón caliente
1 tapa de botella (para la base giratoria)
1 cúter
Imagen del brazo armado:
Video con explicación:
Actividad 2: Conectar y programar el brazo
Ya tienes el cuerpo del brazo robótico, ahora vamos a darle cerebro y energía.
Arduino Uno
Encoder rotatorio
6 botones
Jumpers
1 protoboard
1 módulo ULN2003 (driver del motor paso a paso)
6 resistencias de 10kΩ (pull-down)
Fuente de energía (puede ser USB o batería con regulador)
Conexiones:
Video con explicación:
Código de programación:
#include <Servo.h>
#include <Stepper.h>
#define STEPS 32
#define temp 25
volatile boolean TurnDetected;
volatile boolean rotationdirection;
const int PinCLK=2;
const int PinDT=3;
int RotaryPosition=0;
int PrevPosition;
int StepsToTake;
Stepper small_stepper(STEPS, 4, 6, 5, 7);
void isr () {
delay(4);
if (digitalRead(PinCLK))
rotationdirection= digitalRead(PinDT);
else
rotationdirection= !digitalRead(PinDT);
TurnDetected = true;
}
int i=0,j=0,x=0;
Servo servomotor3;
int boton_sub3=0;
int boton_baj3=0;
Servo servomotor2;
int boton_sub2=0;
int boton_baj2=0;
Servo servomotor1;
int boton_sub1=0;
int boton_baj1=0;
void setup(){
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);
attachInterrupt (0,isr,FALLING);
servomotor3.attach(13);
servomotor3.write(0);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
servomotor2.attach(12);
servomotor2.write(0);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
servomotor1.attach(11);
servomotor1.write(0);
pinMode(A0,INPUT);
pinMode(A1,INPUT);
}
void loop(){
small_stepper.setSpeed(700);
if (TurnDetected) {
PrevPosition = RotaryPosition;
if (rotationdirection) {
RotaryPosition=RotaryPosition-1;}
else {RotaryPosition=RotaryPosition+1;}
TurnDetected = false;
if ((PrevPosition + 1) == RotaryPosition) {
StepsToTake=50;
small_stepper.step(StepsToTake);}
if ((RotaryPosition + 1) == PrevPosition) {
StepsToTake=-50;
small_stepper.step(StepsToTake);}
}
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
boton_sub3=digitalRead(A4);
boton_baj3=digitalRead(A5);
if(boton_sub3==HIGH){
i++;
servomotor3.write(i);
delay(temp);
}
if(boton_baj3==HIGH){
i--;
servomotor3.write(i);
delay(temp);
}
boton_sub2=digitalRead(A2);
boton_baj2=digitalRead(A3);
if(boton_sub2==HIGH){
j++;
servomotor2.write(j);
delay(temp);
}
if(boton_baj2==HIGH){
j--;
servomotor2.write(j);
delay(temp);
}
boton_sub1=digitalRead(A0);
boton_baj1=digitalRead(A1);
if(boton_sub1==HIGH){
x++;
servomotor1.write(x);
delay(temp);
}
if(boton_baj1==HIGH){
x--;
servomotor1.write(x);
delay(temp);
}
}
#include <Servo.h>
Carga la librería para controlar servomotores.
#include <Stepper.h>
Carga la librería para controlar motores paso a paso.
#define STEPS 32
Define el número de pasos por vuelta del motor paso a paso.
#define temp 25
Define un pequeño delay entre movimientos del servo.
PinCLK = 2, PinDT = 3
Pines conectados al encoder rotatorio.
isr()
Interrupción que detecta el giro del encoder (y en qué dirección).
attachInterrupt(0, isr, FALLING)
Activa la interrupción cuando baja la señal del pin CLK.
servomotor1, servomotor2, servomotor3
Representan las tres articulaciones del brazo.
Cada servo tiene dos botones: uno para subir (incrementar ángulo), uno para bajar (disminuir ángulo).
Pines A0–A5 se usan como entradas digitales para los botones.
Detecta si el encoder giró.
Si giró a la derecha → avanza 50 pasos.
Si giró a la izquierda → retrocede 50 pasos.
Después de moverse, apaga las bobinas del motor (digitalWrite(4–7, LOW)).
Lee el estado de cada par de botones.
Si se presiona el botón de subir, aumenta el ángulo del servo correspondiente.
Si se presiona el botón de bajar, disminuye el ángulo.
Se mueve con servo.write(valor) y un pequeño delay(temp) para suavizar el movimiento.
Quiz de repaso
Presentación Clase 9: Control de Servomotores
Código y conexiones
1. ¿Qué pasa si quemo plástico con el cautín?
Al quemar plástico, liberas humos tóxicos que te hacen daño. ¡Evítalo! Si se pega plástico a la punta, limpia con una esponja húmeda o lana metálica.
2. ¿Qué hago si me quemo con el cautín?
Si eres menor de edad, avisa a un adulto.
Enfría la zona con agua corriente por 10 minutos.
Cubre con una gasa estéril.
Consulta al médico si es grave (ampollas grandes o mucho dolor).
3. ¿Por qué mi cautín cambia de color en la punta?
Oxidación: Límpialo con frecuencia y mantén la punta estañada.
Temperatura alta: No sobrecalientes. Ajusta entre 350-400 °C.
Residuos: Usa estaño de calidad con flux y limpia tras cada uso.
4. ¿Cómo saber si mi cautín es de buena calidad?
Un buen cautín:
Mantiene la temperatura estable.
Permite ajustar la temperatura (idealmente entre 200-450 °C).
Tiene puntas reemplazables y de buena conducción térmica.
7. ¿Cómo ajusto la temperatura de mi cautín?
350-400 °C: Ideal para soldaduras estándar.
300-350 °C: Para componentes sensibles.
Si tu cautín no tiene ajuste, considera uno que lo permita.
8. ¿Qué hacer si mi cautín no calienta bien?
Limpia la punta, puede estar oxidada.
Revisa el cable y las conexiones.
Si sigue fallando, reemplaza el elemento calefactor o el cautín.