Construye un Robot SCARA DIY con Arduino – Guía Paso a Paso
En este tutorial aprendemos a construir un robot SCARA basado en Arduino. Te muestro todo el proceso: desde el diseño del robot hasta desarrollar nuestra propia Interfaz Gráfica de Usuario (GUI) para controlarlo. Video o tutorial escrito abajo. Robot de 4 grados de libertad (4 DOF), impulsado por 4 motores paso a paso NEMA 17. Además, pequeño servo para efector final (gripper). Cerebro: Arduino UNO + CNC Shield + 4 drivers A4988. Con Processing creé una GUI con control por Cinemática Directa (Forward Kinematics) e Inversa (Inverse Kinematics). La GUI permite usar ambos métodos simultáneamente en la misma pantalla. Ángulos y coordenadas X,Y,Z siempre vinculados y visibles. Funcionamiento automático: botón Save guarda cada posición/movimiento. Botón Run ejecuta secuencia guardada en bucle. Velocidad y aceleración ajustables desde GUI. Vista del modelo 3D. Diseñado con 3DEXPERIENCE SOLIDWORKS (patrocinador). 3DEXPERIENCE SOLIDWORKS = SOLIDWORKS con capacidades cloud vía plataforma 3DEXPERIENCE. Acceso a datos/modelos desde cualquier lugar/dispositivo. Apps productividad/gestión incluidas. Ej.: Project Planner (organizar tareas, plazos, progreso). 3D Markup (ver, explorar, anotar modelos desde portátil, tablet, móvil). También SOLIDWORKS xDesign, modelador 3D cloud en navegador, usable solo o con Solidworks, ideal para modelar en cualquier sitio/dispositivo. Gracias Solidworks por patrocinar. Enlaces para probar: Prueba 3DEXPERIENCE gratis: www.solidworks.com/HTMTryNow Más sobre 3DEXPERIENCE SOLIDWORKS: www.solidworks.com/HTMLearnMore Volvamos al modelo. Objetivo: mayoría de piezas imprimibles en 3D (incluso en impresoras con cama pequeña). Poleas GT2 también imprimibles. Diseño paramétrico: cambias número de dientes → dimensiones se actualizan solos. Primera articulación: reducción 20:1 en dos etapas con poleas custom. Correas GT2 lazo cerrado 200 mm y 300 mm. Articulaciones: 2 rodamientos de empuje + 1 radial. Segunda: reducción 16:1 mismo sistema. Tercera: 4:1 una sola etapa. Articulaciones huecas → paso cables motores y micro switches. Ranuras en correas para poleas tensoras. Gripper: servo MG996R, puntas intercambiables para distintos tamaños. Eje Z: husillo 8 mm. Brazo desliza en 4 varillas lisas 10 mm + rodamientos lineales bolas. Altura = longitud varillas (40 cm). Husillo 2 cm más corto (o motor Z subido 2 cm con espaciadores). Modelo 3D en Thangs (descarga y exploración navegador): Descarga modelo ensamblaje en Thangs. Archivos STL para impresión 3D: Imprimí todo en Creality CR-10 (buena y asequible). Piezas caben en impresoras pequeñas (ej. Ender 3). Mayoría en PLA+ (azul) y PLA normal (poleas, gripper). ~120 h a 60 mm/s. Base = pieza mayor (32 h). A mayor velocidad, menos tiempo. Ver también: Mejores Impresoras 3D para Principiantes y Makers [Actualización 2021] Todas las piezas impresas: Nota: todas con Horizontal Expansion -0,1 mm en slicer → cotas más precisas, mejor encaje con rodamientos, varillas, tornillos. Lista componentes mecánicos (electrónicos en sección circuito): Tornillos necesarios: Empezamos por base. Insertar rodamiento radial 35×47 mm. Luego rodamiento empuje 40×60 mm (entre polea y base). Otro lado base: otro empuje 40×60 + acoplador articulación. Acoplar polea y parte superior: 4 tornillos M4 55 mm. Tuercas autoblocantes, apriete adecuado → articulación robusta pero gira libre. Polea intermedia: emparejada con polea articulación por correa 300 mm. 2 rodamientos 608 (arriba/abajo base). Tornillo M8 45 mm + arandela + tuerca autoblocante. Motor paso a paso para esta articulación: emparejado con polea intermedia por correa 200 mm. 4 tornillos M3 a base. Antes de apriete final, tensar correa al máximo. Nota: cambié tornillo M8 de polea intermedia con cabeza abajo para que quepa en base. Comprobar tensión correas. Si flojas, poleas tensoras. Uso tornillo M5 35 mm + tuercas para polea tensora. Se fija en ranuras de correa → tensar a gusto. Tensé ambos lados. Primera articulación completada. Micro switch para esta articulación. Soldé cables antes de fijar (espacio justo). Tornillo M3 20 mm + tuerca. Acoplador pasa muy cerca del switch → usé solo un tornillo para switch; en otro agujero puse tornillo corto pegado abajo. Switch queda firme y funcional. Eje Z: sobre acoplador, fijar placa base Z. Encima: 4 abrazaderas para varillas lisas. Insertar varillas (ajuste forzado, hasta acoplador). Apriete con tornillos M4/tuercas. Insertar rodamiento para husillo. Cubierta simple para ocultar y dar acabado limpio. Primer brazo: dos piezas atornilladas. Primera pieza: rodamientos lineales (deslizan por varillas). Inserción dura (ajuste justo). Depende precisión impresora. Usar Horizontal Expansion al imprimir y ajustar según tu impresora. En mi caso 2 rodamientos no bajaron del todo, pero no es grave. Unir dos piezas brazo: 4 tornillos M5 25 mm. Motor paso a paso 2ª articulación. Polea GT2 20 dientes impresa (diseño paramétrico, funciona bien). Fijar tuerca husillo. Correas y poleas 2ª articulación: 400 mm y 300 mm. Mismo procedimiento que 1ª. 2ª y 3ª articulación: rodamientos menores. Radial 30×42 mm, empuje 35×52 mm. Antes de 2º acoplador: insertar 6 tornillos M4 20 mm en ranuras hexagonales. Sirven para atornillar 2º brazo. Si hace falta tensar correas, mismo método poleas tensoras. Fijé 2º micro switch. Brazo 1 completado. Unir 2º brazo a acoplador: tornillos previos en acoplador fijan parte superior 2º brazo. Probé juego (backlash) en articulaciones. Esperaba algo por correas, pero había mucho juego entre mitades de articulación. Problema: agujeros tornillos ligeramente mayores que tornillos. Solución: ajuste más apretado tornillo-agujero. En mi caso: taladré agujeros a 4,5 mm y usé tornillos M5 en vez de M4. Actualicé modelo 3D: agujeros 3,5 mm → tornillos M4 funcionan. También retocqué 1ª articulación. Juego casi eliminado (salvo backlash correas). 2º brazo: motor 3ª articulación. Motor NEMA 17 más corto (24 cm) para aligerar brazo. Correas/poleas 3ª articulación: una sola etapa, correa 400 mm. Antes de unir parte inferior a superior: conectar motor y micro switch, pasar cables por 2ª articulación. Insertar cables efector final. Usé cable 4 hilos de motor paso a paso para servo gripper (3 hilos). Insertar tuercas M4 en ranuras brazo superior → fijar parte inferior. Antes de cerrar, pasar cables bajo ganchos para evitar partes móviles. Cables saliendo de 2ª articulación pueden pillarse con tuercas polea → soporte cables impreso para apartarlos. Cables por un lado del brazo. Cubierta 1er brazo: encaje a presión (snap-fit). Brazos completados. Insertar conjunto en varillas Z. Placa superior Z: micro switch Z + 4 abrazaderas. Antes de poner placa superior: cubierta simple (como inferior) oculta abrazaderas, tornillos, switch. Luego placa superior atornillada a varillas. Husillo: el mío venía largo → corté 38 cm con sierra metal. Motor 4º paso a paso + acoplador eje 5→8 mm. Pasar cables por cubierta y fijar a placa superior (2 tornillos). Gestión cables: fundas + bridas. Marcar cables antes de meter en fundas para no equivocarse. Efector final: gripper simple con servo MG996R. Basado en 2 varillas 6 mm donde deslizan lados. Lados deslizantes → servo por perno, links impresos, tornillos/tuercas M3. Todo gripper con M3. Espacio justo → paciencia. Ventaja: puntas intercambiables (más anchas/estrechas/formas). Fijar gripper a brazo: tornillos/tuercas M4. Conectar servo a cables preinstalados. ¡Robot SCARA montado completamente! Falta electrónica. Arduino UNO + CNC Shield + 4 drivers A4988. Aunque es robot y parece complejo, eso es toda la electrónica. Alternativa: Arduino MEGA + RAMPS (controladora impresora 3D). Carcasa impresa 3D para Arduino UNO, se fija a base. Micropaso 1/4 → jumpers en pines correspondientes. Conectar motores y micro switches a CNC Shield. Diagrama de circuito: Componentes: Alimentación: 12 V, mínimo 4 A (sugiero 6 A). Depende de limitación corriente drivers (poner mínimo posible). Metí cables en carcasa dejando disipadores drivers libres, puse tapa. Robot listo. Fijar base a algo. Usé madera 20 mm. Base robot: 12 agujeros. Imprimí plano base, úsalo para taladrar madera. Avellané lado inferior (tornillos allen cabeza plana, rasantes). Inserté tuercas M4 en ranuras base y atornillé madera a base. Ideal: atornillar a mesa; yo usé sargentos. Robot SCARA completado. Veamos cómo funciona. Ver también: Brazo Robot Arduino con Control por Smartphone Dos métodos de control en posicionamiento/orientación: cinemática directa e inversa. Cinemática directa: hallar posición/orientación efector desde ángulos articulares dados. Cinemática inversa: hallar ángulos articulares para posición dada del efector. Tiene más sentido en robótica: queremos que la herramienta vaya a X,Y,Z concreta. Ecuaciones (trigonometría) para ambas cinemáticas. Al final del artículo: códigos Arduino y Processing completos. Ecuaciones en código (Processing): Cinemática directa: calcula X,Y del efector según ángulos theta1, theta2 y longitudes L1, L2. Cinemática inversa: calcula theta2, theta1 según X,Y dados. Según cuadrante, ajustes con "if". Configuración robot: cinemática inversa con 2 eslabones. 3er ángulo "phi" = orientación gripper. GUI con librería Datos: ángulos articulares, valor gripper, velocidad, aceleración, flags save/run. Arduino recibe un String largo. Extraer datos a variables separadas: Con variables, actuamos. Botón SAVE → guarda ángulos actuales en arrays. Botón RUN → ejecuta pasos guardados, etc. Control motores: librería Logré implementar aceleración/desaceleración pero no tan suave como quería. Códigos completos Arduino y Processing al final. Subido código a Arduino, ejecutamos Processing, conectamos alimentación → robot va a home. Desde ahí: control manual o automático. Cualquier efector: extrusora 3D → impresora 3D; cabeza láser → cortadora láser. Planeo probar ambas, ¡suscríbete! Notas finales: robot no tan rígido como esperaba. Problema: casi todo (eje Z, brazos) soportado solo por 1ª articulación. Peso + fuerzas inerciales al mover → estrés en base (plástico → se dobla un poco). Correas no exentas de backlash → reduce rigidez. Pero proyecto sirve para aprender funcionamiento SCARA y animarte a construir uno. Preguntas en comentarios y mira mi Colección Proyectos Arduino.Resumen


Modelo 3D del Robot SCARA







Impresión 3D de piezas del robot


Montaje del robot





























Diagrama de circuito SCARA




Finalizando montaje



Funcionamiento del robot SCARA


Programación SCARA – Código Arduino y Processing
// CINEMÁTICA DIRECTA void forwardKinematics() { float theta1F = theta1 * PI / 180; // grados a radianes float theta2F = theta2 * PI / 180; xP = round(L1 * cos(theta1F) + L2 * cos(theta1F + theta2F)); yP = round(L1 * sin(theta1F) + L2 * sin(theta1F + theta2F)); }// CINEMÁTICA INVERSA void inverseKinematics(float x, float y) { theta2 = acos((sq(x) + sq(y) - sq(L1) - sq(L2)) / (2 * L1 * L2)); if (x < 0 & y < 0) { theta2 = (-1) * theta2; } theta1 = atan(x / y) - atan((L2 * sin(theta2)) / (L1 + L2 * cos(theta2))); theta2 = (-1) * theta2 * 180 / PI; theta1 = theta1 * 180 / PI; // Ajuste ángulos según cuadrante coordenada final x,y if (x >= 0 & y >= 0) { // 1er cuadrante theta1 = 90 - theta1; } if (x < 0 & y > 0) { // 2º cuadrante theta1 = 90 - theta1; } if (x < 0 & y < 0) { // 3er cuadrante theta1 = 270 - theta1; phi = 270 - theta1 - theta2; phi = (-1) * phi; } if (x > 0 & y < 0) { // 4º cuadrante theta1 = -90 - theta1; } if (x < 0 & y == 0) { theta1 = 270 + theta1; } // Calcular ángulo "phi" para gripper paralelo a eje X phi = 90 + theta1 + theta2; phi = (-1) * phi; // Ajuste phi según cuadrante if (x < 0 & y < 0) { // 3er cuadrante phi = 270 - theta1 - theta2; } if (abs(phi) > 165) { phi = 180 + phi; } theta1=round(theta1); theta2=round(theta2); phi=round(phi); cp5.getController("j1Slider").setValue(theta1); cp5.getController("j2Slider").setValue(theta2); cp5.getController("j3Slider").setValue(phi); cp5.getController("zSlider").setValue(zP); }
controlP5 (Processing). Sliders izq = ángulos articulares; campos texto = posición objetivo. Cada acción → datos por puerto serie a Arduino.if (gripperValuePrevious != gripperValue) { if (activeIK == false) { // Solo cinemática directa si inversa desactivada gripperAdd = round(cp5.getController("gripperValue").getValue()); gripperValue=gripperAdd+50; updateData(); println(data); myPort.write(data); } }public void updateData() { data = str(saveStatus) +","+str(runStatus) +","+str(round(cp5.getController("j1Slider").getValue())) +","+str(round(cp5.getController("j2Slider").getValue())) +","+str(round(cp5.getController("j3Slider").getValue())) +","+str(round(cp5.getController("zSlider").getValue())) +","+str(gripperValue) +","+str(speedSlider) +","+str(accelerationSlider); }if (Serial.available()) { content = Serial.readString(); // Leer datos Processing // Extraer a array data[] for (int i = 0; i < 10; i++) { int index = content.indexOf(","); data[i] = atol(content.substring(0, index).c_str()); content = content.substring(index + 1); } /* data[0] - SAVE data[1] - RUN data[2] - Articulación 1 data[3] - Articulación 2 data[4] - Articulación 3 data[5] - Posición Z data[6] - Gripper data[7] - Velocidad data[8] - Aceleración */// Si SAVE pulsado, guardar en arrays if (data[0] == 1) { theta1Array[positionsCounter] = data[2] * theta1AngleToSteps; theta2Array[positionsCounter] = data[3] * theta2AngleToSteps; phiArray[positionsCounter] = data[4] * phiAngleToSteps; zArray[positionsCounter] = data[5] * zDistanceToSteps; gripperArray[positionsCounter] = data[6]; positionsCounter++; }AccelStepper. Buena para múltiples steppers a la vez, pero limitación: no implementa aceleración/desaceleración al mover varios juntos (importante para suavidad).stepper1.moveTo(stepper1Position); stepper2.moveTo(stepper2Position); stepper3.moveTo(stepper3Position); stepper4.moveTo(stepper4Position); while (stepper1.currentPosition() != stepper1Position || stepper2.currentPosition() != stepper2Position || stepper3.currentPosition() != stepper3Position || stepper4.currentPosition() != stepper4Position) { stepper1.run(); stepper2.run(); stepper3.run(); stepper4.run(); }Conclusión


Proceso de manufactura
- Construya Sensores de Objetos Personalizados para LEGO Mindstorms EV3: "Ojos" Basados en Luz DIY
- Construya un robot con streaming de vídeo controlado por Internet con Arduino y Raspberry Pi
- Construye a Sauron: Robot semihumanoide – Guía completa con Arduino Mega 2560
- Construye un Monitor de Energía y Registrador de Datos Fiable con Arduino – Guía Paso a Paso
- Construya un mando a distancia IR universal con Arduino: Guía paso a paso
- LittleArm 2C: Brazo Robot 3D Imprimible para Educación STEM con Arduino Nano
- Puerta automática con Arduino y sensor ultrasónico HC-SR04
- Construye un Robot Controlado por Gestos en Casa con Arduino y MPU-6050
- Whitepaper: Desbloquee su potencial de automatización – 7 pasos probados para proyectos robóticos de bajo riesgo y alta recompensa
- Cómo Elegir el Robot SCARA Ideal: Guía Completa para Fabricantes
- 7 pasos para construir una hoja de ruta de automatización exitosa