Robot industrial seguidor de línea para transporte de materiales
Componentes y suministros
| SparkFun Arduino Pro Mini 328 - 5V/16MHz | ×1 |
| PCB personalizado Puedes encontrar el layout en adjuntos, ten en cuenta que puedes hacer el proyecto sin él. | ×1 |
| Sensor ultrasónico HC-SR04 (genérico) | ×1 |
| Módulo RFID (genérico) | ×1 |
| Sensor seguidor de línea SparkFun RedBot | ×3 |
| Driver motor H-Bridge Texas Instruments 1A Usé L293D, este es compatible | ×1 |
| Batería Li-Ion 1000mAh 7.4V Debe ser 7.4V pero no tiene que ser esta específicamente | ×1 |
| Motoreductor hobby 140 RPM (par) No trae conector para chasis, pero puedes imprimirlo fácilmente | ×1 |
| Rueda 65mm | ×1 |
| Cables jumper (genéricos) | ×1 |
| Interruptor basculante | ×1 |
| Etiqueta RFID (genérica) Tengo 4, puedes usar más o menos según tareas que quieras | ×4 |
| Zumbador | ×1 |
| Header macho 40 posiciones 1 fila (0.1") | ×1 |
Herramientas y máquinas necesarias
- Impresora 3D (genérica)
- Cortadora láser (genérica) No tengo cortadora láser, pedí el corte online y salió genial, así que no necesitas esas herramientas caras
- Soldador (genérico)
Aplicaciones y servicios en línea
- Arduino IDE
- Autodesk Fusion 360
Sobre este proyecto
¿Te has preguntado cómo funcionan esos robots que transportan piezas en líneas de montaje? Vi robots así en la fábrica de Opel en Polonia, pregunté mucho y me explicaron: es básicamente un seguidor de línea muy avanzado. En vez de cinta negra hay banda magnética y en vez de sensores de luz hay sensores magnéticos, además de muchas funciones de seguridad y otras cosas inteligentes. Pero en ese momento pensé: ¿puedo construir mi propia versión más barata, basada en Arduino y open source que transporte cosas inteligentemente? ¡Suena a gran reto, eso me gusta!
Diseño
Primero lo diseñé... ¡en papel! Sí, en papel con lápiz. ¿Por qué diseñar en papel si tienes CAD genial? Hay ventajas que oí de otros y confirmé yo mismo. Eres totalmente libre, no hay limitaciones en el papel, no hay distracciones, solo espacio en blanco y lápiz que facilita las cosas. También es más rápido, no te preocupas por dimensiones y forma final; si no te gusta algo, lo vuelves a dibujar y al ver todos tus bocetos a la vez puedes combinarlos y surgir nuevas ideas. Lo recomiendo a todos. Aquí mis bocetos (las líneas de colores a la derecha son creatividad del hijo de mi hermano).

Mis dibujos no son muy buenos, pero si sabes dibujar harías algo mejor en 5 min. Yo era muy malo dibujando y el ejemplo me parece prometedor. Luego creé diseño CAD basado en ese boceto. Sabía desde el principio que algunas partes serían impresas en 3D, pero no quería hacerlo 100% en 3D y quise experimentar. Finalmente decidí cortar algunas piezas con láser, pero no tengo una y nunca diseñé para corte láser; aprendí y pedí online. Como material elegí contrachapado 4mm (también sirve plexi). La parte frontal del robot es impresa en 3D y alberga sensores, electrónica y batería. Renders de mi diseño que, en mi opinión, ¡quedan fantásticos!


Siguiente paso: pedir corte láser de placas de madera. Soy de Polonia, busqué empresa polaca para ahorrar envío. Si buscas algo cerca, googlea "corte láser" + tu ciudad. Recuerda preguntar si ajustan offsets para que los ensambles de dedo encajen perfecto (hay que hacerlo por el kerf, puedes leer más aquí). Por suerte encontré empresa que lo hizo por mí, ¡gracias!

Tenía miedo porque nunca diseñé para corte láser ni usé piezas cortadas láser, pero salió precioso. Archivos DXF para corte láser en adjuntos.
Para completar el chasis imprimí la parte frontal en 3D. Si no tienes impresora, considera comprar una, son baratas hoy. Puede que haya en escuela, biblioteca, o algún amigo aficionado. Archivos STL en adjuntos. No hay ajustes específicos: usé 2 perímetros, 30% relleno, 0.2mm altura de capa, necesitas soportes. Tarda unas 8 horas, paciencia.
Una vez impresa, la limpias y atornillas a las piezas de contrachapado, pero yo le di más trabajo. Lijé la impresión y la pinté, volví a lijar y pintar, usé masilla de carrocería para superficie perfecta, más lijado y pintura. Llevó mucho tiempo, pero aprendí mucho, ¡mira qué superficie brillante! Es perfecta, no se nota que fue impresa en 3D. 2 días de pintar y lijar, ¡mereció la pena!


Arduino, sensores, motores, PCB...

Todo controlado por Arduino Pro Mini conectado a PCB personalizado diseñado en Fritzing (layout y archivos de diseño en adjuntos). Para funcionar sin intervención humana hay sensores de línea y módulo RFID para detectar etiquetas junto a la línea. El puente H que controla los motoreductores baratos y populares es L293D, pequeño y fácil. Añadí zumbador para que pite al detectar cierta etiqueta RFID. Todo alimentado por batería LiPo 2 celdas (7.4V nominal). Como el módulo RFID necesita 3.3V, añadí regulador de voltaje en PCB. También hay sensor ultrasónico para detectar obstáculos: ¡seguridad ante todo! Leyendo distancia con HC-SR04 lleva bastante tiempo en términos de microcontrolador, así que diseñé otro proyecto (más info aquí) que facilita y acelera la detección. No es necesario pero ayuda mucho.
Para hacer el PCB necesitas herramientas y componentes (Arduino, L293D, headers, conector batería, zumbador, regulador 3.3V). Puedes leer más sobre cómo hacer PCB en casa y qué herramientas necesitas aquí.

Al principio quise fresar PCB en CNC pero usé método conocido: transferencia de tóner. Arriba ves tóner transferido a placa de cobre. Luego grabé PCB y limpié tóner. También hay que taladrar agujeros para componentes PTH.

Soldar fue increíblemente fácil para PCB casero, suele ser más difícil porque no hay máscara de soldadura.

Hay 5 cables puente en la parte inferior del PCB (en vista PCB de Fritzing son cables azules), no me gustan los puentes pero con circuitos complejos y PCB de una cara no hay forma de evitarlos.

Como dije, usaré batería LiPo 2 celdas, puedes usar otra de voltaje similar, no hace falta capacidad específica (mayor capacidad = más duración). También soldé zócalo al PCB para conectar batería fácilmente.

Cuando todo está soldado, toca probar conectando batería. Los LEDs de Arduino deben encender y no debe haber humo.

Si todo bien, última soldadura: cables que luego soldaremos a los motores. Mejor hacerlos un poco largos y recortar después, no quieres que queden cortos.

¡PCB lista! Si no tienes experiencia haciendo PCB, intenta una, no es tan difícil. Si prefieres cables o protoboard, adelante, pero puede ser difícil meterlo en la parte frontal. Con PCB es fácil. Aún falta conectar sensores al PCB pero primero montaremos chasis y pondremos sensores.
Montaje

Los ensambles de dedo de las piezas cortadas láser encajan perfecto, pero para que sea rígido y duradero hay que pegar. Es contrachapado, cualquier cola de madera sirve. No uses demasiada y limpia fugas. Debe secar unas horas, podemos parar. Asegúrate que todas las piezas están bien colocadas, no habrá marcha atrás tras secar.



Tras unas horas, continuamos. Hora de atornillar la parte frontal impresa en 3D al contrachapado. No usaremos pegamento, como me enseñaron en prácticas CIT: usar pegamento es poco profesional, olvídalo (pero espero que esté bien con madera). Usaremos tornillos desde la base del robot, que sean cortos (6mm) para no crear cortos en circuitos internos. Lo bueno es que no se ve desde arriba, hay que mirar por debajo, queda mejor. Recomiendo arandelas para proteger contrachapado.


Así debería verse, ¡tan limpio y perfecto!

Montamos motores y rueda trasera al chasis. Necesitas tornillos M3. También usé arandelas para proteger contrachapado.

Volvemos a sensores, dale la vuelta al robot, coge tornillos M3 y destornillador.

¡Montaje terminado! No fue nada difícil, puro placer. Vemos la forma del robot con sensores y motores en su sitio. Estamos cerca del test final pero antes hay que conectar todos los sensores al PCB.
Conexiones

Este paso lleva tiempo, no es difícil pero es complicado meter todos los cables por el espacio diminuto de la parte frontal impresa. La mejor forma: conecta cables a todos los sensores y módulos, pásalos por los agujeros de la parte frontal y al final conéctalos al PCB.
Quería poner toda la electrónica a la izquierda de la parte frontal, pero la batería resultó más grande de lo anunciado y tuve que poner batería a la izquierda y electrónica a la derecha. No fue problema, todo encajó perfecto.
Recuerda colocar el sensor ultrasónico.
Para encender/apagar fácilmente puse interruptor en el conector de batería. También hay agujero en panel trasero para meter el interruptor.


Código

Antes de cerrar la parte frontal, sube el código al Arduino Pro Mini. Saca Arduino del PCB y conéctalo al PC con conversor USB-UART. Código abajo. Todo explicado en comentarios y vídeo. También en el editor web.
Hay un programa especial que escribí en C# para generar tareas para este robot, llamado "Task Planner" (archivo .exe abajo). Permite generar tareas fácilmente, copiarlas y pegarlas en Arduino IDE antes de subir. Para generar tareas necesitas ID de tarjeta RFID, para obtenerlo puedes hacer un circuito simple más info aquí.

Casi terminado...

Ahora cerramos la parte frontal con las dos tapas y atornillamos. Puede ser difícil meter todos los componentes, intenta reorganizarlos y ponerlos en distintas posiciones para cerrar las tapas.


Para atornillar usa tornillos M3 cortos y no necesitas arandelas. ¡Última cosa! Nuestro robot está listo para el test final. Invertí tanto tiempo en construirlo, me alegro de ver si funciona como pretendía.

Así se ve con todos los componentes en su sitio, electrónica oculta en la parte frontal y sensores montados. El único inconveniente es que cargar la batería puede ser difícil porque hay que abrir la tapa trasera para sacarla. Solución simple: hacer agujero en la pieza 3D y sacar el cable de balanceo de la batería por ahí.

¡Test final!
No sabía cómo mostrar el funcionamiento correctamente. El objetivo es construir un robot barato open-source que transporte cosas inteligentemente en líneas de montaje y fábricas, así que monté una línea simple y pedí ayuda a mi padre y al hijo de mi hermano. Meta: meter objeto en robot, cogerlo en otra estación y poner el que ya tiene etiqueta, y en última estación mover el etiquetado al almacén. Tarea simple que imita línea de montaje y permite testear fácilmente.
Quería poner cinta negra en el suelo, pero no era bastante reflectante para mis sensores, así que usé cartón. Empezamos a testear, lo ves en el vídeo (al principio del proyecto).

Hubo muchas cosas que podían salir mal, pero todo salió perfecto. Funciona como intended, cada paso, desde la idea inicial hasta el diseño y montaje fue suave e increíblemente bien. Cuando dije que muchas cosas podían salir mal, lo digo en serio. Tengo experiencia con impresión 3D, programación y Arduino, pero era primera vez que dibujaba proyecto en papel (gran idea, lo haré más), nunca diseñé para corte láser, aunque tengo certificado de programador C# no soy maestro. Y logré unir todo para crear este robot tan chulo. Espero que os guste, si es así decid algo en comentarios, me interesa vuestra opinión. ¡Preguntad lo que queráis! Gracias por leer.
¡Feliz creación!
Código
Código Arduino Seguidor Industrial Arduino
/* * * C by Nikodem Bartnik * https://NikodemBartnik.pl * https://www.youtube.com/user/nikodembartnik * */ #include <SPI.h> #include <MFRC522.h> //Definiciones de pines, si cambiaste algo en el esquema también cambia valores abajo #define LINESENSOR1 6 #define LINESENSOR2 7 #define LINESENSOR3 8 #define BUZZER A0 #define MOTOR1A 2 #define MOTOR1B 3 #define MOTOR2A 4 #define MOTOR2B 5 #define RFID_SDA 10 #define RFID_SCK 13 #define RFID_MOSI 11 #define RFID_MISO 12 #define RFID_RST 9 #define DISTANCESENSOR A1 //definición valores constantes #define STOP_TIME 3000 #define BEEP_LENGTH 200 #define MOTOR_SPEED 110 #define MINIMUM_TIME_BETWEEN_CARDS 2000 MFRC522 mfrc522(10, 9); long int last_card_read; //aquí puedes pegar arrays del programa para generar planes para este robot que escribí en C#, busca ILFPlanner.exe #define COMMANDS_LENGTH 4 char* Type[4]={"Stop", "Beep&stop", "Beep&ignore", "Stop"}; int Value[4]={3000, 1000, 0, 5000}; char* CardID[4]={"12 14 B1 2F", "F6 34 F9 25", "ED B9 E0 2B", "83 87 3B 2E"}; void setup() { //setup SPI para módulo RFID SPI.begin(); mfrc522.PCD_Init(); //setup de todos los pines que necesitamos pinMode(LINESENSOR1, INPUT); pinMode(LINESENSOR2, INPUT); pinMode(LINESENSOR3, INPUT); pinMode(BUZZER, OUTPUT); pinMode(MOTOR1A, OUTPUT); pinMode(MOTOR1B, OUTPUT); pinMode(MOTOR2A, OUTPUT); pinMode(MOTOR2B, OUTPUT); pinMode(DISTANCESENSOR, INPUT); } void loop() { //esta parte realiza la función de seguimiento de línea if(digitalRead(LINESENSOR1) == LOW && digitalRead(LINESENSOR2) == HIGH && digitalRead(LINESENSOR3) == LOW){ Forward(); }else if(digitalRead(LINESENSOR1) == HIGH && digitalRead(LINESENSOR2) == LOW && digitalRead(LINESENSOR3) == LOW){ Left(); delay(20); }else if(digitalRead(LINESENSOR1) == LOW && digitalRead(LINESENSOR2) == LOW && digitalRead(LINESENSOR3) == HIGH){ Right(); delay(20); } //si última tarjeta detectada hace más de MINIMUM_TIME_BETWEEN_CARDS podemos comprobar si hay otra if(millis() - last_card_read >= MINIMUM_TIME_BETWEEN_CARDS){ //esperar tarjeta, cuando está cerca del sensor if ( ! mfrc522.PICC_IsNewCardPresent()){ return; } //leer su valor if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //procesar valor tarjeta para hacerlo legible String content= ""; for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(mfrc522.uid.uidByte[i], HEX)); } content.toUpperCase(); content = content.substring(1); //recorrer todos los CardIDs del array y comprobar si coincide con la escaneada for(int a = 0; a < COMMANDS_LENGTH; a++){ last_card_read = millis(); //si coincidimos hacemos lo asignado a esta tarjeta, ej. parar y pitar if(content == CardID[a]){ if(Type[a] == "Stop"){ Stop(); delay(Value[a]); }else if(Type[a] == "Beep&stop"){ digitalWrite(BUZZER, HIGH); Stop(); delay(Value[a]); digitalWrite(BUZZER, LOW); }else if(Type[a] == "Beep&ignore"){ Stop(); digitalWrite(BUZZER, HIGH); delay(500); digitalWrite(BUZZER, LOW); }else if(Type[a] == "Ignore"){ } } } } } //encender motor para ir adelante void Forward(){ digitalWrite(MOTOR1A, HIGH); analogWrite(MOTOR1B, 255 - MOTOR_SPEED); digitalWrite(MOTOR2A, HIGH); analogWrite(MOTOR2B, 255 - MOTOR_SPEED); } //encender motor para ir atrás void Backward(){ digitalWrite(MOTOR1A, LOW); analogWrite(MOTOR1B, MOTOR_SPEED); digitalWrite(MOTOR2A, LOW); analogWrite(MOTOR2B, MOTOR_SPEED); } //encender motor para girar izquierda void Left(){ digitalWrite(MOTOR1A, LOW); analogWrite(MOTOR1B, MOTOR_SPEED); digitalWrite(MOTOR2A, HIGH); analogWrite(MOTOR2B, 255 - MOTOR_SPEED); } //encender motor para girar derecha void Right(){ digitalWrite(MOTOR1A, HIGH); analogWrite(MOTOR1B, 255 - MOTOR_SPEED); digitalWrite(MOTOR2A, LOW); analogWrite(MOTOR2B, MOTOR_SPEED); } //parar motores void Stop(){ digitalWrite(MOTOR1A, LOW); digitalWrite(MOTOR1B, LOW); digitalWrite(MOTOR2A,LOW); digitalWrite(MOTOR2B, LOW); }
Planificador de Tareas C#
ZIP con mi programa C# para generar tareas para el robot, también encontrarás .exe abajo.
No preview (download only).
Task planner.exe C#
Puedes ejecutarlo directamente en Windows, sin instalación.
No preview (download only).
Piezas personalizadas y carcasas
Parte frontal del chasis que alberga sensores y electrónica. Impresa en PLA blanco, luego lijada y pintada varias veces para brillo. Tarda ~8 horas, requiere soportes.
Tapa para cerrar lado izquierdo de parte frontal
Tapa para cerrar lado derecho de parte frontal
Archivo DXF para corte láser en material 4mm (contrachapado, plexi) plateback_CLMFY08IX0.dxf
Archivo DXF para corte láser en material 4mm platebottom_YXrDbx6Zxr.dxf
Archivo DXF para corte láser en material 4mm plateleft_SWSXq4pbU1.dxf
Archivo DXF para corte láser en material 4mm plateright_mRA9hd7Kp8.dxf
Archivo Fusion360 por si quieres editar industrial_line_follower_design_vX9sr32Rar.f3d
Esquemáticos
Archivo Fritzing por si quieres editar schematic_QjiJP4TLOo.fzz
Esquemático con todas las conexiones

Archivo PDF para hacer PCB de este proyecto, es de una cara así que no hay capa superior
Proceso de manufactura
- Elegir el Metal Adecuado para Mecanizado CNC: Resistencia, Durabilidad y Coste
- Soluciones Premium de Fundición en Arena para Aplicaciones Industriales
- Elección del ventilador industrial adecuado: Axial vs Centrífugo para sistemas de ventilación
- Materiales óptimos para piezas torneadas de precisión CNC
- Culturas de mantenimiento industrial: Tipos, beneficios y mejores prácticas
- Revolucionando los viajes espaciales con materiales de nueva generación impresos en 3D
- Los 10 materiales de impresión 3D más resistentes para máxima durabilidad
- Componentes Invar 36: Materiales, Propiedades y Compra Fiable
- 6 Consejos Esenciales para Maximizar el Rendimiento y Longevidad de Grúas Industriales
- Materiales industriales: tipos, usos y beneficios
- Cómo elegir el compresor industrial adecuado: Consejos de expertos