Como fazer um braço robótico barato

REQUISITOS:

1. Servomotores CC (2)

2. Compact Disc (para base do braço)

3. Cabo de vassoura (para o braço)

4. Lápis/Caneta

5. AtMega 16 IC

DESCRIÇÃO:

Recentemente participei de um MOOC sobre Introdução à Robótica pela Queensland University of Technology, Austrália. Para quem não sabe o que é MOOC, significa Magressivo Ócaneta Óon-line Cnosso. Professor Peter Corke foi o mentor ao me apresentar ao mundo da robótica. Além da parte de aprendizagem deste curso, houve um projeto opcional sobre a construção do próprio braço robótico que poderia rastrear um determinado caminho fornecido por eles. Aqui está uma olhada na planilha que precisava ser trabalhada:

Imagem típica de planilha robótica

Fig. 1: Imagem típica de planilha robótica

A tarefa era simples; o braço robótico deve ser capaz de segurar uma caneta/lápis e rastrear o caminho pontilhado das coordenadas (X1,Y1) a (X5,Y5). A base do robô deveria caber dentro da caixa cinza (20mm X 20mm) enquanto o braço deveria ter apenas duas articulações para sua movimentação.

Para resolver esta tarefa, decidi optar pelos servomotores, pois possuem movimentos de alta precisão quando comparados aos motores de passo e motores CC normais. Na minha opinião, este projeto envolveu duas grandes partes a serem trabalhadas: Estrutura mecânica e Codificação do microcontrolador. As fotos abaixo mostram o braço robótico que eu criei:

Imagem mostrando a configuração do motor para braço robótico simples

Fig. 2: Imagem mostrando a configuração do motor para braço robótico simples

Imagem mostrando o teste de braço robótico simples para desenho na planilha robótica

Figura 3: Imagem mostrando o teste de braço robótico simples para desenho na planilha robótica

Imagem mostrando o braço robótico posicionando a ferramenta Lápis em uma coordenada fixa na área de trabalho

Figura 4: Imagem mostrando o braço robótico posicionando a ferramenta Lápis em uma coordenada fixa na área de trabalho

Imagem mostrando o braço robótico movendo a ferramenta Lápis sobre a planilha robótica

Figura 5: Imagem mostrando o braço robótico movendo a ferramenta Lápis sobre a planilha robótica

Imagem mostrando o movimento do braço robótico para uma coordenada fixa na planilha robótica

Figura 6: Imagem mostrando o movimento do braço robótico para uma coordenada fixa na planilha robótica

Imagem de planilha robótica com braço robótico colocado sobre ela

Figura 7: Imagem de planilha robótica com braço robótico colocado sobre ela

Imagem mostrando o movimento da ferramenta Lápis pelo braço robótico para uma coordenada fixa na planilha

Figura 8: Imagem mostrando o movimento da ferramenta Lápis pelo braço robótico para uma coordenada fixa na planilha

Como você pode ver, meu braço robótico construído contém dois servo motores, um para a base (preto) e outro para mover o braço (azul) conectado ao lápis. Agora vem a parte de codificação que você pode conferir na seção de código. Para informá-lo sobre o mesmo, deixe-me dizer que usei temporizadores para operar esses servo motores. Um 16 bits parecia ser uma boa escolha. No AtMega 16 MCU, o timer1 é de 16 bits e possui dois pinos PWM de saída independentes (OC1APD5 e OC1BPD4).

Sabemos que os servos precisam de um ciclo de 20ms com pulso alto de 1ms a 2 ms para seu funcionamento, então escolhi a frequência do clock como 1 MHz o que resulta em 1us para cada ciclo de clock. Portanto, exigimos um total de 20.000 incriminações para perfazer 20 ms. Isso pode ser conseguido inicializando o registro ICR1 com valor 20.000, isso permitirá que o valor TOP seja 20.000, exatamente o que queremos. Agora o que resta é apenas atualizar os valores OCR1A e OCR1B para pulso alto de 1ms -2ms.

Simplesmente dizendo a vocês, comecei a trabalhar pesquisando os valores OCR1A e OCR1B para 5 pontos de coordenadas e foi tudo acertado e testado. Assim que os consegui, segui em frente para uma transição suave entre duas coordenadas consecutivas. Você poderá ver isso na minha seção de codificação, com certeza.

Código-fonte do projeto

###

#include

#include

void main

{      int i=0,j=0,small_time=50,big_time=1000;

TCNT1=0;

        TCCR1A =(1<

        TCCR1B =(1<

        DDRD =(1<<5) (1<<4); //initialising OC1A and OC1B pins as output

        ICR1=19999;

        OCR1A=1050;

        OCR1B=695;

_delay_ms(big_time);////////////(X1,Y1)////////////////////////

        for(i=1050,j=695;i>450&&j<1425;i-=5,j+=6)

        {              OCR1A=i;

                        OCR1B=j;

                        _delay_ms(small_time);

        }

        OCR1A=450;

        OCR1B=1425;

_delay_ms(big_time);////////////(X2,Y2)////////////////////////

        for(i=450,j=1425;i<1000&&j>700;i+=10,j-=7)

        {              OCR1A=i;

                        OCR1B=j;

                        _delay_ms(small_time);

        }

        OCR1B=1050;

        for(i=1000;i<1600;i+=10)

        {              OCR1A=i;

                        _delay_ms(small_time);

        }

        for(j=1050;j<1200;j+=10)

        {              OCR1B=j;

                        _delay_ms(small_time);

        }

        for(i=1600,j=1200;i>1350&&j<1475;i-=10,j+=10)

        {              OCR1A=i;

                        OCR1B=j;

                        _delay_ms(small_time);

        }

        OCR1A=1350;

        OCR1B=1475;

_delay_ms(big_time);////////////(X3,Y3)////////////////////////

        for(i=1350,j=1475;i<2300&&j>500;i+=10,j-=7)

        {              OCR1A=i;

                        OCR1B=j;

                        _delay_ms(small_time);

        }

        OCR1A=2400;

        OCR1B=800;

        for(i=2400;i<2650;i+=10)

        {              OCR1A=i;

                        _delay_ms(small_time);

        }

        for(j=800;j<1300;j+=10)

        {              OCR1B=j;

                        _delay_ms(small_time);

        }

        for(i=2600,j=1300;i>1825&&j<2225;i-=10,j+=12)

        {              OCR1A=i;

                        OCR1B=j;

                        _delay_ms(small_time);

        }

        OCR1A=1825;

        OCR1B=2225;

_delay_ms(big_time);////////////(X4,Y4)////////////////////////

        for(i=1825,j=2225;i<2500&&j>1000;i+=7,j-=10)

        {              OCR1A=i;

                        OCR1B=j;

                        _delay_ms(small_time);

        }

        OCR1A=2550;

        for(j=1200;j>1100;j-=10)

        {              OCR1B=j;

                        _delay_ms(small_time);

        }

        for(i=2550;i>2100;i-=10)

        {              OCR1A=i;

                        _delay_ms(small_time);

        }

        for(i=2100,j=1100;i>895&&j<2125;i-=12,j+=10)

        {              OCR1A=i;

                        OCR1B=j;

                        _delay_ms(small_time);

        }

        OCR1A=895;

        OCR1B=2125;

_delay_ms(big_time);////////////(X5,Y5)////////////////////////

}   

###

 

Diagramas de circuito

Diagrama de circuito-AVR-ATMega16-Based-Control-Circuitry-Simple-Robotic-Arm

Vídeo do projeto

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.