Robô Seguidor de Linha Industrial para Transporte de Materiais
Componentes e Materiais
| SparkFun Arduino Pro Mini 328 - 5V/16MHz | × | 1 |
| PCB Personalizado | × | 1 |
| Sensor Ultrassônico HC-SR04 (Genérico) | × | 1 |
| Módulo RFID (Genérico) | × | 1 |
| Sensor Seguidor de Linha SparkFun RedBot | × | 3 |
| Driver Motor H-Bridge Texas Instruments 1A | × | 1 |
| Bateria Li-Ion 1000mAh 7.4V | × | 1 |
| Motorredutor Hobby - 140 RPM (Par) | × | 1 |
| Roda 65mm | × | 1 |
| Fios Jumper (genéricos) | × | 1 |
| Chave Seletora (Toggle Switch) | × | 1 |
| Tag RFID (Genérica) | × | 4 |
| Buzzer | × | 1 |
| Header Macho 40 Posições 1 Fileira (0.1") | × | 1 |
Ferramentas e Máquinas Necessárias
| Impressora 3D (genérica) |
| Cortadora a Laser (genérica) - Não tenho cortadora a laser, então encomendei o corte online que ficou ótimo, então sem preocupações, você não precisa dessas ferramentas caras para fazer este projeto |
| Ferro de Solda (genérico) |
Aplicativos e Serviços Online
| Arduino IDE |
| Autodesk Fusion 360 |
Sobre o Projeto
Já se perguntou como aqueles robôs sofisticados que transportam peças em linhas de montagem funcionam? Vi tais robôs na fábrica da Opel aqui na Polônia, fiz muitas perguntas e me explicaram como funciona, entendi instantaneamente que isso é apenas um seguidor de linha muito avançado. Em vez de fita preta há uma fita magnética e em vez de sensores de luz há sensores magnéticos, há também muitos recursos de segurança e outras coisas inteligentes. Mas neste ponto comecei a pensar que talvez eu pudesse construir minha própria versão menor, mais barata, baseada em Arduino e open source de tal robô que pudesse transportar coisas inteligentemente? Parece um grande desafio, isso é o que eu gosto!
Design
Primeiro, projetei... no papel! Sim, no papel com lápis na mão :) Por que projetar no papel se você tem software CAD incrível? Existem algumas vantagens que ouvi de outras pessoas e depois confirmei por mim mesmo. Você é realmente livre, não há limitações no papel, sem distrações, apenas espaço em branco e um lápis que torna as coisas realmente fáceis. Também é mais rápido, você não precisa se preocupar com dimensões e forma final se não gosta de algo que desenhou pode simplesmente desenhar de novo e quando vê todos seus desenhos de uma vez pode combiná-los e ter novas ideias :) Foi muito fácil desenhar no papel para encontrar uma forma geral que eu gostasse e depois pular para o CAD para adicionar dimensões ao meu desenho. Realmente recomendo esta técnica a todos! Aqui estão meus desenhos (aquelas linhas coloridas no lado direito são a criatividade do filho do meu irmão)

Claro, meus desenhos não são muito bons, e se você souber desenhar faria algo melhor em 5 minutos mas eu era muito ruim em desenhar e o exemplo acima parece promissor para mim. Então criei um design CAD baseado naquele desenho. Sabia desde o início que algumas partes deste robô seriam impressas em 3D, mas não queria fazer 100% impresso em 3D e queria experimentar coisas novas (como sempre). Finalmente, decidi cortar algumas partes na cortadora a laser, mas não tenho uma e nunca projetei algo para corte a laser, aprendi como fazer e encomendei online. Como material, escolhi compensado de 4mm (você também pode usar acrílico ou similar). A parte frontal do robô é impressa em 3D e segura todos os sensores, eletrônica e bateria. Aqui estão renders do meu design que na minha opinião ficaram fantásticos!


Próximo passo foi encomendar o corte a laser das placas de madeira, sou da Polônia então encontrei uma empresa polonesa que faz isso para economizar no frete. Se quiser encontrar algo perto de você, apenas pesquise "corte a laser" e o nome da sua cidade, deve encontrar facilmente algo por perto. Lembre-se de perguntar à empresa se eles podem ajustar os offsets para essas peças para que as juntas de dedo encaixem perfeitamente (temos que fazer isso por causa de uma coisa chamada kerf, pode ler mais sobre isso aqui). Felizmente encontrei uma empresa que cuidou disso para mim, obrigado!

Fiquei com medo porque nunca projetei para corte a laser e nunca usei peças cortadas a laser antes mas ficou lindo :) Arquivos DXF para corte a laser podem ser encontrados abaixo na seção de anexos.
Para completar o chassi tive que imprimir uma parte frontal na impressora 3D, essa é a ferramenta que tenho então não foi problema, se você não tem impressora 3D ainda, considere comprar uma, estão bem baratas hoje em dia. Pode achar uma na escola ou biblioteca, ou talvez um amigo seja entusiasta de impressão 3D. Arquivos STL na seção de anexos abaixo. Não há configurações específicas para impressão 3D, usei 2 perímetros com 30% de preenchimento e altura de camada 0.2mm, você tem que usar suportes para imprimir esta parte. Vai levar cerca de 8 horas então tenha paciência.
Uma vez sua impressão terminada você pode limpar e parafusar nas partes de compensado mas decidi colocar mais trabalho nisso. Novamente algo que nunca fiz antes, lixei minha impressão e pintei, lixei de novo e pintei, então usei massa de funilaria para deixar a superfície perfeita, então mais lixamento e pintura. Levou muito tempo, mas também aprendi muito, e veja só esta superfície brilhante! É perfeita, não dá para dizer que foi impressa em 3D! 2 dias de pintura e lixamento, definitivamente valeu a pena.

E aqui estão as peças cortadas a laser e a parte impressa em 3D preparadas para montagem.

Arduino, Sensores, Motores, PCB...

Mas este projeto não é apenas sobre design. Tudo é controlado por Arduino Pro Mini conectado ao PCB personalizado que projetei no Fritzing (layout e arquivos de design do PCB nos anexos). Para funcionar sozinho sem input humano há também sensores de linha e módulo RFID para detectar tags colocadas junto à linha. H-bridge que controla motores redutores baratos e populares é L293D, pequeno e fácil de usar. Também decidi adicionar um buzzer ao circuito para que o robô possa bipar quando certa tag RFID é detectada. Tudo alimentado por bateria LiPo 2 células (7.4V tensão nominal). Como o módulo RFID tem que ser alimentado com 3.3V tive que adicionar um regulador de tensão no PCB para fornecer tensão adequada ao módulo. Há também um sensor ultrassônico para detectar obstáculos, como dizem, segurança primeiro! Havia um problema, ler distância com HC-SR04 leva bastante tempo em termos de microcontroladores então projetei outro projeto (mais info aqui) que torna fácil e rápido detectar obstáculos com este sensor. Não é necessário mas definitivamente facilita muito.
Para construir o PCB você precisa de algumas ferramentas e componentes (Arduino, L293D, alguns headers destacáveis, conector de bateria, buzzer, regulador 3.3V). Pode ler mais sobre como fazer PCB em casa e que ferramentas precisa aqui.

No início queria fresar meu PCB em máquina CNC mas decidi usar um método que conhecia chamado transferência de tônner. Acima você vê o tônner transferido para a placa de cobre. Então gravei meu PCB e limpei o tônner. Também tem que furar buracos para colocar componentes PTH (Through Hole Components).

Soldagem foi incrivelmente fácil para PCB DIY, geralmente é muito mais difícil soldar porque não tem máscara de solda.

Há 5 fios jumper na parte inferior do PCB (na visualização PCB do Fritzing estes são rotulados como cabos azuis), realmente não gosto de usar jumpers mas com circuitos mais complexos e PCB de camada única, não há como evitá-los.

Como disse, para alimentar este robô usarei bateria LiPo 2 células, pode usar qualquer outra bateria com tensão similar, não precisa usar capacidade específica da bateria (quanto maior a capacidade, mais tempo seu robô funcionará com uma carga). Também soldei um soquete no PCB para poder conectar a bateria facilmente.

Quando tudo está soldado é hora de testar se funciona conectando uma bateria. LEDs do Arduino devem acender e não deve haver fumaça :)

Se tudo funciona bem podemos fazer o último trabalho de solda no PCB, precisamos soldar cabos que depois soldaremos nos motores. Melhor fazer um pouco mais longos do que precisa e cortar depois, não quer que sejam curtos demais.

PCB pronto! Se não tem experiência com PCB, tente fazer um, não é tão difícil. Se preferir conectar com cabos ou protoboard, fique à vontade mas pode ser difícil encaixar na parte frontal do robô. Com PCB você consegue facilmente! Ainda precisamos conectar todos os sensores ao PCB mas primeiro vamos montar o chassi e prender todos os sensores a ele.
Montagem

Juntas de dedo das peças cortadas a laser encaixam perfeitas mas para tornar realmente rígido e durável temos que usar cola. É compensado então qualquer cola de madeira serve. Certifique-se de não usar cola demais e limpe em caso de vazamentos. Deve secar por algumas horas então podemos dar uma pausa. Certifique-se que todas as peças estão colocadas corretamente, não haverá como mudar depois que a cola secar.



Após algumas horas, podemos continuar montando nosso robô. Hora de prender a parte frontal impressa em 3D ao compensado. Não usaremos cola para isso, como me ensinaram no estágio CIT: usar cola é não-profissional, esqueça (mas espero que seja ok com madeira). Usaremos parafusos, colocados pela parte inferior do robô, certifique-se que são curtos (digamos 6mm) para não criar curtos nos circuitos dentro da parte impressa em 3D. A boa coisa desta forma de prender a parte frontal ao compensado é que não se vê de cima, tem que olhar por baixo do robô, fica muito melhor :) Recomendo usar arruelas para proteger o compensado de deformação.


Assim deve ficar até agora, tão limpo e perfeito!

Agora montaremos motores e roda traseira no chassi. Você precisará de alguns parafusos M3. Também usei algumas arruelas aqui para proteger o compensado.

Hora de voltar aos sensores, vire seu robô, pegue alguns parafusos M3 e chave de fenda.

Montagem finalizada! Não foi difícil, puro prazer. Podemos ver a forma do robô agora com todos os sensores e motores no lugar. Estamos muito perto de finalizar mas antes do teste final temos que conectar todos os sensores ao PCB.
Conexões

Este passo pode levar tempo, não é difícil mas é complicado passar todos os cabos pelo espaço minúsculo da parte frontal impressa em 3D. Descobri que a melhor forma é conectar cabos a todos os sensores e módulos, passá-los pelos furos na parte frontal e no final conectar ao PCB.
Queria colocar toda a eletrônica deste projeto no lado esquerdo da parte frontal impressa em 3D, infelizmente a bateria ficou um pouco maior que o anunciado e tive que colocar bateria no lado esquerdo e eletrônica no lado direito. Mas não foi grande problema, tudo coube perfeitamente.
Lembre-se também de colocar o sensor ultrassônico no lugar.
Para ligar/desligar o robô facilmente adicionei uma chave no conector da bateria. Há também um furo no painel traseiro para colocar a chave dentro.


Código


Antes de fechar a parte traseira da parte frontal temos que fazer upload do código para o Arduino Pro Mini. Precisamos tirar o Arduino do PCB e conectá-lo ao computador com conversor USB-UART. Código para Arduino abaixo. Tudo sobre o código é explicado nos comentários e no vídeo. Código também pode ser encontrado no Web Editor.
Há também um programa especial que escrevi em C# para gerar tarefas para este robô, chamado planejador de tarefas (você encontra o .exe abaixo). Permite gerar facilmente tarefas para o robô, copiar e colar no Arduino IDE antes de fazer upload para o Arduino. Para gerar tarefas para o robô você precisa saber o ID do cartão RFID, para obtê-lo pode construir um circuito simples, mais info aqui.
Quase Finalizado...

Agora podemos fechar a parte traseira da parte frontal com duas abas e parafusá-las. Pode ser complicado encaixar todos os componentes dentro, tente rearranjar e colocá-los em posições diferentes para fechar as abas.


Para parafusar use alguns parafusos M3 curtos e não precisa de arruelas ali. Essa é a última coisa que tínhamos que fazer. Nosso robô está finalmente pronto para o teste final! Gastei tanto tempo construindo, estou muito feliz que agora posso ver se vai funcionar como pretendia :)

Veja como fica com todos os componentes no lugar, eletrônica escondida na parte frontal e sensores montados no robô. O único lado negativo é que carregar a bateria pode ser difícil porque tem que abrir a aba traseira para tirá-la. Solução simples seria fazer um furo na peça 3D e passar o cabo balanceador da bateria por este furo.

Teste Final!
Não tinha certeza de como mostrar como este robô funciona ou como fazer isso direito. O principal propósito deste projeto é construir um robô barato open-source que possa transportar coisas inteligentemente em linhas de montagem e fábricas então montei uma linha de montagem simples e pedi ajuda pro meu pai e filho do meu irmão. Nosso objetivo era colocar um item no robô, pegá-lo do robô em uma estação diferente e colocar o que já tem adesivo e na última estação mover o com adesivo para o armazém. Tarefa simples que imita a linha de montagem e permite testar facilmente como funciona.
Queria colocar fita preta no chão, mas não era reflexiva o suficiente para meus sensores então usei papelão. E começamos a testar, pode ver no vídeo (pode encontrar no início deste projeto).

Havia muitas coisas que poderiam dar errado neste projeto, mas tudo saiu perfeito. Funciona como pretendia, cada passo, da ideia inicial ao design e montagem correu suave e incrivelmente bem. Quando disse que havia muitas coisas que poderiam dar errado, quis dizer mesmo. Tenho muita experiência com impressão 3D, programação e Arduino mas foi a primeira vez que desenhei meu projeto no papel, que foi ótima ideia e farei mais vezes, nunca projetei nada para corte a laser antes, mesmo tendo certificado de programador C# não sou mestre nisso. E consegui conectar tudo isso para criar um robô tão legal :) Espero que tenham gostado do meu projeto, se sim não esqueçam de dizer algumas palavras nos comentários, estou muito curioso sobre o que acham. Se tiverem dúvidas, fiquem à vontade para perguntar! Obrigado por ler.
Feliz making!
Código
Código Arduino Seguidor de Linha Industrial Arduino
Este é um sketch Arduino para o projeto Seguidor de Linha Industrial
/*
* C by Nikodem Bartnik
* https://NikodemBartnik.pl
* https://www.youtube.com/user/nikodembartnik
*/
#include <SPI.h>
#include <MFRC522.h>
//Definições de pinos, se mudou algo no esquemático também tem que mudar valores abaixo
#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
//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;
//aqui pode colar arrays do programa para gerar planos para este robô que escrevi em C#, ache 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 os pinos que precisamos
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 do programa realiza a função de seguidor de linha
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);
}
//se último cartão detectado há mais de MINIMUM_TIME_BETWEEN_CARDS podemos verificar se há outro
if(millis() - last_card_read >= MINIMUM_TIME_BETWEEN_CARDS){
//aqui temos que esperar cartão, quando está perto do sensor
if ( ! mfrc522.PICC_IsNewCardPresent()){
return;
}
//podemos ler seu valor
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
//processando valor do cartão para torná-lo legível
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);
//percorre todos CardIDs no array e verifica se corresponde ao escaneado
for(int a = 0; a < COMMANDS_LENGTH; a++){
last_card_read = millis();
//se temos correspondência podemos fazer o que está atribuído a este cartão, ex: parar e bipar
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"){
}
}
}
}
}
//liga motor para ir para frente
void Forward(){
digitalWrite(MOTOR1A, HIGH);
analogWrite(MOTOR1B, 255 - MOTOR_SPEED);
digitalWrite(MOTOR2A, HIGH);
analogWrite(MOTOR2B, 255 - MOTOR_SPEED);
}
//liga motor para ir para trás
void Backward(){
digitalWrite(MOTOR1A, LOW);
analogWrite(MOTOR1B, MOTOR_SPEED);
digitalWrite(MOTOR2A, LOW);
analogWrite(MOTOR2B, MOTOR_SPEED);
}
//liga motor para virar à esquerda
void Left(){
digitalWrite(MOTOR1A, LOW);
analogWrite(MOTOR1B, MOTOR_SPEED);
digitalWrite(MOTOR2A, HIGH);
analogWrite(MOTOR2B, 255 - MOTOR_SPEED);
}
//liga motor para virar à direita
void Right(){
digitalWrite(MOTOR1A, HIGH);
analogWrite(MOTOR1B, 255 - MOTOR_SPEED);
digitalWrite(MOTOR2A, LOW);
analogWrite(MOTOR2B, MOTOR_SPEED);
}
//para motores
void Stop(){
digitalWrite(MOTOR1A, LOW);
digitalWrite(MOTOR1B, LOW);
digitalWrite(MOTOR2A,LOW);
digitalWrite(MOTOR2B, LOW);
}
Planejador de Tarefas C#
ZIP com meu programa C# para gerar tarefas para o robô, também encontra .exe abaixo.
No preview (download only).
Task planner.exe C#
Pode simplesmente rodar no Windows, sem instalação.
No preview (download only).
Peças Personalizadas e Gabinetes
Parte frontal do chassi que segura todos os sensores e eletrônica. Impresso com PLA branco depois lixado e pintado algumas vezes para ficar brilhante. Leva cerca de 8 horas para imprimir, deve usar suportes.
Você precisa disto para fechar lado esquerdo da parte frontal
Você precisa disto para fechar lado esquerdo da parte frontal
Arquivo DXF para corte a laser em material 4mm (compensado, acrílico) plateback_CLMFY08IX0.dxf
Arquivo DXF para corte a laser em material 4mm (compensado, acrílico) platebottom_YXrDbx6Zxr.dxf
Arquivo DXF para corte a laser em material 4mm (compensado, acrílico) plateleft_SWSXq4pbU1.dxf
Arquivo DXF para corte a laser em material 4mm (compensado, acrílico) plateright_mRA9hd7Kp8.dxf
Arquivo Fusion360 caso queira editar industrial_line_follower_design_vX9sr32Rar.f3d
Esquemáticos
Arquivo Fritzing caso queira editar schematic_QjiJP4TLOo.fzz
Esquemático com todas as conexões para este projeto

Arquivo PDF para fazer PCB para este projeto, é de um lado só então não há camada superior
Processo de manufatura
- Revolucionando as Viagens Espaciais com Materiais de Próxima Geração Impressos em 3D
- 6 Dicas Essenciais para Maximizar Desempenho e Longevidade de Guindastes Industriais
- Entendendo Materiais Industriais: Tipos, Usos e Benefícios
- Como Escolher o Compressor Industrial Certo: Dicas de Especialistas
- 10 Materiais Mais Resistentes para Impressão 3D: Durabilidade Extrema
- Componentes Invar 36: Materiais, Propriedades e Compra Confiável
- Escolhendo o Metal Certo para Usinagem CNC: Resistência, Durabilidade e Custo
- Soluções Premium de Fundição em Areia para Aplicações Industriais
- Escolhendo o Ventilador Industrial Certo: Axial vs Centrífugo para Sistemas de Ventilação
- Materiais Ideais para Peças Torneadas CNC de Precisão