ROBÔ PARA ENTREGA DE OBJETOS Marcos Andrade Centro Universitário Salesiano de São Paulo - UNISAL Maria Nídia R.D. Yacoub Centro Universitário Salesiano de São Paulo- UNISAL Endereço para correspondência: Rua Ferreira Penteado No 1518 Apto 44 Campinas SP CEP: 13025-357 Fones: (19) 3294-0322 / (19) 9732-2321 e-mail: mandrade@unisal.com.br Abstract This work consists in the development of an autonomous micro controlled robot intended for the delivery of objects. The final destination of the robot is given through a conventional numeric keyboard and it is shown through a LCD display where additional information about the robot s movements is also given. The user can choose ninety-nine different routes, which can be previously defined by software. The robot is projected to carry objects up to 2 kg weight. Its main characteristics are the precision of movements (0,18cm), lower cost, flexibility in the routes definition and total autonomy. Key-Words Microcontroller, Step Motor, Liquid Cristal Display, Robot
Resumo Este trabalho consiste no desenvolvimento de um robô autônomo microcontrolado, programável, destinado à locomoção de objetos. A informação da posição de destino é dada através de um teclado numérico convencional e mostrada através de um display de cristal líquido (LCD) onde são também fornecidas informações sobre o deslocamento do robô. O usuário pode escolher noventa e nove rotas diferentes que poderão ser previamente definidas por software. O robô é projetado para a locomoção de cargas de até 2kg e tem como características sua precisão de movimentos (0,18cm), baixo custo, flexibilidade na definição de rotas e total autonomia. Palavras-Chaves Microcontrolador, Motor de Passo, Display de Cristal Liquido, Robô Introdução: São várias as aplicações técnicas que utilizam o sistema cartesiano de posicionamento em sua implementação [links 1-3]. O movimento é feito sempre tendo como referência um ponto base considerado a posição inicial do deslocamento, tal técnica pode ser encontrada em dispositivos tais como plotters e placers. O uso de motores de passo [link 4] nas aplicações torna-se cada vez mais comum, pois eles possibilitam determinarmos exatamente a quantidade de revoluções do eixo do motor necessárias para o deslocamento desejado, dispensando assim um sistema de malha fechada, ou seja, com realimentação através de encoders. É claro que em alguns casos mais específicos, onde o processo a ser controlado é crítico, há a necessidade da utilização de um processo de feed-back para a garantia da precisão do
posicionamento. Contudo, os motores de passo têm-se mostrado bastantes eficientes para a maioria das aplicações. Outra grande vantagem dos motores de passo é que seu controle é totalmente compatível com sistemas digitais. Através de circuitos digitais simples podemos controlar fatores como quantidade passos, sentido e velocidade de rotação. A utilização do micro-controlador no robô viabiliza a sua capacidade de autonomia, possibilitando a implementação de uma programação lógica a ser seguida. Outra grande vantagem da utilização dos micro-controladores é seu baixo consumo de energia, na ordem de miliwatts [links 5-7], possibilitando o uso de uma pequena bateria convencional. No caso do nosso projeto, o dispositivo concebido pode ter diversas aplicações, como por exemplo, a entrega de correspondências em empresas, deslocamento de carga através do depósito, ou mesmo, a movimentação de objetos em regiões de risco. Sua capacidade de reprogramação viabiliza a escolha de rotas adequadas a cada situação. O ponto base, de onde o robô parte é considerado como o centro de distribuição. A partir dele, podemos programar rotas diferentes de ida e de volta totalmente independentes. Descrição Geral dos blocos do robô O usuário entra com a posição final do deslocamento através de um teclado numérico e visualiza os dados teclados, assim como outras informações sobre o deslocamento do robô através de um display LCD. Estas informações são passadas para o micro-controlador interno que está programado para controlar o movimento dos dois motores de passo responsáveis pelo deslocamento do robô. Uma seqüência de instruções determinará as mudanças de direção necessárias para o movimento requerido. Dependendo da programação das rotas (até 99 rotas diferentes podem ser definidas),
temos a possibilidade de desviarmos de obstáculos pré-determinados. O driver de potência é responsável pela alimentação dos motores de passo. O diagrama em blocos é apresentado na Figura 1 e cada bloco é descrito em detalhe a seguir. Teclado: Teclado de 12 teclas. O teclado serve para coletar informações do usuário sobre a rota de deslocamento escolhida. Este dispositivo consiste de uma matriz de teclas que se comunica com o módulo de controle através de um barramento de dados de 7 bits, os quais codificam a tecla pressionada. Este dispositivo é comumente encontrado em aparelhos telefônicos, contando com teclas de 0 a 9, # e *, que no projeto são consideradas como confirma e cancela, respectivamente. O sistema criado para leitura das teclas funciona da seguinte maneira: temos três fios ligados às colunas da matriz, que no caso são considerados como entradas, e quatro fios nas linhas da matriz, considerados como saídas, conforme a figura 2: A B C 1 2 3 4 5 6 7 8 9 * 0 # 1 2 3 4 Figura 2 Esquema matricial do teclado
Todos os cabos estão ligados a uma porta do microcontrolador e o trabalho de controle é feito bit a bit pelo software. O funcionamento da leitura do teclado obedece ao seguinte algoritmo: 1 o ) Seta o bit A (Haverá tensão no pino) 2 o ) Lê o valor do bit 1, se o valor do bit for 1, a tecla 1 foi pressionada 3 o ) Lê o valor do bit 2, se o valor do bit for 1, a tecla 4 foi pressionada 4 o ) Lê o valor do bit 3, se o valor do bit for 1. a tecla 7 foi pressionada 5 o ) Lê o valor do bit 4, se o valor do bit for 1, a tecla * foi pressionada 6 o ) Seta o bit B (haverá tensão no pino) 7 o ) Lê o valor do bit 1, se o valor do bit for 1, a tecla 2 foi pressionada 8 o ) Lê o valor do bit 2, se o valor do bit for 1, a tecla 5 foi pressionada 9 o ) Lê o valor do bit 3, se o valor do bit for 1, a tecla 8 foi pressionada 10 o ) Lê o valor do bit 4, se o valor do bit for 1, a tecla 0 foi pressionada 11 o ) Seta o bit C (haverá tensão no pino) 12 o ) Lê o valor do bit 1, se o valor do bit for 1, a tecla 3 foi pressionada 13 o ) Lê o valor do bit 2, se o valor do bit for 1, a tecla 6 foi pressionada 14 o ) Lê o valor do bit 3, se o valor do bit for 1, a tecla 9 foi pressionada 15 o ) Lê o valor do bit 4, se o valor do bit for 1, a tecla # foi pressionada Em resumo, o teclado funciona como uma matriz que quando pressionada uma tecla, fecha o contato entre a coluna e a linha correspondentes. Para o controle da entrada de dados foi implementada uma rotina lógica chamada debounce. Ela é necessária para que não ocorra leituras repetidas de uma tecla (pressionada uma única vez) devido à ruídos gerados pelos contatos metálicos das teclas. Esta rotina consiste em após a detecção de um nível lógico 1 em uma das saídas do teclado, aguardamos um tempo (no caso 20ms) e voltamos a testar o valor da tecla, certificando que esta
realmente foi pressionada. A sub-rotina de leitura do teclado só dá continuidade ao programa quando a tecla pressionada for solta. Isto se torna necessário pois, como temos uma grande velocidade de processamento no microcontrolador (10 Mhz), não podemos correr o risco de que durante o período que a tecla estiver pressionada, o programa leia esta tecla mais de uma vez. Display: LCD de 16 x 2. Este dispositivo trata-se de um módulo inteligente de interface com usuários. Ele reproduz os sinais advindos do microcontrolador de maneira visível ao usuário. Todas as mensagem e entradas de teclado são exibidas neste módulo, bem como dados do funcionamento dos motores e mensagens de interação com o usuário. A interface com o display é feita por um barramento de 8 bits de dados e 3 bits de controle. O seu funcionamento pode ser dividido em duas fases: modo de instruções e modo de dados. No modo de instruções devemos, através do programa do microcontrolador, remeter ao display valores que representam funções que o mesmo deverá executar, como por exemplo: limpar o display, posicionamento do caracter a ser escrito, modo de comunicação, etc). Já no modo de dados, os valores enviados pelo barramento serão convertidos através de uma tabela ASCII e o valor correspondente será exibido no display. Por exemplo, caso o valor em Hexadecimal 41h seja enviado no modo de dados, o display exibirá a letra A na posição atual. A cada dado enviado a posição é incrementada para que os valores possam ser remetidos sucessivamente e escritos um após o outro no display. Os bits de controle para o display são os seguintes: RS (seleção) 1 = Dado, 0 = Instrução; R/W (leitura/escrita) 1 = Leitura, 0 = Escrita; E (Enable). Borda de subida Habilita.
No nosso caso, o bit R/W foi colocado em 0 direto, pois não necessitaremos efetuar nenhuma leitura dos valores escritos no display, sendo assim, apenas controlamos os 8 bits de dados/instruções, o bit RS e o Bit E. O módulo do display tem necessidade de algumas temporizações específicas para poder receber os dados corretamente, sendo assim, após cada rotina, seja ela de escrita de dados ou de instruções, chamamos uma rotina de temporização para que o módulo LCD tenha tempo de processar as informações recebidas. Modo de dados: Neste modo, devemos apenas colocar o pino RS em 1, escrevermos o valor correspondente à letra/número desejados no barramento de dados e dar um pulso no pino E. Em seguida devemos aguardar um tempo mínimo de 15ms para que o dado seja processado. Para controle do contraste do módulo LCD, utilizamos entre os pinos 2 e 3 um potenciômetro de 10 KΩ em paralelo com um capacitor de 100 nf Modo de instruções: O conjunto das instruções utilizadas em nosso projeto e o status dos bits de controle podem ser vistas na Tabela 1.
Tabela 1 Instruções do display de LCD Microcontrolador AT89S8252: Microcontrolador contendo a programação responsável por coletar os dados do teclado, processá-los, enviar informações para serem mostradas no display e enviar os sinais adequados para o driver de potência dos motores. O microcontrolador selecionado foi o 89S8252, por possuir os seguintes recursos: - 8 Kb de memória flash programável por ISP; - Memória RAM de 256 x 8 bits; - 2 Temporizadores; - 32 Pinos configuráveis de I/O. A pinagem deste microcontrolador por ser encontrada na referência bibliográfica [link 5]. Em nosso projeto utilizamos a porta P0 para o controle dos embobinamentos dos motores, P2 para entrada de teclado, P1 para o barramento de dados do display de
LCD e os pinos P3.0 e P3.1 para o controle dos bits RS e E (também pertencentes ao display). Para o funcionamento do microprocessador, devemos prover uma fonte de alimentação regulada em 5V (utilizamos o CI7805) e um cristal de 10Mhz nos pinos XTAL1 e XTAL2 com acoplamento de capacitores de 50pf. A linguagem de programação escolhida para o desenvolvimento do programa de controle foi o Assembler, por ser de baixo nível (bastante próximo do hardware ) e ser nativa dos microcontroladores. Para a programação, compilação e depuração de erros, foi utilizado um software específico da empresa Keil, que pode ser encontrado em versão shareware [link 8]. O pacote da Keil divide-se em uvision (editor para programação e compilador) e Dscope (debugger). Driver de potência: Responsável por chavear as tensões/correntes necessárias para o acionamento dos motores. Composto por transistores que recebem sinais lógicos do microcontrolador e repassa-os com ganho de corrente para os motores. O circuito para acionamento dos motores é bastante simples podendo, inclusive, ser encontrado em formato de CI para motores com consumo de até 500mA (ULN2003). No nosso caso, optamos por montar o circuito utilizando transistores TIP121 (capaz de chavear correntes de até 5A), pois a corrente consumida por cada embobinamento do motor é de 1,4 A. Foi necessária a colocação de resistores de pull-up (680 Ohms) nas portas do microcontrolador, uma vez que a saída do mesmo é em dreno aberto. A bobina do motor é energizada com a saída lógica 0 do microcontrolador. Para o acionamento dos motores, não pudemos utilizar o CI7805, uma vez que este provê uma corrente de até no máximo 1A. A alimentação dos motores deverá ser, portanto, fornecida separadamente, através do CI regulador LM323.
Uma bateria de 12V e 7A é suficiente para fornecer a energia para os motores; no entanto é necessária a regulagem desta tensão para 5V (especificação do motor), que é feita pelo CI LM323. Este CI possui capacidade de fornecer corrente de até 3A, suficiente para os dois motores do robô. Segue abaixo (Figura 3) o esquema elétrico do driver de potência: Figura 3 Driver de potência Motores Direito e Esquerdo: Motores de passo responsáveis pelo sistema de tração do robô. Estes motores são alimentados pelo driver de potência e acionam as rodas do robô. A cada pulso, os motores de passo fazem um incremento rotativo (passo). Cada passo é apenas uma porção de uma rotação completa. Vários pulsos devem ser aplicados para alcançarmos um determinado ângulo de rotação do eixo. A precisão do movimento é determinada pela quantidade de pulsos enviada ao motor. No nosso caso, o motor escolhido possui uma resolução de 0,96 o por passo. São portanto necessários 375 pulsos para termos uma revolução completa no eixo do motor. Esses pulsos devem ser dados nos embobinamentos do motor de maneira adequada. Os motores do robô são de cinco fios, ou seja, um fio comum a todos os embobinamento e
quatro fios pertencentes a cada embobinamento. A seqüência adequada para o movimento dos motores no sentido horário é dada pela Tabela 2. Tabela 2 Seqüência de pulsos em binário. Caso desejemos o movimento no sentido anti-horário, a seqüência de pulsos nas bobinas deve ser invertida. De acordo com a tabela 2, a seqüência de bytes necessária o acionamento de dois motores (como é o caso do nosso robô) nos diversos sentidos é dada pela tabela 3 a seguir: Sentido Valore em Hex para o 1 o Passo Valore em Hex para o 2 o Passo Valore em Hex para o 3 o Passo Valore em Hex para o 4 o Passo Direita 47 2b 1d 8e Esqueda 1d 2d 47 8e Trás 17 2b 4d 8e Frente 4d 2b 17 8e Tabela 3 Acionamento dos 2 motores em hexadecimal Estes códigos devem ser repetidos sucessivamente para que tenhamos um movimento constante no eixo do motor no sentido em que desejarmos. No nosso caso, optamos por termos um sistema de tração diferencial, ou seja, cada motor possui capacidade de girar em um sentido independentemente do outro, sendo assim, quando queremos virar o robô, acionamos os motores direito e esquerdo em
sentidos contrários Desta forma, quando ambos motores girarem em sentido horário, teremos o deslocamento do robô para frente. Quando os motores girarem em sentidos opostos teremos o deslocamento do robô sobre seu próprio eixo, sendo para a esquerda ou direita (Figura 4). Figura 4 Forças atuantes sobre as rodas Parte física/mecânica: A madeira foi escolhida para a composição da estrutura do robô por se tratar de um produto de fácil acesso e manipulação. A estrutura que comporta em seu interior os dispositivos elétricos e eletrônicos foi projetada no AutoCad. Para a parte mecânica foi feita a opção pelo tracionamento do robô por duas rodas, com sistema independente de sentido. Foi utilizado ainda um rodízio na traseira do robô para que o mesmo pudesse suprir a necessidade de equilíbrio ao robô sem afetar o seu sentido.
Descrição do Programa O programa do microcontrolador foi desenvolvido em linguagem Assembler da família 8051. Foi utilizada a lógica booleana tradicional para tomada de decisões dentro da programação. O fluxograma do programa pode ser visto na Figura 5. O programa foi dividido em programa principal e sub-rotinas de modo a facilitar a programação.
Figura 5 Fluxograma básico de funcionamento
TABELA DE ROTAS: Para tabela de rotas utilizamos sempre uma string composta por números, contendo os tipos de movimentos desejados e a quantidade de passos por movimento. Esta string é limitada apenas pela capacidade de memória do microcontrolador. O programa sempre efetua a leitura de 4 dígitos de cada vez, sendo que o primeiro dígito será considerado como o tipo de movimento (1=frente, 2=esquerda, 3=direita e 4=trás) e os outros três dígitos como a quantidade de passos a serem dados pelos motores. Temos a seguir um exemplo de rota a ser executada pelo programa: POSICAO12: DB '1200311114002010120030204200',0ffh Neste exemplo, o robô irá mover-se 200 passo para frente, 111 passo para a direita, 400 passo para frente,10 passos para a esquerda,200 passos para frente, 20 passos para a direita e 200 passos para trás. Para que possamos calcular a distância percorrida, devemos levar em consideração o diâmetro da roda e o ângulo de cada um dos passos dados. Em nosso caso, utilizamos uma roda com diâmetro de 22cm e os motores possuem uma resolução de 0,96º por passo, logo a cada passo teremos ((2*PI*R)/360)*0,96, ou seja 0,18 cm por passo. CORPO PRINCIPAL: Inicialmente energizamos as bobinas 1 do motor esquerdo e direito, fazendo assim com que os motores de passo fiquem travados, zeramos as posições de memória 30h e 31h, onde serão guardados os valores digitados pelo usuário no teclado, em seguida configuramos o Timer/counter 0 para contador de 8 bits. Chamamos a sub-rotina INICIADISP, carregamos a string mensagem 1 ( Digite a posição desejada: ) no registrador DPTR, chamamos a sub-rotina ESCREVE. À partir deste momento teremos no display de LCD o texto que está contido no DPTR. Iniciamos então a varredura do teclado, onde utilizamos a técnica descrita no tópico
teclado para análise da tecla pressionada. Caso alguma tecla tenha sido pressionada, chamamos a sub-rotina DEBOUNCE,verificamos se é o sustenido (#), se for, vamos para a sub-rotina CALCULA, senão verificamos se é o asterisco (*), se for, voltamos ao início do programa, senão apresentamos no display o número digitado (0-9) e o colocamos na posição de memória 30h se for o primeiro digito ou na posição 31h se for o segundo digito. Caso após a varredura do teclado não tenha sido pressionada nenhuma tecla, voltamos a varre-lo novamente, até que ocorra alguma mudança. SUB-ROTINAS: INICIADISP Tem como objetivo remeter ao display a codificação necessária e devidamente temporizada para: limpá-lo, estabelecer os padrões de escrita e posicionar o cursor na linha 1e coluna 1. ESCREVE Esta subrotina faz um processo cíclico do primeiro ao último caractere da mensagem carregada no DPTR, convertendo cada caractere em ASCII e remetendo-o ao display, obedecendo as temporizações necessárias. CALCULA Efetua o cálculo da posição desejada, multiplicando o valor guardado em 30h (primeiro valor digitado no teclado) por 10 e soma ao conteúdo da posição de memória 31h (segundo valor digitado no teclado), obtendo assim um único valor inteiro. Esta sub-rotina ainda valida os valores digitados, baseado em rotas programadas em uma lista de rotas gravadas no microcontrolador. Caso a rota digitada (e calculada) exista na lista de rotas, chama a sub-rotina MOVER-SE, senão, chama a sub-rotina INICIADISP, carrega a mensagem2 ( Posição inválida. Tente novamente ) em DPTR e chama a sub-rotina ESCREVE, em seguida volta ao início do programa. MOVER-SE Inicia chamando a sub-rotina INICIADISP, carrega a mensagem3 ( Afaste-se, 3 seg para a partida ) em DPTR e chama a sub-rotina ESCREVE. Chama a
sub-rotina TEMPO3S. Procura na lista de rotas os dois primeiros valores, que correspondem ao sentido de rotação (utilizamos 1 para frente, 2 para trás, 3 para direita e 4 para a esquerda) e a quantidade de passos a ser dada, carrega no registrador A o valor do sentido e no registrador B a quantidade de passos. Dependendo do valor do registrador A, chama a sub-rotina FRENTE, TRAS, DIREITA ou ESQUERDA. Caso o valor lido no registrador A seja 5, sabemos que chegou ao fim da seqüência de movimentos e retorna ao início do programa. Após retornar da sub-rotina de sentido escolhida, incrementa o apontador de posição e passa carregar o próximo par de valores referentes ao sentido de rotação e quantidade de passos a ser dada. TEMPO3S Aguarda o tempo de 3 segundos, através da técnica de consumo de clock, ou seja, executará um laço contendo uma instrução NOP (no operation - que consome um pulso de clock) por 30000000 de vezes, devido ao clock de 10 Mhz que utilizamos. DIREITA Chama a sub-rotina INICIADISP, carrega a mensagem4 ( Motores girando para a direita ) em DPTR e chama a sub-rotina ESCREVE. Em seguida, mandará para a porta P0 os valores (47h, 2Bh,1Dh e 8Eh) necessários para que seja executado um passo no motor direito para trás e um passo no motor esquerdo para frente. Estes valores serão repetidos a quantidade de vezes que estiver contida no registrador B (determina a quantidade de passos). ESQUERDA Chama a sub-rotina INICIADISP, carrega a mensagem4 ( Motores girando para a direita ) em DPTR e chama a sub-rotina ESCREVE. Em seguida, mandará para a porta P0 os valores (17h, 2Dh,47h e 8Eh) para que seja executado um passo no motor direito para frente e um passo no motor esquerdo para trás. Estes valores serão repetidos a quantidade de vezes que estiver contida no registrador B (determina a quantidade de passos).
FRENTE Chama a sub-rotina INICIADISP, carrega a mensagem4 ( Motores girando para a direita ) em DPTR e chama a sub-rotina ESCREVE. Em seguida, mandará para a porta P0 os valores (4Dh, 2Bh,17h e 8Eh) para que seja executado um passo nos motores direito e esquerdo para frente. Estes valores serão repetidos a quantidade de vezes que estiver contida no registrador B (determina a quantidade de passos). TRAS Chama a sub-rotina INICIADISP, carrega a mensagem4 ( Motores girando para a direita ) em DPTR e chama a sub-rotina ESCREVE. Em seguida, mandará para a porta P0 os valores (17h, 2Bh, 4Dh e 8Eh) para que seja executado um passo nos motores direito esquerdo para trás. Estes valores serão repetidos a quantidade de vezes que estiver contida no registrador B (determina a quantidade de passos). DEBOUNCE: Rotina que utiliza a técnica de consumo de clock por 50 ms antes de validar a leitura do teclado, ou seja, esta rotina pega o valor lido através do teclado, aguarda 50ms, lê novamente o valor do teclado, caso os valores lidos na primeira e na segunda vez sejam iguais, o dado é considerado verdadeiro, caso contrário ele é descartado e os valores lidos são considerados apenas uma histerese do teclado. Conclusões: Para a obtenção dos dados experimentais foram programadas 14 rotas diferentes e a precisão esperada pelo robô foi obtida com sucesso. Os valores de consumo de corrente ficaram dentro do esperado, ou seja, na faixa de 2,7 A com uma tensão de 5 Volts. No que diz respeito ao teste de utilização continuado, pudemos notar um leve aquecimento dos motores de passo, bem como da fonte de alimentação, pois a os motores estavam operando próximos à sua máxima capacidade. Como sugestões para projetos futuros, indicamos a criação de um software em linguagem de alto nível (Visual Basic ou Delphi), que possa mapear as rotas e gerar o código assembler para o microcontrolador. Através de um desenho em AutoCad ou
Microstation poderíamos criar as rotas e o software faria o cálculo da quantidade passos a ser dada pelos motores, gerando o código de máquina automaticamente.
Fotos do Robô
Referências [1] Controle de um elevador http://www.lami.pucpr.br/~afonso/graduacao/projetosintegrados/ 2003-1/ElevadorXY/ projeto_elevador.htm [2] Controle de um braço mecânico http://www.geocities.yahoo.com.br/gedaepage/ projetos/brac_meca.htm [3] Projeto da Universidade Federal de Minas Gerais Robô microcontrolado http://www.ufmg.br/prpq/xisic/sic2002/resumos/5w15w59.html [4] Fabricante de motores de passo http://www.syncro.com.br/ [5] Fabricante de microcontroladores ATMEL http://www.atmel.com/ [6] Fabricante de Displays LCD http://www.hitachi.com/ [7] Fabricante de microcontroladores PIC http://www.microchip.com/ [8] Software para compilação e depuração em shareware. www.keil.com [9] Site do fabricante dos CI S reguladores de tensão www.national.com [10] Site do fabricante dos transistores TIP 121 www.fairchildsemi.com Bibliografia [1] Aplicações Práticas do Microcontrolador 8051-11ª Edição Autor: Vidal Pereira da Silva Jr.
Editora Érica [2] Microcontrolador 8051 - Detalhado - 3ª Edição Autor(es): Denys Emílio Campion Nicolosi Editora Èrica