“Um manipulador robótico pode ser definido como um dispositivo mecânico controlado por software, cuja finalidade é específica para diversos processos automatizados.” (LOPES, 2002).
A construção de peças cada vez mais complexas e maiores torna o uso de manipuladores robóticos ainda mais evidente. Estes realizam trabalhos que humanamente seriam demasiadamente difíceis, ou demandariam tempo demais.
Tem-se, portanto, dimensão da necessidade desse tipo de robô e suas diversas aplicações.
Este Trabalho Prático tem como objetivo a construção de um manipulador que percorra a trajetória pré-estabelecida em um tempo máximo de 3 minutos.
Kit Arduino, contendo:
Caixa de ferramentas, contendo:
Nosso primeiro desafio foi a escolha dos motores. Inicialmente, nenhum dos motores disponibilizados funcionavam. Conseguimos 2 novos motores em escovas rotativas antigas. Motores estes que estavam de acordo com as especificações, com a caixa de redução. Em seguida, iniciamos a montagem da estrutura do braço. A base do projeto já recebe o primeiro motor e seu trilho, que percorre o eixo x, conforme imagens:
Nesta primeira foto, vemos a base e o trilho, sem o motor.
Nesta segunda foto, vemos a base com o motor montado junto ao trilho.
Em sequência, a parte superior do manipulador (separada da estrutura completa na imagem) conta com o segundo motor, que percorre o eixo y:
Com a estrutura montada e código funcionando, fizemos o primeiro teste:
Contudo, o robô precisa necessariamente conseguir segurar a caneta e desenhar por conta própria. Criamos então um suporte para que o robô pudesse segurar a caneta e desenhar o círculo com perfeição:
Fizemos novos testes com o suporte, com resultados satisfatórios. Equilibramos o peso com peças do LEGO:
Com o software e hardware funcionando, nosso próximo passo foi o aperfeiçoamento do nosso robô. A primeira melhoria observada foi a aproximação do motor de cima ao trilho. Nas fotos acima é possível perceber a distância que se encontrava, e que gerava certa estabilização. Contudo, perdíamos precisão. Adequando o esquema, percebemos que a proximidade traria isto, e a mudança de algumas peças, trariam essa exatidão necessária, e os testes foram satisfatórios.
Seguindo os testes, percebemos que o círculo desenhado pelo braço manipulador não fechava por completo. Incialmente, percebemos que o problema também estava na montagem: a cola quente usada não aderia bem ao motor. Resolvemos esse problema com abraçadeiras e cola quente nas peças que se uniriam ao motor, de forma indireta. Além disso, adequemos a programação para que a parametrização demandasse um pouco mais de tempo. E novos testes foram satisfatórios.
Com o intuito de melhorar a visualização dos desenhos, optamos por trocar a caneta BIC por uma caneta marca-texto. Os vídeos a seguir mostram o funcionamento dos 3 desafios requeridos: a palavra UFMG, um desenho a nossa escolha, que decidimos ser uma estrela de 5 pontas, e um círculo.
A programação consistia no desenvolvimento do código de controle dos motores DC para realizar o trajeto proposto. Como na proposta o manipulador não possui nenhum tipo de input sensorial, o controle dos motores foi feito através da velocidade e direção com o passar do tempo. Foi baseada, portanto, em parametrização por meio de tempo.
//Vetores velocidade para o cículo em função do tempo: double x_circle(double inicio, double t){ return -sin(t/1000+inicio)*1000; } double y_circle(double inicio, double t){ return cos(t/1000+inicio)*1000; }
Obs.: é possível substituir as funções acima para desenhar outras figuras paramétricas.
//Função que desenha o círculo de forma simplificada: void draw_CIRCLE(){ tempo = 0; while (tempo < 2*pi*1000) { spx = x_circle(0,tempo); spy = y_circle(0,tempo); motor_x->setSpeed(spx); motor_y->setSpeed(spy); delay(10); tempo += 10; } motor_x->run(RELEASE); motor_y->run(RELEASE); }
/*Desenhando a letra U: Começa no O, para no X. | | | | | | | | O------|--X */ void draw_U(){ draw_line(0,2); draw_line(0,-2); draw_line(1,0); draw_line(0,2); draw_line(0,-2); draw_line(0.5,0); }
/*Desenhando a estrela:
void draw_STAR(){
draw_line(1.5,3);
draw_line(1.5,-3);
draw_line(-3,2);
draw_line(3,0);
draw_line(-3,-2);
}
A função draw_line é semelhante à draw_CIRCLE. Porém, não utiliza senos e cossenos, apenas combinações lineares dos vetores (1,0) e (0,1). Nesse caso, o tempo depende do comprimento do vetor.
Os principais problemas que enfrentamos foi em relação à montagem do robô. Demandou tempo e vários testes até que encontrássemos as soluções ideais e minimalistas para o perfeito funcionamento desse.
Ao final dos testes e adequações da programação, os resultados foram satisfatórios. O robô é compacto e leve, capaz de desenhar com perfeição a palavra UFMG, um círculo perfeito e uma estrela de 5 pontas, no tempo e espaço estipulados.
Tivemos muita satisfação em terminar com louvor este primeiro TP. Abaixo, foto do dia da apresentação do robô manipulador com o grupo.