Documentação
1. Objetivo:
O objetivo do trabalho consiste na construção de um manipulador capaz de escrever a sigla UFMG em uma determinada área reservada (workspace). Para a execução do trabalho, somente dois (2) motores elétricos podem ser utilizados. Não é permitido o uso de sensores, toda a montagem deve caber em um espaço pré-determinado.
2. Introdução:
O robô manipulador do trabalho consiste em um manipulador mecânico construído com peças LEGO, utilizando dois motores elétricos para a movimentação de dois elos prismáticos: um na coordenada X e outro na coordenada Y. Optou-se por uma montagem de uma base fixa e nesta base, o eixo X move-se através de um elo prismático composto por duas tiras de engrenagens do tipo “rack”. O eixo Y é montado sobre a base do sistema mecênico do eixo X, tendo montagem semelhante a este. Em ambos os casos, o deslocamento se dá através da transferência de movimento do motor eletrônico para a caixa de redução, e desta para as engrenagens do tipo “pinion” apoiadas sobre as engrenagens do tipo “rack”.
O sistema elétrico/eletrônico é composto por dois motores elétricos acionados por uma ponte H integrada em um shield Arduino específico. Um outro shield Arduino contendo um LCD 16×2 e teclas compõem a interface com o utilizador. A placa principal é uma placa Arduino Mega 2560.
3. Desenvolvimento
3.1. Mecânica:
Inicialmente, discutiu-se qual a melhor forma de construção do manipulador mecânico: utilizando arranjos do tipo RP (Revolução/Prisma), ou do tipo PP (Prisma/Prisma). Decidiu-se que seria melhor o uso do tipo PP e então, as primeiras montagens foram iniciadas. Paralelamente, os dois motores utilizados na montagem foram selecionados dentre os disponíveis para uso. A figura abaixo ilustra um dos motores testados já com a conexão mecânica inserida no eixo:
“When I present gear reduction to kids, I find it difficult to give a direct explanation of why it works” (MARTIN, 1995, p. 5). O primeiro marco da parte mecânica foi a montagem da caixa de redução. Com o auxílio da documentação fornecida, foi possível ter as primeiras ideias da montagem da caixa de redução. Depois, foi elaborada uma estrutura mecânica mais completa e complexa, fazendo o uso de duas juntas prismáticas, uma para a movimentação no eixo X e outra para movimentação no eixo Y. Optou-se por utilizar trilhos duplos em ambos os eixos de forma a ter uma mecânica mais robusta e de pouca “folga”.
Duas caixas de redução foram construídas, uma para o movimento da base e outra para o braço (onde o efetuador foi conectado – no caso uma caneta). O cálculo da redução foi compatível com a descrição no artigo: “The Art of Lego Design; Martin, Fred G., March 1995”. A redução da base foi de 243:1 (cinco estágios de redução de 3:1 – engrenagens utilizadas de 24 e 8 dentes) e a do braço foi de 81:1 (quatro estágios de 3:1 – engrenagens utilizadas de 24 e 8 dentes). O uso de duas juntas prismáticas em cada eixo de deslocamento (X e Y) tornou a montagem e o deslocamento mais robusto e com menor trepidação.
A figura abaixo exibe a montagem mecânica completa pronta para execução dos testes de movimentação das juntas prismáticas:
Execução do teste de movimentação não concomitante das duas juntas prismáticas:
Exibição do teste inicial de escrita utilizando não concomitantemente as duas juntas prismáticas:
O vídeo abaixo ilustra a execução do teste inicial de escrita com uma pequena alteração mecânica de forma a ter na junta prismática do eixo Y maior estabilidade:
Tentativa de estabilização da junta prismática que faz a movimentação do eixo Y:
Após as alterações mecânicas e correção de alguns pequenos bug's no software, pode-se verificar no vídeo abaixo a execução da escrita da sigla UFMG realizada pelo robô de forma autônoma, como pretendido inicialmente. Entretanto, pode-se perceber que em determinados momentos a caneta parece mover-se no eixo Z devido ao desbalanceamento na estrutura da junta prismática que faz a movimentação do eixo Y. A correção foi realizada através da inserção de mais duas engrenagens do tipo “pinion” as quais auxiliam a estabilização da junta prismática. O aumento da base do robô juntamente com a utilização do pack de baterias e do stack das placas também serviu para dar maior estabilidade ao sistema.
3.2. Elétrica/Eletrônica:
Optou-se por utilizar uma placa eletrônica de controle do tipo Arduino em virtude da mesma possuir uma IDE de fácil instação e debbug, múltiplas possibilidades de placas e processadores, baixo custo, infinidade de de bibliotecas disponíveis na internet, número elevado de shields com as mais variadas funções e objetivos. Comparando com a HandyBoard (a qual usa um microcontrolador de 16 bits 68HC11), a opção pelo uso do Arduino tornou-se vantajosa devido a agilidade e flexibilidade de uso, além da disposição de um processador RISC de 8 bits moderno, ao invés de uma arquitetura CISC de 16 bits em um ambiente de desenvolvimento restrito e de execução na máquina alvo através de interpretação.
A sugestão do Prof. da disciplina foi de que a mesma deveria ser a Arduino Mega 2560 devido a capacidade computacional e também a compatibilidade mecânica para encaixe dos shields dos motores e do LCD 16×2/teclado.
Uma crítica em relação ao stack formado pela placa mãe (placa Arduino com o microcontrolador Atmega 2560), shield para acionamento dos motores elétricos e shield do LCD/Teclado é que há dificuldade de acesso aos bornes dos conectores dos motores elétricos.
3.3. Software:
O software utilizado para controlar o robô é do tipo malha aberta (sem realimentação), escrito em uma linguagem C/C++ like na IDE padrão do Arduino. Basicamente há inclusão das principais bibliotecas:
#include <Wire.h> #include <Adafruit_MotorShield.h> #include "utility/Adafruit_MS_PWMServoDriver.h" #include <LiquidCrystal.h>
Definições gerais e de pinos de I/O's utilizados em periféricos:
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // define some values used by the panel and buttons int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 5 #define btnUP 4 #define btnDOWN 3 #define btnLEFT 2 #define btnSELECT 1 #define btnNONE 0
A seguir, é dado uma função de leitura do teclado realizada através de uma interface do tipo ADC (Analog to Digital Converter):
// read the buttons int read_LCD_buttons() { adc_key_in = analogRead(0); // read the value from the sensor // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 // we add approx 50 to those values and check to see if we are close if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result // For V1.1 us this threshold if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 250) return btnUP; if (adc_key_in < 450) return btnDOWN; if (adc_key_in < 650) return btnLEFT; if (adc_key_in < 850) return btnSELECT; // For V1.0 comment the other threshold and use the one below: /* if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 195) return btnUP; if (adc_key_in < 380) return btnDOWN; if (adc_key_in < 555) return btnLEFT; if (adc_key_in < 790) return btnSELECT; */ return btnNONE; // when all others fail, return this... }
É criado então o objeto para controle da shield de acionamento dos motores:
//Criando o objeto motor shield com o endereco defaut I2C Adafruit_MotorShield AFMS = Adafruit_MotorShield(); //Selecionando a porta que o motor ira rodar Adafruit_DCMotor *myMotor = AFMS.getMotor(3); Adafruit_DCMotor *myMotor2 = AFMS.getMotor(4);
A função setup é dada abaixo, ela é executada sempre que o Arduíno é inicializado. Esta função inicializa o display 16×2 (incializa o controlador do display), seta o cursor para a posição inicial e exibe uma mensagem. O shield de acionamento do motor é inicializado tendo como default uma freqüência de acionamento de 1.6kHz:
void setup(){ //Display com 16 colunas e 2 linhas lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("Mandela TP1"); //Cria com a frequencia defaut = 1.6KHz AFMS.begin(); }
Após a execução da função de setup, a função loop é invocada e é nela que o acionamento controlado dos motores de forma a compor o objetivo da tarefa é realizado. Como pode-se observar no trecho do código abaixo, uma mensagem é exibida no display e o programa fica em prontidão, esperando uma tecla ser acionada para início do processo de escrita das letras (execução da tarefa). Após a tecla ser pressionada, há exibição do estado de execução, sendo iniciado pelo acionamento dos motores de forma que a letra U seja escrita. A mesma idéia é válida para as outras letras. Após a escrita da última letra, o fluxo do programa é paralizado. Caso a tecla de reinicialização seja pressionada, o processo de escrita é iniciado a partir da origem.
void loop() { //TELA INICIAL lcd.setCursor(0,1); lcd.print("Iniciar (SELECT)"); while(lcd_key != 1){ lcd_key = read_LCD_buttons(); // read the buttons } //COMEÇO DA TAREFA lcd.setCursor(0,1); lcd.print("EXECUTANDO... "); //LETRA U //Traço vertical da esquerda `´ myMotor2->run(FORWARD); myMotor2->setSpeed(127); delay(8000); myMotor2->run(RELEASE); delay(2000); //Traço horizontal da base -> myMotor->run(FORWARD); myMotor->setSpeed(127); delay(2000); myMotor->run(RELEASE); delay(2000); //Traço vertical da direita ^ myMotor2->run(BACKWARD); myMotor2->setSpeed(127); delay(8000); myMotor2->run(RELEASE); delay(2000); ... ... ... }
4. Testes:
Durante toda a etapa de desenvolvimento mecânico, partes do robô eram testadas e validadas tendo como premissa a tarefa qual aquela parte era determinada.
Ainda durante a fase de testes, as seguintes anomalias foram encontradas:
→ Dependência da capacidade da bateria no desempenho da tarefa a ser executada pelo robô: em determinados casos de experimento, houve perceptível lentidão na execução da tarefa em razão da menor corrente no motor, em alguns dos experimentos, as letras chegaram a ficar desproporcionais ao tamanho inicialmente esperado. Esta anomalia não chegou a ser resolvida devido ao tempo necessário para a implementação da mesma. Basicamente, para resolver o problema seria necessário o aumento do tempo “Ton” da onda PWM (Pulse Width Modulation) utilizada para alimentar o motor, com a ressalva de que determinadas baterias recarregáveis devem possuir uma tensão mínima, caso contrário tornam permanentemente imunes à recargas devido a baixa reversibilidade do processo químico envolvido.
→ Trepidação do robô: verificou-se que todo o conjunto mecânico do robô trepidava quando em operação. Este problema foi resolvido inserindo uma base de apoio maior, juntamente como espaço para alojamento do pack de bateria e stack das placas eletrônicas. Não houve interferência no espaço máximo permitido, imposto na especificação do trabalho.
→ Trepidação e deslocamento em Z do eixo Y: durante execução dos testes de escrita, verificou-se que a caneta em determinadas situações movimentava de forma a não mais ter contato com o papel, outras vezes a mesma deslocava devido ao atrito excessivo com o papel. A primeira situação foi resolvida inserindo mais duas engrenagens do tipo “pinion” na junta prismática do eixo Y, de forma a obter maior estabilidade mecânica. A segunda situação foi resolvida através de uma estrutura em torno da caneta, dando maior rigidez mecânica.
O funcionamento final do robô pode ser visualizado abaixo:
Pode-se observar que após alterações realizadas na etapa final do desenvolvimento da parte mecânica e do software, houve melhor desempenho na execução da tarefa de escrita, tornando-a mais uniforme e fluida.
5. Conclusão:
A execução do trabalho proporcionou maior clareza e fixação dos conceitos de Introdução à Robótica desenvolvidos na sala de aula. O uso do kit de montagem LEGO facilitou a implementação de idéias de diversas montagens mecânicas em curto espaço de tempo. Entretanto, deve-se notar que apesar das múltiplas possibilidades, deve-se buscar sempre o uso de conceitos já consagrados em soluções mecânicas, como: caixa de engrenagens de redução, transmissão do movimento mecânico, trilhos de rolamentos, etc. A mecânica foi a etapa que mais dispendeu tempo e esforço da equipe, uma vez que somente um dos membros tinha previamente maior contato com montagens utilizando blocos LEGO.
A eletrônica envolvida na execução do trabalho foi mínima, uma vez que foi utilizado um módulo Arduino 2560 Mega, onde shields com interface para o usuário e acionamento dos motores foram utilizados. A vantagem do uso dos shields é que os mesmos são diretamente conectados à placa principal na forma de uma pilha de placas, eliminando necessidade de interconexões cabeadas. A praticidade ao desenvolver uma aplicação para o Arduino também foi levada em consideração, dado o número de bibliotecas disponíveis na internet, a facilidade de instalação e uso do Ambiente Integrado de Desenvolvimento (IDE) e a praticidade de programação/debbug da placa através de uma interface USB comum.
O trabalho em equipe e a discussão de idéias e implementação de novas possibilidades sempre esteve presente durante o desenvolvimento do trabalho. A multidisciplinaridade dos membros da equipe foi fundamental para a resolução dos problemas e adaptações ágeis.
Podemos citar como futuros melhoramentos:
1). Mecânica:
→ Redução da conexão mecânica dos motores com a engrenagem para diminuir instabilidade (trepidação)
→ Aumento do comprimento dos trilhos da base para maior atuação do efetuador no workspace
2). Eletrônica:
→ Uso de baterias de maior capacidade de fornecimento de energia
→ Melhor acabamento nas conexões elétricas
3). Software:
→ Informar no display a tensão da bateria
→ Possibilidade de ajuste das posições (eixos X e Y) através do teclado
→ Aprimoramento do software de forma que o mesmo possa determinar todo o deslocamento realizado e, ao final, ao solicitar o reinício da execução, o efetuador possa voltar para a origem o mais próximo possível
→ Modularização do software, criando componentes primários utilizados tais como semiretas, retas e curvas. Uso de algoritmos consagrados tais como o Algoritmo de Bresenham. Criação de um sistema de fontes e adaptação para “saída” a partir de uma fonte
Referências:
1. The Art of Lego Design; Martin, Fred G.; March 1995
2. Shield do display/teclado: https://www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)
3. Shield do motor: https://learn.adafruit.com/adafruit-motor-shield-v2-for-arduino/install-software








