Braço Robótico




LABSIS

2017 / 2018


Autores:


José Silva (Nº 1110523)

1110523@isep.ipp.pt


Daniel Vaz (Nº 1140860)

1140860@isep.ipp.pt


Introdução

Arquitetura

Hardware

Software

Resultados

Conclusões

Referências




Fig. 1 - Braço Robótico

  • Introdução

Início

No âmbito da Unidade Curricular de LABSI desenvolvemos um projeto o qual denominamos Braço Robótico.

Trata-se de um dispositivo que tem a capacidade de actuar automaticamente realizando as funções que lhe forem confinadas.
Segundo a ISO - Organização Internacional de Normalização, define-se como um "manipulador multipropósito controlado automaticamente, reprogramável em três ou mais eixos"[1].

No caso do nosso projeto, quando se coloca o braço robótico em funcionamente, este procura a posição inicial para depois começar todo o processo.
Depois de encontrada a posição inicial, o braço robótico inicia um "scan" numa resolução de 180 graus tentando identificar um obstáculo que se encontre até 500 mm de distância. Esta busca de algum obstáculo é conseguida através de um sensor Sonar com a referência HCSR-04 [2].
Quando algum obstáculo é detetado, o braço robótico faz aproximar a garra (acoplada ao extremo deste) até ao obstáculo, agarrando-o de seguida.
Já com o obstáculo preso na garra, é determinada a cor deste através de um sensor de cores com a referência TCS-230 [3] que se encontra instalado na garra.
Por fim, o braço robótico desloca o obstáculo para uma posição específica para cada uma das quatro cores possíveis predefinidas - vermelho, verde, azul e amarelo. Caso o obstáculo não apresente nenhuma destas quatro cores, este será ignorado e é transportado para a posição inicial da máquina.

O movimento dos quatro eixos do braço robótico é conseguido através de motores de passo a passo Nema 23 de 2.8 Amperes. Para ser possível controlar este tipo de motores, foram usados drivers com a referência DRV8825 [4] e A4988 [5] que necessitam apenas de dois sinais de comando - um para definir o sentido de rotação e outro para marcar o passo a efetuar.

O controlo de todo este sistema foi conseguido através do microcontrolador ATmega2560 [6] que se encontra instalado numa plataforma Arduino Mega.

Este tipo de sistema automático pode ser encontrado na Indústria executando funções de pintura, fundição, soldagem, montagem, movimentação de cargas, inspeção de produtos, tudo realizado com uma precisão, velocidade e robustez relativamente elevadas.

Outra grande aplicação deste tipo de robot é na área da medicina, aplicado principalmente em cirurgias médicas onde é necessário um grande cuidado e precisão como operações de risco ao coração e intervenções mais delicadas ao nível da visão [7].








  • Arquitetura

Início

Fig. 2 - Diagrama de Blocos

No diagrama de blocos acima é possível observar a arquitetura do nosso projeto.

Começando pelos drivers de potência que controlam os motores de passo, estes necessitam de duas alimentações, uma de 5V para comando e outra de 12V - 48V para potência.
O controlo de cada um destes drivers é feito através de dois pinos. Um pino (DIR) define o sentido de rotação do motor, que dependendo do modo como se ligam as bobines, faz rodar o motor num sentido quando o nível lógico do pino é baixo e faz rodar o motor no sentido inverso quando o pino apresenta o valor lógico alto.
Outro pino (STEP) recebe um impulso para fazer o motor rodar um passo. Este impulso tem a duração mínima de 2 micro-segundos.
Estes drivers apresentam ainda a possibilidade de escolher o tipo de passo pretendido pois permite dividir os passos até 1/32 passos por impulso.

Outro motor utilizado é um motor servo que é responsável pela abertura e fecho da garra. Este motor é alimentado a 5V e é controlado por um sinal PWM que controla a abertura da garra conforme o valor da largura de impulso.

Outro periférico utilizado é o sensor HCSR-04 que é um sonar. Este sensor necessita de um sinal de Trigger para iniciar a medição de distância.
Quando o sensor recebe um impulso no pino de Trigger (com a duração mínima de 10 micro-segundos) o emissor faz o envio de 8 impulsos ultra-sónicos que viajam no meio em volta (neste caso o ar) e quando chocam com um obstáculo são refletidos e detetados pelo receptor.
Conforme a distância a que se encontra o obstáculo, este sensor gera um sinal PWM que apresenta sempre a mesma frequência mas que varia a largura de impulso linearmente com a distância ao obstáculo.
Este sinal PWM é então detetado pelo ATmega2560 através de uma interrupção externa. Aqui, quando o flanco ascendente é detetado, o funcionamento do microcontrolador entra na rotina da interrupção externa e coloca o TIMER 1 em funcionamento. Quando for detetado o flanco descendente imediatamente a seguir, o programa entra novamente na rotina de interrupção e desliga o TIMER 1 guardando o último valor apresentado pelo TCNT1.
De acordo com testes efetuados, verificamos que o valor do TIMER 1 nunca atinge o seu valor máximo para distâncias até 500 mm e por isso não ocorre overflow, permitindo assim uma leitura fácil sem a ocorrência de erro devido ao overflow. Sabe-se que se ocorrer um overflow, é sinal de que a medição foi mal efetuada.
Os testes que efetuamos levaram-nos também a descobrir que basta dividir o valor guardado no TCNT1 por 100 para determinar a distância em milimetros, portanto, de modo linear com o valor do TIMER 1.

Outro sensor utilizado é o TCS-230 que é responsável por reconhecer cores do espetro visível.
Este sensor apresenta três foto-díodos que são sensíveis à luz e geram sinais que diferem em frequência conforme a cor que estão a detetar.
O sensor não necessita de nenhum sinal para iniciar o reconhecimento de cor, apenas precisa estar habilitado colocando para isso no nível baixo o pino OUTPUT-ENABLE.
Para identificar a cor o que se faz é obter a leitura de cada fotodíodo através do sinal gerado no pino OUT.
Para medir esta frequência foi utilizada uma interrupção externa do mesmo modo que foi utilizada no sensor sonar, isto porque o sinal gerado apresenta um PWM de 50% e por isso é igual medir a frequência ou medir a largura de impulso que é diretamente proporcional à frequência.
Depois de obtidas as componentes de cada fotodíodo construimos uma tabela para a gama de valores apresentadas para cada cor (das quatro utilizadas - vermelho, verde, azul e amarelo) como se tratasse do código universal RGB.

Por fim, utilizamos switchs limitadores de fim de curso para permitir colocar o braço robótico na sua posição inicial.
Estes switchs quando acionados (pelo próprio braço) fecham um circuito elétrico que faz introduzir 5 V em pinos de interrupções externas de modo a permitir ativar flags que indicam que o braço atingiu uma determinada posição inicial.








  • Hardware

Início

O atuador mais importante deste projeto é o motor de passo. Trata-se de um motor Nema 23 bifásico de 2.8 A. Neste projeto foram utilizados 4 motores deste tipo e um outro motor de passo Nema 17 de 1 A.

Fig. 3 - Motor de passo Nema 23

Outro motor utilizado foi o motor servo MG995 responsável pela abertura e fecho da garra.

Fig. 4 - Motor Servo MG995

Para fazer o controlo e acionamento dos motores de passo foram utilizados drivers de potência. O DRV8825 é um driver que permite na sua saída correntes até 2.5 A e por isso são utilizados no controlo dos motores Nema 23.

Fig. 5 - Driver DRV8825

O driver A4988 permite na sua saída correntes até 1.5 A e por isso é utilizado para controlar o motor Nema 17.

Fig. 6 - Driver A4988

Quanto aos sensores utilizados no projeto, o HCSR-04 é um sonar responsável por fazer a deteção e medição de um obstáculo durante o scan do braço. Este sensor apresenta um emissor que emite sinais ultra sónicos que são refletidos e detetados pelo receptor.

Fig.7 - Sensor HCSR-04 (Sonar)

O sensor TCS-230 é um sensor capaz de reconhecer cores do espetro visível. É utilizado para detetar a cor da peça que a garra transporta. Este possui no seu centro três fotodíodos sensíveis ás cores vermelho, verde e azul (RGB) e gera um sinal variável em frequência para cada cor detetada.

Fig. 8 - Sensor TCS-230

Outro componente utilizado e também considerado sensor é o switch limitador de fim de curso. Neste projeto são utilizados quatro limitadores para permitir deslocar o braço robótico para a posição inicial.

Fig. 9 - Sensor limitador de curso

Para permitir o controlo de todo este sistema foi utilizado o Microcontrolador ATmega2560 instalado na plataforma Arduino Mega.

Fig. 10 - Arduino Mega

O esquemático do nosso circuito eletrónico encontra-se na figura abaixo.

Fig. 11 - Esquemático do projeto

As tentativas de PCBs são mostradas agora nas imagens abaixo.

Fig. 11 - Placa PCB

Fig. 12 - Placa PCB

Fig. 13 - Placa PCB

Fig. 14 - Placa PCB

Esta é a nossa placa PCB que comcebemos.

Fig. 15 - Placa PCB criada

Fig. 16 - Placa PCB criada








  • Software

Início

O nosso projeto é programado num modo sequencial sendo que o programa vai avançando efetuando as várias funções sequencialmente.

São agora apresentados os vários fluxogramas correspondentes às diferentes funções criadas. O primeiro fluxograma mostra o ciclo principal da função Main.

Fig. 17 - Fluxograma da função Main

A função init() é responsável pela configuração do hardware. Aqui são programados os vários periféricos presentes no microcontrolador que foram utilizados.

No Porto A configurou-se os pinos PA0, PA1, PA2 e PA3 como saídas para controlo do sensor de cores.
No Porto B configurou-se o pino PB7 como saída para controlo do LED que pisca à frequência de 1 Hz.
No Porto C configurou-se os pinos como saídas para controlo dos drivers que comandam os motores.
No Porto D configurou-se o pino PD7 como saída para controlo da direção do eixo Z.
No Porto E configurou-se o pino PE3 (OC3A) para controlo do motor servo, o pino PE4 (INT4) para o limitador do eixo Y e PE5 para o limitador eixo Z
No Porto G configurou-se o pino PG2 como saída para controlo do passo do eixo Z.
No Porto H configurou-se o pino PH3 (OC4A) para o sinal do Trigger do sonar.

Configurou-se o TIMER 1 para efetuar a contagem da largura de impulso detetadas nas interrupções externas INT0 e INT1 associadas ao sinal de echo do sonar e out do sensor de cores respetivamente. Foi habilitada a interrupção por overflow de modo a permitir a contagem de overflows existentes.
Configurou-se o TIMER 2 no modo CTC - "Clear Timer on Compare" com Prescaler 1024 para uma temporização base de 5 ms. Foi habilitada a interrupção por comparação.
Configurou-se o TIMER 3 no modo Fast PWM com 8 bits de resolução e Prescaler 1024 de modo a obter uma frequência de oscilação de aproximadamente 60 Hz. O sinal PWM gerado no pino OC3A controla o movimento do motor servo.
Configurou-se o TIMER 4 no modo Phase Correct com 8 bits de resolução e Prescaler 1024 de modo a obter uma frequência de oscilação de aproximadamente 30 Hz. O sinal PWM gerado no pino OC4A é repsponsável por controlar o Trigger do sonar.

Configuraram-se as interrupções externas INT0, INT1, INT2, INT3, INT4 e INT5 de modo a gerarem interrupções quando detetado o flanco ascendente. As interrupções INT0 e INT1 são habilitadas quando é necessário obter algum valor medido pelo sonar e pelo sensor de cores respetivamente. As restantes interrupções são utilizadas para detetar as posições iniciais de cada eixo através de limitadores fim de curso.

A função roda_eixo_base(int passos) recebe uma variável com o número de passos a serem efetuados pelo motor do eixo da base e faz o motor rodar 1 passo na direção pretendida.

Fig. 18 - Fluxograma da função roda_eixo_base

A função roda_eixo_x(int passos) recebe uma variável com o número de passos a serem efetuados pelo motor do eixo X e faz o motor rodar 1 passo na direção pretendida.

Fig. 19 - Fluxograma da função roda_eixo_x

A função roda_eixo_y(int passos) recebe uma variável com o número de passos a serem efetuados pelo motor do eixo Y e faz o motor rodar 1 passo na direção pretendida.

Fig. 20 - Fluxograma da função roda_eixo_y

A função roda_eixo_z(int passos) recebe uma variável com o número de passos a serem efetuados pelo motor do eixo Z e faz o motor rodar 1 passo na direção pretendida.

Fig. 21 - Fluxograma da função roda_eixo_z

A função reset_base_position() desloca o eixo da base para a posição inicial.

Fig. 22 - Fluxograma da função reset_base_position

A função reset_braco_position() desloca os eixos X Y e Z para a posição inicial.

Fig. 23 - Fluxograma da função reset_braco_position

A função scanner() ativa o sensor sonar e faz movimentar o eixo da base numa resolução de 180 graus até detetar algum obstáculo a menos de 500 mm. Caso o sonar detete algum obstáculo deve parar o movimento do braço. Se nada for detetado o braço irá movimentar-se até completar 180 graus no sentido positivo e iniciará o movimento no sentido negativo até ser detetado um novo obstáculo.

Fig. 24 - Fluxograma da função scanner

A função agarrar_peca() desloca o braço na direção da peça de acordo com a medição efetuada pelo sensor sonar e faz a respetiva captação da peça fechando a garra.

Fig. 25 - Fluxograma da função agarrar_peca

A função color_read() faz a leitura RGB da peça presa na garra.

Fig. 26 - Fluxograma da função color_read

A função color_detect() é responsável por determinar a cor da peça conforme os valores lidos pelo sensor de cores.

Fig. 27 - Fluxograma da função color_detect

A função color_decision() faz o reconhecimento de uma cor das 4 possíveis e desloca o eixo da base para a posição pretendida. Não faz controlo de erro de leitura da cor da peça.

Fig. 28 - Fluxograma da função color_decision

A função transportar_peca() desloca a peça para o recipiente de cor correspondente. Se não tiver determinado uma cor das cores possíveis irá voltar a fazer uma nova leitura até um máximo de 5 leituras. Caso não encontre uma solução a peça é encaminhada para a posição inicial.

Fig. 29 - Fluxograma da função transportar_peca

São agora apresentados os fluxogramas das rotinas de interrupção.

Fig. 30 - Fluxograma da rotina de interrupção do TIMER 2

Fig. 31 - Fluxograma da rotina de interrupção externa INT0

Fig. 32 - Fluxograma da rotina de interrupção externa INT1

Fig. 33 - Fluxogramas das rotinas de interrupção externas INT2, INT3, INT4 e INT5








  • Resultados

Início

Apresentamos abaixo algumas fotografias do braço robótico desenhado no software Solid Works e protótipo real.

Fig. 34 - Vista lateral do braço (Solid Works)

Fig. 35 - Vista perfil do braço (Solid Works)

Fig. 36 - Vista de cima do braço (Solid Works)

Fig. 37 - Vista lateral do braço

Fig. 38 - Vista frontal do braço

Fig. 39 - Vista traseira do braço

Fig. 40 - Pormenor do eixo da base

Fig. 41 - Pormenor do eixo X

Fig. 42 - Pormenor do eixo Z e garra

Fig. 43 - Primeira tentativa de implementação do circuito eletrónico








  • Conclusões

Início

Com a realização deste projeto conseguimos principalmente adquirir mais conhecimentos sobre a programação de microcontroladores da família ATmega.

Conseguimos também compreender o funcionamento de motores de passo a passo e o funcionamento dos motores servo o qual foi uma novidade para nós.

Conseguimos ainda obter mais conhecimentos no que diz respeito ao funcionamento de sensores medidores de distâncias (sonar) e sensores de reconhecimento de cores.

Como a construção do braço robótico passou por uma fase de desenho do protótipo, conseguimos também obter mais conhecimentos em relação ao desenho vetorial utilizando o Software SolidWorks.

Em virtude de utilizarmos uma quantidade considerável de motores que implicam correntes elevadas, foi necessário criar uma placa PCB que contém todos os drivers de potência utilizados evitando assim danificar as placas de ensaio breadboard que estava inicialmente pensado utilizar. A placa PCB que construimos é uma placa perfurada de cobre com pontos individuais. Foi necessário criar as pistas com solda de estanho e fazer ligações através de fios elétricos pois apenas utilizamos uma superfície para criar pistas. Esta etapa do projeto ajudou-nos a ganhar mais experiência no processo de soldagem com estanho.

Ainda outro aspeto, e não menos importante, foi algum conhecimento adquirido na área da mecânica. Infelizmente não tivemos possibilidade de utilizar engrenagens acopladas aos motores para diminuir o esforço destes. Isto levou a aplicar os motores acoplados diretamente aos veios dos vários eixos o que nos limitou muito na movimentação do braço. Apenas o eixo da base consegue realizar toda a resolução pretendida apesar de se fazer sentir alguma dificuldade ao vencer a inércia da estrutura pois esta acabou por ficar com um peso considerável.

Queremos também deixar aqui salientado o facto de sermos trabalhadores/estudantes, que nos limitou um pouco no tempo necessário à criação deste projeto.

Apesar de todos os inconvenientes, consideramos que atingimos alguns dos objetivos propostos. No entanto, o protótipo não ficou funcional como tinhamos pensado na ideia inicial.
Temos ainda numa visão futura fazer um melhoramento no projeto aplicando caixas redutoras nos veios dos motores de modo a permitir uma área útil esférica utilizando toda a resolução dos quatro eixos.








  • Referências

Início

[1] «Wikipédia - Robô industrial» disponível em https://pt.wikipedia.org/wiki/Robô_industrial
[Acedido: 02/01/2018]

[2] Data Sheet do sensor HCSR-04 disponível em www.micropik.com/PDF/HCSR04.pdf
[Acedido: 02/01/2018]

[3] Data Sheet do sensor TCS-230 disponível em www.w-r-e.de/robotik/data/opt/tcs230.pdf
[Acedido: 02/01/2018]

[4] Informação detalhada sobre o driver DRV8825 disponível em https://www.pololu.com/product/2133
[Acedido: 02/01/2018]

[5] Informação detalhada sobre o driver A4988 disponível em https://www.pololu.com/product/1182
[Acedido: 02/01/2018]

[6] Informação detalhada sobre o microcontrolador ATmega 2560 disponível em https://www.microchip.com/wwwproducts/en/ATmega2560
[Acedido: 02/01/2018]

[7] «Braço robótico é capaz de realizar sozinho cirurgias no coração e outros órgãos» disponível em https://www.uai.com.br/app/noticia/saude/2016/05/06/noticias-saude,190229/braco-robotico-e-capaz-de-realizar-sozinho-cirurgias-no-coracao-e-outr.shtml
[Acedido: 02/01/2018]



Início