terça-feira, 11 de dezembro de 2012

Motor de passo como gerador elétrico


Aqui uma pequena experiência para testar o desempenho de um motor de passo como gerador elétrico. Uma bateria de 12 volts alimenta um pequeno motor DC. O motorzinho força o motor de passo a girar e isso induz uma corrente elétrica nas bobinas do motor de passo. O motor de passo usado é bipolar e tem duas bobinas independentes (4 fios). A corrente induzida nas bobinas do motor de passo é alternada, então na saída de cada bobina foi colocada uma ponte retificadora de diodos e um capacitor de tântalo para estabilizar a voltagem. Depois que a corrente é retificada e a voltagem estabilizada, a saída das duas bobinas se juntam e essa é a saída do nosso gerador. É nessa saída que está conectado o multímetro medindo a voltagem de saída.

Conclusão: motores de passo são geradores bem razoáveis.

Possíveis melhoramentos: Utilizar diodos de germânio para diminuir a queda de voltagem da ponte retificadora.

A fazer: conectar um motor DC na saída para medir a corrente fornecida pelo gerador e fazer uma comparação entre potência fornecida e potência obtida.


terça-feira, 4 de dezembro de 2012

Bobinas e eletro-imãs, como fazer na prática


Ultimamente ando fazendo algumas experiências com bobinas e eletro-imãs, se tudo der certo depois eu posto o projeto aqui. E fazendo essas experiências, descobri como é difícil achar bobinas e eletro-imãs nas medidas que o projeto precisa. Depois de não achar nada aproveitável na sucata e nem achar pra comprar nas lojas de eletrônica, decidi que o jeito é fazer eu mesmo, afinal teoricamente um eletro-ímã é só um fio enrolado em uma barra de ferro doce, não é? O que pode ser mais simples que isso?

Se perguntar pro tio Google como se faz um eletro-imã, ele vai dizer que é simples e fácil e vai indicar dezenas de páginas ensinando a enrolar um fio elétrico em um prego enorme, ligar duas pilhas nele e então, voilá!!! Você agora tem um eletro-imã capaz de segurar um ou dois clipes de papel! Viu como é fácil? O único problema é que isso não adianta nada pro meu projeto. Não quero por pregos de construção no meu projeto e quero um eletro-imã capaz de segurar um pouco mais do que um par de clipes. Então como fazer?

O núcleo

Teoricamente você pode construir um eletro-imã sem núcleo, ou melhor, com núcleo de ar. Mas na pratica isso não é nem um pouco prático. Um núcleo metálico faz uma diferença tão brutal no desempenho de um eletro-imã que você não vai querer abrir mão dele.

Ferrite
Claro que a melhor opção para o núcleo é o ferrite, afinal ele é feito para isso e é uma liga com um custo muito baixo. Difícil é achar pra vender barras ou carretéis de ferrite nas medidas necessárias. Nem perca seu tempo procurando em lojas de eletrônica. Se resolver usar ferrite, vá direto para o Google. Tem diversos fabricantes no Brasil, difícil é achar um que venda em pequenas quantidades, normalmente os fabricantes de ferrite fornecem para empresas, não para clientes finais.

Parafusos com porcas
Essa é uma opção bastante prática e barata. Parafusos de diversos comprimentos e diâmetros são facilmente encontrados e lojas de ferramentas e em sucatas. Além disso, um eletro-imã feito com um parafuso é facilmente fixado em sua posição final, afinal, é pra isso que serve um parafuso, não é? Arruelas pode ser usadas para limitar o enrolamento criando uma espécie de carretel com o parafuso.

Extremamente importante: Parafusos não são feitos sempre de ferro ou de material ferromagnético e isso é essencial para o núcleo de um eletro-imã. Quando for escolher um parafuso para o seu projeto, tenha um pequeno imã à mão para testar se o parafuso é de material ferromagnético. Quanto maior for a atração entre o imã e o parafuso, melhor. Uma atração fraca significa que é feito de uma liga com pouco metal ferromagnético, nesse caso vai ser pouco eficiente. Se o parafuso não for atraído pelo imã, esqueça, ele não serve como núcleo.

Parafusos para encadernação
Esta foi a minha escolha para o projeto em andamento por aqui. Na verdade não sei o nome dessas coisinhas, mas são usadas para encadernação e são facilmente encontradas em papelarias por um preço bem baixo. O diâmetro é fixo, 5mm, mas o comprimento varia desde 5mm até 150mm ou mais. O diferencial destes parafusos com certeza é a estética, nesse quesito é imbatível. Mas aqui vale também o mesmo aviso do item anterior sobre material: pode ser que o material não seja ferromagnético e isso precisa ser testado antes de sair comprando, leve um imã.

Pregos
Bem, não tem muito o que dizer, desde que sejam de ferro, eles funcionam como núcleo. A estética não é grande cois e deixa o projeto com cara de feira de ciências. E a não ser que ele seja martelado, não é muito fácil fixar o eletro-imã em sua posição final, já que prego não tem rosca, mas também é uma opção.

O enrolamento

Uma vez escolhido o núcleo, o que falta é enrolar o fio e aí aparecem algumas questões. Que tipo de fio usar? Quantas voltas? É melhor usar fio mais fino ou fio mais grosso?

Tipo do fio
Em primeiro lugar esqueça os fios com isolamento plástico. O isolamento plástico é grosso demais, faz com que as espiras fiquem muito separadas e isso definitivamente compromete o resultado. O fio próprio para isso é o fio esmaltado usado no enrolamento de transformadores e motores elétricos. O esmalte proporciona um isolamento adequado e não aumenta significativamente o diâmetro do fio. Quanto mais próximas ficarem as espiras umas das outras, melhor.

Diâmetro do fio
Quanto menor for o diâmetro do fio, mais próximas ficarão as espiras e isso é bom. Maior vai ser a resistência do fio e isso é ruim. Além disso é preciso considerar quanto de corrente se pretende aplicar à bobina, fios muito finos não suportam correntes altas. Finalmente tem também o aspecto prático, se você pretende enrolar a bobina de forma caseira, o fio tem que ter diâmetro suficiente para ser manipulado sem quebrar.

Onde obter fio esmaltado
A solução obvia é retirar de transformadores e motores sucateados, isso pode dar certo, mas é preciso atentar para alguns detalhes. O esmalte dos fios tende a ficar quebradiço com o tempo e com o calor. Se o transformador ou motor costumava esquentar quando estava em uso, provavelmente o esmalte do enrolamento ficou quebradiço e vai ser difícil desenrolar sem perder o isolamento.
A melhor opção é comprar o fio novo, não é caro, só é difícil de achar. Lojas de eletrônica dificilmente vendem esse tipo de fio, mas podem ser encontrados em estabelecimentos que vendem artigos para motores elétricos industriais.

Quantas voltas
Como regra geral, quanto mais voltas melhor. Mas tem algumas coisas a considerar. Não adianta muito espalhar essas voltas por um comprimento muito longo, o ganho na potência do eletro-imã vai ser pouco, melhor fazer uma bobina mais curta e com várias camadas de espiras. Também tem que ser levado em conta que quanto mais voltas, maior vai ser o comprimento do fio e isso aumenta a resistência. Outro detalhe é que quanto mais externa é a camada de espiras, menos eficiente ela é. As espiras mais próximas do núcleo influem muito mais na intensidade do campo magnético final do que as espiras mais afastadas, então a partir de certo ponto acrescentar mais camadas não compensa por conta do aumento na resistência. E finalmente, todo material ferromagnético tem um limite de magnetização. Depois de atingido esse limite não adianta acrescentar mais corrente ou mais espiras.

domingo, 25 de novembro de 2012

Imãs de Terras Raras

O nome impressiona e pode dar a impressão de que são imãs naturais extraídos de minas secretas de países exóticos, mas não é nada disso. São imãs artificiais extremamente fortes feitos com uma liga de Neodymium (Nd), Ferro (Fe) e Boro (B). Essa tecnologia de imãs existe desde 1996, mas só nos últimos anos começou a ficar comercialmente viável para produção em escala, então eles estão ficando mais baratos e extremamente comuns para imãs de terras raras.


De onde vem o nome "terras raras"


Terras raras é uma família de elementos na tabela periódica, também conhecida como Lantanídeos, porque todos eles tem características semelhantes às do lantânio. By the way, os lantanídeos não tem nada de raros, na verdade são até bem comuns na natureza mas não em forma pura, precisam ser separados de outros compostos.




Temperatura de Curie


Desde a década de 1970 que já se sabe que alguns lantanídeos tem uma capacidade de magnetização muito maior do que os imãs comuns, feitos de ferrite ou cerâmica. Mas todo imã, raro ou não, tem a sua temperatura de Curie, que é a temperatura em que um imã perde suas propriedades magnéticas e passa a ser apenas um pedaço de metal ou de cerâmica. O problema dos lantanídeos é que a temperatura de Curie deles é menor que a temperatura ambiente, então para que funcionem como imãs precisam estar em ambientes refrigerados. Claro que isso limita muito as aplicações.


É justamente para aumentar a temperatura de Curie das terras raras que são acrescentados ferro, níquel ou cobalto. O resultado é um imã extremamente poderoso e com uma temperatura de Curie relativamente alta, atualmente algo em torno de 400° celcius para os de neodymium.



Evolução


A primeira geração dos imãs de terras raras usava uma liga de cobalto e samarium. Não ficou muito popular porque é uma liga muito cara e com menor capacidade de magnetização do que a liga de neodymium e ferro usada atualmente. Mas como vantagem, a temperatura de Curie da liga de samarium-cobalto chega a 800°C, então continua tendo a sua utilidade em nichos específicos.


A liga de neodymium, ferro e boro é muito mais barata, tem uma capacidade de magnetização pelo menos 20% maior que a liga de samarium e maior
coercitividade, o que significa que é mais difícil de ser desmagnetizado (campo magnético mais estável). Mas além da baixa temperatura de Curie, uma outra desvantagem da liga de neodymium/ferro é que é mais vulnerável à oxidação, então para proteger o imã é necessário um banho com um outro metal como zinco, níquel e eventualmente até com prata e ouro. 


O imã da foto acima tem cerca de 25mm de diametro e 12mm de altura, mas um deles sozinho consegue segurar quase 25 kg de peso. A especificações dele
estão aqui.

 

 Comparação


Eu não vou nem tentar falar das unidades dos números da tabela abaixo, mas dá pra fazer uma comparação do desempenho de alguns tipos de imãs (fonte: Wikipedia):



Tipo Força Coercitividade Densidade Temp Curie
Nd2Fe14B (neodymium) 1.0–1.4 750–2000 200–440 80–400
SmCo5 (samarium) 0.8–1.1 600–2000 120–200 720
Sm(Co,Fe,Cu,Zr)7 (samarium) 0.9–1.15 450–1300 150–240 800
Alnico (ferro, alumínio, niquel e cobalto) 0.6–1.4 275 10–88 700–860
Ferrite 0.2–0.4 100–300 10–40 450


Grades

Os imãs de terras raras são classificados em grades. Essa classificação tem a ver com a composição exata da liga de neodymium, mas o que importa é que quanto maior a grade, mais forte é o imã. Normalmente ela é indicada logo após a letra ´N´. A menor grade que vi nas minhas navegações é N33, então se a grade não estiver indicada deve ser algo por aí. Por um preço relativamente acessível, é fácil achar imãs com grade N45 ou N48, mas estão em produção imãs com grade de até N52. Em teoria, a grade máxima que os imãs de neodymium podem alcançar é N64, mas os engenheiros acham que na prática o que dá pra conseguir é N60, então isso está sendo pesquisado atualmente, existe uma espécie de corrida entre os fabricantes para conseguir o imã com grade N60.


Riscos

Imãs de terras raras, especialmente com grade acima de N40 são extremamente perigosos. Um par de imãs colocados próximos vai se atrair com extrema violência e conforme o caso podem se espatifar e literalmente explodir mandando pedaços para todo lado feito uma granada. A resistência mecânica destes imãs é bem baixa, eles são muito frágeis. Mas apesar disso são pesados e podem machucar bastante pessoas e animais que se colocarem entre os campos magnéticos de um par deles. Pares de imãs podem se atrair de distâncias incrivelmente longas. Já houve casos de ossos quebrados. Acidentes com cortes nos dedos também são muito comuns.

Computadores, laptops, celulares, monitores, cartões de crédito, etc. Todo esse povo tem que ficar muito distante de imãs de terras raras. O campo magnético de um pode facilmente inutilizar um hd de computador ou de laptop, apagar cartões e bagunçar celulares.



Links:

Campo magnético:
http://pt.wikipedia.org/wiki/Campo_magn%C3%A9tico


Imãs de terras raras:

(em inglês): http://en.wikipedia.org/wiki/Rare-earth_magnet
(portugues): http://pt.wikipedia.org/wiki/%C3%8Dm%C3%A3_de_neod%C3%ADmio

Neodímio:

http://pt.wikipedia.org/wiki/Neod%C3%ADmio

Glossário com os principais conceitos relacionados a imãs de
neodymium (em inglês):

 http://www.kjmagnetics.com/neomaginfo.asp
http://apexmagnets.com/index.php?main_page=page&id=3

FAQ muito bom:

http://apexmagnets.com/index.php?main_page=faq

Sobre temperatura de operação:

http://www.kjmagnetics.com/blog.asp?p=temperature-and-neodymium-magnets

Grades:

http://www.kjmagnetics.com/blog.asp?p=magnet-grade



quarta-feira, 24 de outubro de 2012

Meu baby finalmente wireless graças ao Wixel

Robit
Faz tempo que não posto nada aqui, mas não parei de trabalhar nos meus projetos. A ideia sempre foi fazer robôs de baixo custo e "made in home", comprar um kit pronto eu nem levo em consideração. E aos poucos estou fazendo alguns progressos. Esse robozinho da foto começou com o projeto que descrevi em Tutorial: Robô simples com sucata. E como o nome diz, era bem simples. Os pulsos para os motores de passo eram gerados pelo computador através de timers e iam praticamente direto para os motores de passo pela porta paralela. Tudo bem simples, o maior desafio foi soldar o conector para o (pesadão) cabo paralelo com todos os seus 25 pinos um quase encostando no outro.

Figura 2 - PicStamp da Grande Ideia Studio

 Mas depois ele evoluiu. Graças ao Prof. Mário Guimarães da Grande Ideia Stúdio que gentilmente forneceu um PicStamp 1 (figura 2) para algumas experiências. O PicStamp é uma plaquinha com um conector USB e um microcontrolador PIC 18F2550 já com o cristal e todos os componentes necessários que um microcontrolador exige. Dois arrays de pinos na parte de baixo da placa facilitam muito a instalação (e remoção) do PIC no dispositivo que será controlado. É um microcontrolador extremamente poderoso e cheio de recursos. Com essa plaquinha meu robozito deu adeus à porta paralela e passou a usar a porta USB. Muito mais rápida, com um cabo muito mais fino e mais leve (figura 3).


Figura 3 - Robô usando o PicStamp para comunicação via USB


Mas um cabo mais fino e mais leve, continua sendo um cabo. E um cabo amarra o robô ao computador, ele não fica livre pra explorar o mundo com suas próprias rodas. Então continuei procurando opções, de baixo custo, evidentemente. E aí topei com o Wixel (figura 3). Do mesmo modo que o PicStamp, o Wixel também tem um microcontrolador em uma plaquinha, já com o cristal e os arrays de pinos na parte de baixo. Mas com uma diferença fundamental, ele é também um transceptor (transmissor e receptor) de RF. Um par de wixels permite estabelecer uma comunicação direta sem fio entre os dois. Com mais de dois é possivel fazer uma rede. O microcontrolador embutido nele também não é pouca coisa, roda a 24Mhz, oferece 29k de memória flash disponível para o programa (de um total de 32k) e (quase) 4k de memória RAM, além de dispor de 15 pinos de IO (6 podem ser configurados para entrada analógica) e de quebra oferece 4 timers, sendo um de 16 bits e três de 8 bits. Dá pra brincar bastante com ele.
Figura 3 - Wixel


Ok, tudo isso é muito bom, mas e o custo? Afinal o propósito deste projeto é fazer robôs de baixo custo. Em uma palavra: barato. Uma plaquinha já pronta custa US$ 20,95, o que dá uns 42 reais. Um joguinho com dois wixels e o cabo USB sai por US$ 41,95. Ponha mais US$ 11,00 pelo envio e com pouco mais de 100 reais vc tem o conjunto. Muito mais barato que as outras opções de wireless como o Zig-Bee ou o Bluetooth. E fica melhor quando a gente considera que além de transceptor ele tem também um microcontrolador programável. O problema do wixel é que o alcance não é grande coisa. Em situaçoes ideais (e os astros favoráveis e ventos a favor), chega a 15 metros, mas situações ideais são ideais porque não são reais, então na prática não espere mais do uns 10 metros. Mesmo assim, 10 metros é bem melhor do que 1,80m do cabo USB.

Pra quem se interessar em obter um par, uma dica importante: se não quiser ser extorquido pelo governo, de maneira nenhuma use o Fedex  pra importar o Wixel. Caí nessa besteira uma vez. Chegou em 3 dias, rapidinho, mas aí tive que desenbolsar R$ 111,00 de IMPOSTO pelo conjunto que me custou R$ 85,00, o imposto é mais caro que o produto... Só no Brasil mesmo. Se optar pelo correio e o total da compra não ultrapassar US$ 50,00, aí demora pra chegar, mas não tem imposto. E pra aproveitar o envio sem passar dos 50 dólares, sugiro encomendar na mesma compra um ou dois pacotinhos de jumpers macho-macho. São muito úteis pra testar o wixel em uma proto-board, ou vc pode usar em uma plaquinha própria para o wixel como essa que eu fiz aí na foto abaixo.

Figura 5 - Placa de teste caseira para o Wixel

terça-feira, 20 de março de 2012

Medindo distâncias com um laser - 1

Como citei no post anterior, adquiri a câmera com a intenção de tentar implementar, ou pelo menos pesquisar técnicas de navegação por imagens. Por alguns problemas técnicos (muito consumo de energia e muito peso) não posso instalar a câmera no meu robô, mas isso não me impede de fazer algumas experiências. E uma ideia que eu já tinha bem antes de comprar a câmera é usar um ponto de laser para medir distâncias. Se não contarmos com o custo da câmera, que afinal tem outras utilidades também, essa talvez seja a  forma mais barata de medir distâncias para um robô. Canetinhas laser podem ser adquiridas em camelôs e lojas de quinquilharias por preços que variam de R$ 3,00 a R$ 10,00.

Então comprei uma canetinha laser, desmontei e comecei a fazer a adaptação. Tem vários modelos disponíveis, esse que comprei além do laser, também tem dois leds, um de alto brilho pra funcionar como lanterna e outro que, se formos acreditar no vendedor, serve pra detectar dinheiro falso (!). Não tenho nenhuma nota falsa (que eu saiba) pra testar o led, mas descobri algo bem interessante sobre ele. A luz que ele emite está bem no limite do ultra-violeta, na verdade só uma pequena parte da luz dele é visível, a maior parte está logo acima do limite de frequências que nossos olhos conseguem captar, então só enxergamos uma fraca luz azulada, mas as câmeras normalmente captam uma faixa de frequências ligeiramente maior que os nossos olhos então para a câmera, esse led ilumina muito mais do que o outro que emite luz visível. Vai ser útil em outro projeto. Abaixo uma foto do laser enquanto estava inteiro.

Figura 1 - Laser tipo chaveiro usado no projeto
O próximo passo é desmontar o laser e nessa fase é preciso tomar muito cuidado para não estragar o equipamento. O laser é montado em uma plaquinha já com a lente adaptada à placa. É importante que a lente não seja separada da placa, ou o laser fica inutilizado e o projeto termina aí.

Figura 2- Laser desmontado
Conforme o tipo do laser, a plaquinha vai ter também um ou dois botões e no caso deste tinha também dois leds. O ideal é remover tudo isso, com muito cuidado. Perto da lente, tem um resistor SMD, daqueles minúsculos. É importante que ele não seja removido, ele é necessário pra proteger o laser. A figura 3 mostra  a placa do laser já com os botões e os leds removidos.

Figura 4 - Placa do laser com os botões e leds removidos
A seguir é preciso descobrir dois pontos na plaquinha pra ligar a alimentação. Um dos buracos onde ficavam os contatos do botão que liga/desliga o laser é um deles. O outro ponto provavelmente é a carcaça da lente, mas deve ter algum lugar na placa conectado à carcaça que pode ser usado para soldar o fio de alimentação. Use as próprias baterias do laser pra testar. Conecte-as com uma fita adesiva e ponha fios nos dois polos para ir testando até fazer o laser acender. Depois que descobrir os pontos para alimentação, solde dois pedaços de fio rígido de aproximadamente 1,5 cm cada. Estes fios serão soldados em um pedaço de placa padrão, aquela cheia de furinhos.  Nessa placa será colocado o borne para ligar a alimentação, e pra garantir coloquei também dois diodos. No caso, o laser funciona com 4,5 volts, mas a saída da câmera chega quase a 6 volts, então os diodos além de dar alguma proteção contra inversão de polaridade, também servem pra provocar uma queda de tensão e deixar a alimentação dentro do limite para o laser. É interessante deixar um espaço reservado para um parafuso de 3mm na placa padrão para facilitar a fixação do laser.

 
Figura 5 - Laser montado em uma placa padrão

quarta-feira, 29 de fevereiro de 2012

Impressões sobre a Câmera IP Feasso F-IPCam01

Ha uma semana finalmente comprei uma câmera IP wireless, coisa que eu estava querendo a muito tempo.  É um lançamento recente da marca Feasso, modelo F-IPCAM01, brinquedinho bem legal, ela tem pan-tilt, consegue girar 270 graus na horizontal, quase 90 na vertical e vem com um programa de controle que pra falar a verdade nem tive a curiosidade de instalar pra ver como é.

E aí tive boas e más surpresas. Minha intenção era tentar instalar a câmera no meu robozinho e tentar algo com navegação por imagens, mas assim que vi a fonte dela já percebi que não ia dar. A fonte fornece 2 amperes pra câmera, alimentar isso com baterias é complicado, a não ser que eu faça outro robô bem mais parrudo que o atual. Com o que eu tenho não tem jeito mesmo.

A outra decepção, mas que eu já meio que esperava, é que em lugar nenhum, nem no manual, nem no CD ou no site tem qualquer referência aos comandos que a câmera aceita, cheguei até a mandar um email pro representante da Feasso no Brasil, e adivinha... nenhuma resposta. As vezes eu acho que alguns fabricantes de hardware têm titica de galinha na cabeça, fazem um equipamento cheio dos recursos e não dizem como usar esses recursos em aplicações, será que não passa pela cabeça deles que se os programadores conseguirem desenvolver aplicações para o equipamento deles isso incentivaria a venda desses produtos? Ou eles têm tão pouca imaginação que pensam que o programa que vem junto com a câmera atende todas as aplicações possíveis para o equipamento?

Mas felizmente a câmera tem dentro dela algumas páginas web que permitem controlar boa parte dos recursos e com a ajuda do Google Chrome não foi difícil interceptar toda a comunicação entre a página e a câmera, no fim acabei descobrindo quase todos os comandos da câmera. Que felicidade... Imediatamente fiz uma aplicaçãozinha em delphi pra testar o controle da câmera e consegui que ela fizesse todo tipo de movimento.

E aí a outra decepção, pra isso ser útil em um robô, não adianta apenas poder mover a câmera, é preciso poder também quantificar esse movimento e isso a câmera não faz. Não tem como você dizer pra ela girar tantos graus e a câmera também não diz quantos graus ela girou. Na verdade, não tem nenhuma precisão nos movimentos dela, mas afinal de contas é uma câmera de segurança, não foi feita pra robôs.

Ela tem três tipos básicos de movimento: patrulha, linear e por passo, e cada um desses tipos tem opções em todas as direções. Na patrulha ela fica repetindo o mesmo movimento esquerda-direita, pra cima pra baixo sem parar. No movimento linear, você manda ela ir pra alguma direção e ela vai, até chegar no fim de curso e para. No movimento por passo, ela vai pra alguma direção em passos, cada comando faz ela mover um pouco naquela direção. Até que seria útil se os passos fossem sempre iguais movendo sempre o mesmo angulo, mas não é assim, é uma coisa meio aleatória quantos graus cada passo gira a câmera.

Mas também tive boas surpresas com a câmera. Ela tem uma saída de 5 volts que serve pra ativar algum alarme caso a câmera detecte movimento e é possível enviar comandos pra ativar ou desativar essa saída. É claro que não tenho nenhuma intenção de usar alarmes com a câmera, mas uma saída de 5 volts que pode ser ligada e desligada via programa é extremamente útil e me animou a implementar uma idéia que eu já tinha a algum tempo: de instalar um laser na câmera pra medir distâncias. E olha só... Funcionou... e com um laser comprado em camelô por 6 reais... No próximo post falo sobre esse projeto. Abaixo uma foto de como ficou.


sexta-feira, 24 de fevereiro de 2012

Download do tutorial de robô usando sucata

Acabo de colocar a versão PDF do tutorial para download no meu SkyDrive, então quem estiver interessado pode baixar ou visualizar o tutorial completo clicando aqui. É um projeto aberto. Sugestões, críticas e principalmente colaborações para incrementar o tutorial serão bem vindas. Pretendo fazer revisão periódicas do tutorial acrescentando mais informações, circuitos, técnicas, etc. Mas sempre dentro da proposta de usar de preferência material extraído de sucata e/ou de baixo custo e indicar técnicas caseiras e baratas para resolver problemas comuns no estudo da robótica. 

sábado, 18 de fevereiro de 2012

PIC ou Arduíno?

Desde que iniciei o projeto do robozinho controlado por porta paralela, já venho imaginando que a próxima versão vai usar um microcontrolador. E de lá pra cá estou tentando resolver em qual microcontrolador vale a pena investir. Percebi que a disputa hoje está entre PIC e Arduíno, não tenho visto muita gente falando do 8051, então imagino que atualmente ele não faça muito sucesso entre os entusiastas da robótica. Deve ter alguma boa razão pra isso. Vi muitos sites comparando o PIC com o ATmega usado no Arduíno, mas senti que dificilmente vou conseguir uma opinião isenta, os dois lados têm defensores ardorosos e com argumentos bem convincentes.

Sem dúvida o PIC 18F2550 e seu irmão mais cheio de pernas o 18F4550, são mais rápidos  e tem mais memória do que o ATmega168 e o ATmega368 que são os mais comuns nas placas Arduíno. Mas o Arduíno com certeza tem mais documentação disponível e acessível para os pobres mortais que querem iniciar na programação de microcontroladores. Também pesa o fato de ter compiladores freeware de melhor qualidade (penso eu) e uma grande biblioteca de funções disponível para programação, visto que é uma plataforma aberta.

Mas ser uma plataforma aberta não significa que é barato desenvolver dispositivos com o ATmega. A placa do padrão Arduíno realmente facilita muito o desenvolvimento de protótipos, mas parece que para por aí. Tem centenas de shields no mercado para encaixar no Arduíno e geralmente a documentação se limita a dizer qual pino encaixa aonde, mas e daí? Da maneira que eu vejo, isso serve pra testar o circuito, ver se tudo vai dar certo e se for o caso fazer as correções necessárias. Mas finalizados os testes, quero poder montar o dispositivo final da maneira mais compacta e econômica possível. Não quero gastar uma placa Arduíno e vários shields para cada dispositivo que eu for montar, isso não faz muito sentido. Afinal uma placa padrão Arduíno custa entre R$ 120,00 e R$ 250,00 conforme o tipo e os shields, bom, tem de todos os preços, mas nunca são baratos. Um microcontrolador, que no final é o que importa, não chega a R$ 20,00 e os sensores usados nos shields também são muito mais em conta quando comprados separadamente fora dos shields. Nas minhas navegações não tenho visto muitos circuitos usando o ATmega fora da placa Arduíno. Já para o PIC, uma rápida prece ao Santo Google retorna dúzias de circuitos usando o microcontrolador e sensores variados sem placas pré-montadas (e caras).

Então até o momento, estou inclinado a investir no PIC.

sexta-feira, 17 de fevereiro de 2012

Apêndice - Duplicando polias e engrenagens

Quem se envolve com robótica, cedo ou tarde acaba precisando usar polias e engrenagens. E aí descobre que é extremamente difícil encontrar em sucatas de impressoras e outros equipamentos eletrônicos, polias e engrenagens nas medidas e quantidades necessárias para o projeto em execução. Um robô que se movimenta usando rodas ou esteiras e usa sistema de direção diferencial, precisa que  todo o sistema de movimento seja duplicado. Vai ser necessário conseguir dois motores iguais e dois conjuntos de engrenagens/polias iguais para que o movimento possa ser controlado adequadamente. Uma situação comum é encontrar uma engrenagem/polia que seria perfeita para o projeto se fosse possível conseguir outra igual, mas isso nem sempre é possível e nesse caso, a solução é duplicá-la. Outra situação comum é encontrar uma engrenagem com o diâmetro e tamanho de dentes corretos, mas com o furo do meio na medida errada para o projeto.

A boa notícia é que é possível duplicar uma engrenagem com materiais de baixo custo e sem envolver equipamentos caros. Em resumo, a duplicação de uma engrenagem envolve fazer um molde com a engrenagem disponível e depois preencher o molde com resina. Eventualmente pode ser necessário modificar o tamanho do furo central. Nesta seção abordaremos as técnicas para duplicar engrenagens e polias.

O silicone líquido

Em primeiro lugar é preciso conseguir um material para fazer o molde. Para isso a melhor opção é o silicone líquido. Este tipo de silicone é vendido com um endurecedor que deve ser misturado ao silicone nas proporções indicadas. Depois de algum tempo o silicone endurece e se transforma em uma borracha flexível. O silicone pode ser encontrado em casas que vendem materiais para artesanato e/ou pintura artística, também não é difícil de encontrar para venda on-line pela internet. Neste caso, faça buscas por “borracha de silicone” ou “silicone líquido”. A cor do silicone indica a sua dureza (ou flexibilidade) depois de curado. Os mais indicados para moldar engrenagens são o branco e o azul. Existem também silicones capazes de suportar alguns metais derretidos (silicone vermelho ou marrom), mas são bem mais caros. O silicone azul utilizado neste projeto pode ser encontrado por um preço que varia de R$ 22,00 a R$ 30,00 o litro (preços de 2011). Um litro é suficiente para fazer vários moldes, considerando que cada molde usa cerca de 100 ml de silicone. A figura 34 mostra o silicone utilizado neste projeto.



Figura 34: Silicone líquido azul e endurecedor

O molde

Para fazer o molde, consiga um recipiente de plástico não muito fino. Um plástico muito fino pode deformar e atrapalhar a modelagem. Também é importante que tenha o fundo plano. Recipientes de plástico com tamanhos e espessuras variadas podem ser encontrados facilmente em lojas de materiais para festas.

Para conseguir engrenagens de boa qualidade, também vai ser necessário dispor de uma superfície bem nivelada. Uma boa dica é fazer uma mesa niveladora. É bem simples e evita vários problemas depois. Pode ser feita com um pedaço de madeira lisa e quatro parafusos com suas respectivas porcas. Faça furos nos cantos da madeira no diâmetro dos parafusos e fixe as porcas alinhadas com os furos. Assim os parafusos podem ser rosqueados para cima e para baixo até que a madeira fique bem nivelada. A figura 35 mostra a mesa niveladora feita para este projeto. 

Figura 35: Mesa niveladora

Use uma fita adesiva dupla face para fixar a engrenagem no fundo do recipiente plástico (figura 36). Fitas bem finas dão um resultado melhor, existe uma fita dupla face de borracha que é usada para fixar quadros na parede, essa não é indicada porque é muito grossa e cria sulcos no molde que acabam atrapalhando a modelagem. O outro tipo de fita é uma fita adesiva comum com adesivo dos dois lados, pode ser facilmente encontrada em papelarias e é bem mais barata.  

Figura 36: Recipiente para o molde com a engrenagem fixada no fundo
Antes de preparar a mistura do silicone determine a quantidade necessária para fazer um molde com aproximadamente 1,5 cm de espessura, para isso apenas despeje água no recipiente até ter 1,5 cm de água no fundo e depois verifique quantos ml de água foram utilizados. Para o recipiente que foi usado neste projeto, 100 ml foi a medida ideal. Na mesma loja onde foi comprado o recipiente para o molde, também foi possível encontrar copinhos descartáveis de 100 ml e palitos de sorvete para misturar o silicone.

Dica: Se o silicone ficou algum tempo armazenado, o que com certeza é o caso quando você acaba de comprar um pote, ele tende a se depositar no fundo do pote. Antes de usar, é uma boa idéia misturar misturar bem o silicone com um pedaço de madeira para deixa-lo mais homogêneo, inclusive raspando bem o fundo do pote, você vai perceber que o silicone no fundo do pote é muito mais denso que o que está na superfície.
Depois de fixar a engrenagem no fundo do recipiente, coloque-o em uma superfície nivelada ou na mesa niveladora e faça a mistura do silicone com o endurecedor. Para o silicone usado neste projeto, a medida que deu melhores resultados foi duas tampinhas de endurecedor para 100 ml de silicone. É preciso cuidado para não produzir muitas bolhas no silicone enquanto estiver misturando, fazendo movimentos lentos e suaves. Também é importante misturar bem o silicone com o endurecedor, raspando as laterais e o fundo do copinho para misturar o silicone que fica aderido às paredes do recipiente. Depois de misturado, algumas pancadinhas no fundo do copinho ajudam a fazer subir as bolhas que estiverem no silicone. Essa operação não deve demorar mais do que dois minutos, depois de misturado com o endurecedor, o silicone começa a endurecer rápido e é importante que ele seja despejado no molde enquanto ainda está bem líquido para que forme uma superfície nivelada na parte de cima. 

Dica: Depois de despejar o silicone no copinho medida e antes de misturar o endurecedor (perceberam que eu negritei, inclinei e sublinhei a palavra antes né?), deixar o copinho descansar por alguns minutos vai fazer com que boa parte das bolhas que estiverem la dentro subam e estourem na superfície.

Despeje o silicone no recipiente de plástico e espere cerca de 3 horas para retirar o molde do recipiente e a engrenagem do molde (Figura 37). A cura completa só acontece depois de 24 horas. É aconselhável esperar a cura completa antes de usar a resina no molde ou ela pode aderir ao silicone, outra opção é usar algum desmoldante. Um desmoldante é uma substancia, geralmente em spray, que é colocada no molde para que a resina não grude nele. Existe um óleo de silicone em spray que é próprio para isso e é facilmente encontrado em lojas de ferramentas.

Importante: Não use recipientes de vidro para fazer o molde. O silicone adere ao vidro. 

Figura 37: Silicone no recipiente esperando a secagem

Depois de seco, o silicone forma uma borda ligeiramente levantada devido à tensão superficial que existe enquanto está líquido. Essa borda deve ser retirada para garantir que o molde fique bem nivelado quando for colocada a resina. Com uma tesoura, corte as bordas conforme mostrado na figura 38. 

Figura 38: Bordas sendo cortadas para garantir bom nivelamento do molde
Figura 39: O molde depois de pronto

A resina

Durante o desenvolvimento deste projeto foram testados vários tipos de resina. A mais fácil de conseguir é a resina de poliéster pré-acelerada. Essa resina é utilizada para fazer peças de fibra de vidro, então pode ser encontrada em qualquer loja de tintas e é bem barata. Mas infelizmente não serve para fazer engrenagens. Depois que seca apresenta uma retração bem significativa o que acaba alterando o diâmetro da peça. Além disso, a resistência mecânica dela é baixa, uma engrenagem feita com essa resina nem pôde ser testada porque caiu no chão e quebrou.

Também foi feito um teste com acrílico em pó auto-polimerizante, material utilizado pelos dentistas para fazer próteses. Este material é um pouco mais caro e mais difícil de encontrar já que só é encontrado em casas especializadas em materiais para dentistas. Tem uma excelente resistência mecânica e não tem o problema da retração como a resina de poliéster. O problema do acrílico em pó é que depois misturado com o líquido ele se transforma em uma pasta bastante densa e é difícil colocar a pasta no molde de borracha, preenchendo todos os detalhes sem deformar o molde que é bem flexível. Também é possível colocar diretamente o pó no molde e depois gotejar o líquido sobre ele. O problema dessa técnica é garantir que o líquido se espalhe por todo o pó de maneira homogênea. Se uma parte do pó não receber o líquido, não vai endurecer e a engrenagem será inutilizada.

Os melhores resultados foram obtidos com a resina epóxi. Não é uma resina cara (por volta de R$ 40,00 o litro – valores de 2011), tem uma ótima resistência mecânica, não apresenta retração depois de seca e a mistura da resina com o endurecedor forma um líquido com uma viscosidade satisfatória para ser despejado no molde preenchendo todos os detalhes. O único problema é que é difícil encontrar estabelecimentos que vendam essa resina. Como não foi encontrada nos estabelecimentos da cidade, a opção foi comprar pela internet. Existem vários tipos de resina epóxi, o ideal é que seja um tipo com baixa viscosidade.

É preciso muito cuidado ao manipular a resina epóxi. Use jornais velhos para evitar que respingos possam atingir a superfície de trabalho e palitos de sorvete e copinhos descartáveis para fazer a mistura, esta resina depois de seca é extremamente dura e os respingos não saem facilmente.

Uma superfície nivelada também é importante no momento de preencher o molde com a resina, então antes de fazer a mistura coloque o molde na mesa niveladora. A resina epóxi é razoavelmente lenta para secar, demora pelo menos 5 horas para que possa ser retirada do molde, mas só atinge o máximo da sua resistência mecânica depois de 24 horas.

Câmara de secagem

A temperatura e umidade do ar influenciam bastante no processo de cura da resina. O ideal é um ambiente seco e ligeiramente aquecido, isso acelera a secagem e melhora a resistência da engrenagem. Não é difícil fazer uma câmara de secagem para a resina, é basicamente uma caixa de madeira com uma lâmpada incandescente de 40W dentro dela. Na falta de uma caixa de madeira apropriada, uma câmara de secagem usando uma prateleira de armário foi improvisada para este projeto, conforme mostrado na Figura 40.

Resista à tentação de colocar o dedo na resina para verificar se está seca, antes de secar a resina fica em um estado gelatinoso e a pressão do dedo pode deformar a engrenagem. Use as sobras da mistura para deixar uma porção à parte como controle.  

Figura 40: Câmara de secagem improvisada em um armário

O furo central

Se for possível encontrar uma engrenagem que tenha o diâmetro, o tamanho e numero de dentes correto para seu projeto e, além disso, tenha também o furo central na medida correta para o eixo onde a engrenagem será fixada, parabéns, considere-se com sorte. Mas eventualmente acontece de a engrenagem não ter um furo central na medida correta. Se for um furo pequeno e você precisa de um furo maior, talvez seja possível aumentar o furo com uma broca apropriada. Mas se o furo não for tão pequeno assim e você precisar aumentar o tamanho dele, vai acabar descobrindo que é muito difícil aumentar seu diâmetro mantendo o furo exatamente centralizado na engrenagem. E uma engrenagem com o furo fora de centro, mesmo que ligeiramente, fica inutilizada. Uma situação parecida ocorre quando a engrenagem tem um furo maior do que o necessário, nesse caso não há como diminuir o diâmetro dele. A solução, tanto para um caso quanto para o outro, é eliminar o furo e fazer outro.

Para eliminar o furo é bastante simples, basta cortar o pino central do molde e moldar a engrenagem sem o furo, como mostrado na Figura 41. Já para fazer o novo furo é bastante mais complicado, especialmente porque o furo precisa estar muito bem centralizado na engrenagem.  

Figura 41: (a) Molde com o pino central retirado (b) A engrenagem depois de pronta

Esquadro de centrar

O problema de fazer o novo furo é como determinar a posição exata do centro da engrenagem. Existe um tipo de esquadro que é próprio para marcar o centro de uma peça circular, o esquadro de centrar, mas é muito difícil de ser encontrado e costuma ter um preço proibitivo. Felizmente, não é difícil fazer um esquadro de centrar caseiro com um custo muito baixo.

Só é necessário dispor de um esquadro de desenho triangular comum, do tipo com ângulos de 45º e 90º. O primeiro passo é cortar o lado do esquadro que tem os ângulos de 45º (hipotenusa). Em seguida a parte cortada deve ser posicionada e colada de modo que um dos ângulos de 45º divida o ângulo de 90º na metade, conforme mostrado na figura 42.  

Figura 42: (a) Esquadro de desenho cortado (b) Depois de posicionado e colado
Para marcar o centro da engrenagem, posicione-a de modo que suas bordas encostem no ângulo reto interno do esquadro (figura 43) e risque com uma caneta, lápis ou a ponta seca de um compasso, conforme o material da engrenagem. Faça pelo menos três ou quatro riscos. A intersecção entre os riscos marca o centro da engrenagem. Depois quando for furar, fure primeiro com uma broca fina e depois com a broca da medida desejada para o furo.  

Figura 43: (a) Engrenagem posicionada no esquadro (b) Depois de riscada

Links úteis


Aqui alguns links muito bons pra quem quiser se aprofundar mais:

Resina

1) Um breve mas bem completo resumo sobre tipos de resina e suas aplicações e características. Também tem um FAQ com informações bem importantes pra quem quiser fazer peças mais bem acabadas:

http://www.fazfacil.com.br/reforma-construcao/resinas-poliester-epoxi/

Silicone

1) Informações acessíveis e úteis sobre tipos de silicone e suas aplicações:

http://www.fazfacil.com.br/materiais/silicone.html



Índice

2) Visão geral do projeto
3) Fonte de alimentação para testes de bancada
4) A porta paralela
5) Motores de passo
6) Montagem dos circuitos
7) Montagem do robô
8) Alimentação
9) Software de navegação
10) Conclusão
Apêndice - Duplicando polias e engrenagens


    10) Conclusão


    Este trabalho mostra que é possível construir dispositivos robóticos com materiais extraídos de sucata e/ou de baixo custo. Apesar do dispositivo descrito aqui ser bastante simples, nada impede de usar os mesmo conceitos e materiais para criar dispositivos mais sofisticados. O pequeno robô desenvolvido tem os elementos básicos para o estudo da robótica. Envolveu programação, comunicação do computador com um dispositivo externo, eletrônica e a montagem física do hardware.

    O foco no estudo dos motores de passo tem a intenção de divulgar e desmistificar o uso destes motores, provendo o conhecimento básico para que sejam utilizados em outros projetos. É um recurso importantíssimo para o desenvolvimento de dispositivos robóticos e são muito facilmente obtidos em impressoras sucateadas.

    É fato que o robô descrito neste trabalho nada faz além de se mover, mas espera-se que seja considerado pelos estudantes como um ponto de partida para projetos mais elaborados. Por exemplo, poderiam ser instalados sensores que retornem sinais para o computador, a comunicação com o computador poderia ser feita por alguma tecnologia sem fio e utilizando outras portas como a porta COM ou a porta USB, o programa poderia ser melhorado para permitir o armazenamento de rotas pré-programadas, entre muitos outros aprimoramentos que podem ser implementados a partir deste projeto.

    E finalmente gostaria de deixar registrado que é extremamente recompensador ver o resultado de um trabalho ganhar vida e se mover fisicamente pelo mundo real. Ao ver o pequeno robô ganhando a capacidade de movimento é difícil não ter o impulso de fornecer a ele mais habilidades e recursos através de dispositivos, sensores e de uma programação mais elaborada. Às vezes tenho a impressão que encontrar utilidades práticas e acadêmicas para robôs é só um pretexto, e que no fundo o que os pesquisadores e desenvolvedores realmente querem é ver suas criações evoluindo, crescendo e se tornando cada vez mais independentes.
     

    9) Software de navegação


    Tão importante quanto os circuitos e a montagem, é o software que irá controlar os movimentos do robô. A unit ParBib descrita no capítulo 4, foi criada apenas para enviar sinais à porta paralela, mas para que esses sinais se transformem em movimento no robô, eles precisam ser gerados com coerência e sincronia, sendo essa a função do software de navegação.

    Para gerar os sinais de navegação foi desenvolvida uma classe que fornece os recursos básicos de movimentação do robô. A classe TRobotMove declarada dentro da unit RobotMove, permite selecionar entre 9 tipos de movimento, alterar a velocidade e ligar/desligar o modo de alto torque.

    Métodos públicos da classe TRobotMove

    Abaixo segue a declaração da parte pública da classe e uma breve explicação sobre o uso de cada método. O tópico seguinte contém a listagem completa da classe.

    type
      TRobotMove = class
      public
        constructor Create(AOwner: TComponent; LPTPort: TLPT;
                           BaseTm: cardinal);
        destructor Destroy; override;
        procedure Ahead;
        procedure Back;
        procedure Stop;
        procedure Right;
        procedure Left;
        procedure VeryRight;
        procedure VeryLeft;
        procedure SpinRight;
        procedure SpinLeft;
        property PulseTime: cardinal;
        property HiTorq: boolean;
      end;


    constructor Create(AOwner: TComponent; LPTPort: TLPT;
                       BaseTm: cardinal);
    Construtor da classe. Usa os seguintes parâmetros:

    AOwner: Pode ser qualquer componente descendente de TComponent. Normalmente é o próprio form principal da aplicação. Este parâmetro é necessário porque a classe usa internamente um timer para gerar os pulsos e a construção do timer exige um Owner.

    LPTPort: Porta paralela que será usada. Em geral é a LPT1.

    BaseTM: Tempo base para o timer em milissegundos. Esse é o tempo que será usado entre cada pulso enviado para os motores. Quanto menor o tempo, mais rápido o robô vai se mover. Existe um valor mínimo para esse tempo que depende do tipo do motor de passo e do peso do robô. Caso sejam usados valores abaixo do mínimo, os motores começam a perder passo ou podem nem se mover.


    destructor Destroy;
    Destrutor da classe.

    procedure Ahead;
    Move para frente em linha reta.

    procedure Back;
    Move para trás em linha reta.

    procedure Stop;
    Para o movimento, mas as bobinas continuam ativadas. Isso cria um efeito de “freio de mão” no robô.

    procedure Right;
    Curva leve à direita. A roda da direita passa a rodar com a metade da velocidade da roda da esquerda.

    procedure Left;
    Curva leve à esquerda. Aqui é a roda da esquerda que tem sua velocidade reduzida pela metade.

    procedure VeryRight;
    Curva fechada à direita. A roda da direita fica travada na mesma posição e a roda da esquerda continua no movimento normal. O efeito disso é que o robô começa a circular em torno da roda da direita.

    procedure VeryLeft;
    Curva fechada à esquerda. Idem acima.

    procedure SpinRight;
    Giro à direita. A roda da direita tem o movimento invertido e passa a rodar para trás, enquanto a roda da esquerda se move para frente. O efeito é que o robô começa a girar no sentido horário sem sair do lugar.

    procedure SpinLeft;
    Giro à esquerda. A roda da esquerda inverte o movimento e o robô gira no sentido anti-horário.

    property PulseTime: cardinal;
    Permite ler e alterar o tempo (em milissegundos) entre cada pulso durante o movimento.

    property HiTorq: boolean;
    Liga/desliga o modo de alto torque.

    Listagem da classe TRobotMove

    unit RobotMove;

    interface

    uses SysUtils, Classes, DateUtils, Forms, ExtCtrls,
         ParBib;

    type
      TRobotMove = class
      private
        lport: TLPT;
        tm: TTimer;
        FHiTorq: boolean;         // Ativa/desativa alto torque
        dvLeft, dvRight,          // divisor de frequencia
        psLeft, psRight: byte;    // pulsos
        fwLeft, fwRight: boolean; // direção
        onLeft, onRight: boolean; // anda / para
        baseCount: integer;       // contador base
        FBaseTime: cardinal;
        procedure OnTimer(Sender: TObject);
      public
        constructor Create(AOwner: TComponent; LPTPort: TLPT;
                           BaseTm: cardinal);
        destructor Destroy; override;
        procedure Ahead;
        procedure Back;
        procedure Stop;
        procedure Right;
        procedure Left;
        procedure VeryLeft;
        procedure VeryRight;
        procedure SpinLeft;
        procedure SpinRight;
        property PulseTime: cardinal read FBaseTime write FBaseTime;
        property HiTorq: boolean read FHiTorq write FHiTorq;
      end;

    implementation

    { TRobotMove }

    constructor TRobotMove.Create(AOwner: TComponent; LPTPort: TLPT;
                                  BaseTm: cardinal);
    begin
      inherited Create;
      lport:= LPTPort;
      SetLPT(lport);
      tm:= TTimer.Create(AOwner);
      tm.Enabled:= false;
      FBaseTime := BaseTm;
      tm.Interval:= FBaseTime;
      tm.OnTimer:= OnTimer;
      dvLeft:= 1;
      dvRight:= 1;
      psLeft:= 1;
      psRight:= 1;
      fwLeft:= true;
      fwRight:= true;
      baseCount := 1;
      onLeft:= false;
      onRight:= false;
      tm.Enabled:= true;
      FHiTorq := false;
    end;

    procedure TRobotMove.OnTimer(Sender: TObject);
    var pr, pl: byte;
    begin
      if (baseCount mod dvRight = 0) and onRight then
      begin
        if fwRight then
        begin
          if psRight = 8
            then psRight := 1
            else psRight := psRight shl 1;
        end
        else begin
          if psRight = 1
            then psRight := 8
            else psRight := psRight shr 1;
        end;
      end;
      if (baseCount mod dvLeft = 0) and onLeft then
      begin
        if fwLeft then
        begin
          if psLeft = 1
            then psLeft := 8
            else psLeft := psLeft shr 1;
        end
        else begin
          if psLeft = 8
            then psLeft := 1
            else psLeft := psLeft shl 1;
        end;
      end;

      if FHiTorq then
      begin
        pr := psRight or (psRight shl 1);
        if pr >= 16 then pr := psRight + 1;
        pl := psLeft or (psLeft shl 1);
        if pl >= 16 then pl := psLeft + 1;
        SetDataByte((pl shl 4) or pr);
      end
      else SetDataByte((psLeft shl 4) or psRight);
      Inc(baseCount);
      baseCount := baseCount mod 100000;
      tm.Interval:= FBaseTime;
    end;

    procedure TRobotMove.Ahead;
    begin
      onLeft:= true;
      onRight:= true;
      fwLeft:= true;
      fwRight:= true;
      dvLeft:= 1;
      dvRight:= 1;
    end;

    procedure TRobotMove.Back;
    begin
      onLeft:= true;
      onRight:= true;
      fwLeft:= false;
      fwRight:= false;
      dvLeft:= 1;
      dvRight:= 1;
    end;

    procedure TRobotMove.Stop;
    begin
      onLeft:= false;
      onRight:= false;
    end;

    procedure TRobotMove.Right;
    begin
      onLeft:= true;
      onRight:= true;
      fwLeft:= true;
      fwRight:= true;
      dvLeft:= 1;
      dvRight:= 2;
    end;

    procedure TRobotMove.Left;
    begin
      onLeft:= true;
      onRight:= true;
      fwLeft:= true;
      fwRight:= true;
      dvLeft:= 2;
      dvRight:= 1;
    end;

    procedure TRobotMove.VeryRight;
    begin
      onLeft:= true;
      onRight:= false;
      fwLeft:= true;
      fwRight:= true;
      dvLeft:= 1;
      dvRight:= 1;
    end;

    procedure TRobotMove.VeryLeft;
    begin
      onLeft:= false;
      onRight:= true;
      fwLeft:= true;
      fwRight:= true;
      dvLeft:= 1;
      dvRight:= 1;
    end;

    procedure TRobotMove.SpinRight;
    begin
      onLeft:= true;
      onRight:= true;
      fwLeft:= true;
      fwRight:= false;
      dvLeft:= 1;
      dvRight:= 1;
    end;

    procedure TRobotMove.SpinLeft;
    begin
      onLeft:= true;
      onRight:= true;
      fwLeft:= false;
      fwRight:= true;
      dvLeft:= 1;
      dvRight:= 1;
    end;

    destructor TRobotMove.Destroy;
    var tmp: TDateTime;
    begin
      tm.OnTimer:= nil;
      tm.Enabled:= false;
      tmp := IncMilliSecond(Now, tm.Interval+2);
      while tmp > Now do
        Application.ProcessMessages;
      tm.Free;
      SetDataByte(0);
    end;

    end.

    Programa de navegação e controle do robô

    O programa listado a seguir usa a classe TRobotMove para controlar o robô e fornece uma interface para o usuário. Basicamente o programa associa um botão na tela de interface a cada método fornecido pela classe. As funções de movimento também podem ser ativadas pelo teclado numérico. O tempo mostrado no canto inferior direito do form é o intervalo de tempo entre cada pulso enviado aos motores. Diminuir o tempo aumenta a velocidade do robô, mas existe um limite que varia de acordo com os motores utilizados e o peso do robô. Se usado um intervalo abaixo desse limite, os motores começam a perder passos ou simplesmente param. A figura 33 mostra o form da aplicação.
    As imagens que ilustram os botões foram omitidas da listagem para que a mesma não fique excessivamente longa. Como se trata de um form, foi incluído o arquivo dfm e o arquivo pas, além do arquivo de projeto.

    Figura 33: Tela do programa de navegação
    Arquivo de projeto RoboNav.dpr

    program RoboNav;
    uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      RobotMove in 'RobotMove.pas',
      ParBib in 'ParBib.pas';

    {$R *.res}
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.

    Definição do form de interface, arquivo Unit1.dfm

    object Form1: TForm1
      Left = 269
      Top = 108
      Width = 528
      Height = 291
      Caption = 'Robô Nav'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      OldCreateOrder = False
      OnCreate = FormCreate
      OnKeyPress = FormKeyPress
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 16
        Top = 11
        Width = 64
        Height = 13
        Caption = 'Portas LPT'
      end
      object btOn: TButton
        Left = 13
        Top = 60
        Width = 112
        Height = 57
        Caption = 'Ativar'
        TabOrder = 0
        OnClick = btOnClick
        OnKeyPress = FormKeyPress
      end
      object btOff: TButton
        Left = 13
        Top = 124
        Width = 112
        Height = 57
        Caption = 'Desligar'
        Enabled = False
        TabOrder = 1
        OnClick = btOffClick
        OnKeyPress = FormKeyPress
      end
      object cbxPortas: TComboBox
        Left = 16
        Top = 32
        Width = 107
        Height = 21
        ItemHeight = 13
        ItemIndex = 0
        TabOrder = 2
        Text = 'LPT1'
        OnKeyPress = FormKeyPress
        Items.Strings = (
          'LPT1'
          'LPT2')
      end
      object pnMov: TPanel
        Left = 138
        Top = 32
        Width = 367
        Height = 222
        BevelOuter = bvNone
        Enabled = False
        TabOrder = 3
        object Label2: TLabel
          Left = 264
          Top = 136
          Width = 66
          Height = 13
          Caption = 'Tempo (ms)'
        end
        object btLeft: TBitBtn
          Left = 7
          Top = 6
          Width = 68
          Height = 66
          TabOrder = 0
          OnClick = btLeftClick
          OnKeyPress = FormKeyPress
        end
        object btAhead: TBitBtn
          Left = 79
          Top = 6
          Width = 68
          Height = 66
          TabOrder = 1
          OnClick = btAheadClick
          OnKeyPress = FormKeyPress
        end
        object btRight: TBitBtn
          Left = 151
          Top = 6
          Width = 68
          Height = 66
          TabOrder = 2
          OnClick = btRightClick
          OnKeyPress = FormKeyPress
        end
        object btVRight: TBitBtn
          Left = 151
          Top = 77
          Width = 68
          Height = 66
          TabOrder = 3
          OnClick = btVRightClick
          OnKeyPress = FormKeyPress
        end
        object btStop: TBitBtn
          Left = 79
          Top = 77
          Width = 68
          Height = 66
          TabOrder = 4
          OnClick = btStopClick
          OnKeyPress = FormKeyPress
        end
        object btVLeft: TBitBtn
          Left = 7
          Top = 77
          Width = 68
          Height = 66
          TabOrder = 5
          OnClick = btVLeftClick
          OnKeyPress = FormKeyPress
        end
       
       object btSLeft: TBitBtn
          Left = 7
          Top = 148
          Width = 68
          Height = 66
          TabOrder = 6
          OnClick = btSLeftClick
          OnKeyPress = FormKeyPress
        end
        object btBack: TBitBtn
          Left = 79
          Top = 148
          Width = 68
          Height = 66
          TabOrder = 7
          OnClick = btBackClick
          OnKeyPress = FormKeyPress
        end
        object btSRight: TBitBtn
          Left = 151
          Top = 148
          Width = 68
          Height = 66
          TabOrder = 8
          OnClick = btSRightClick
          OnKeyPress = FormKeyPress
        end
        object btTurbo: TBitBtn
          Left = 249
          Top = 6
          Width = 113
          Height = 105
          Caption = 'Turbo'
          TabOrder = 9
          OnClick = btTurboClick
          Layout = blGlyphTop
        end
        object seTime: TSpinEdit
          Left = 262
          Top = 152
          Width = 97
          Height = 22
          Enabled = False
          MaxValue = 100
          MinValue = 10
          TabOrder = 10
          Value = 35
          OnChange = seTimeChange
        end
      end
    end 


    Listagem do arquivo Unit1.pas

    unit Unit1;

    interface

    uses
      Forms, StdCtrls, Spin, Buttons, Controls, ExtCtrls, Classes,
      ParBib, RobotMove;

    type
      TForm1 = class(TForm)
        btOn: TButton;
        btOff: TButton;
        Label1: TLabel;
        cbxPortas: TComboBox;
        pnMov: TPanel;
        btLeft: TBitBtn;
        btAhead: TBitBtn;
        btRight: TBitBtn;
        btVRight: TBitBtn;
        btStop: TBitBtn;
        btVLeft: TBitBtn;
        btSLeft: TBitBtn;
        btBack: TBitBtn;
        btSRight: TBitBtn;
        btTurbo: TBitBtn;
        Label2: TLabel;
        seTime: TSpinEdit;
        procedure btOnClick(Sender: TObject);
        procedure btOffClick(Sender: TObject);
        procedure btTurboClick(Sender: TObject);
        procedure FormKeyPress(Sender: TObject; var Key: Char);
        procedure FormCreate(Sender: TObject);
        procedure btLeftClick(Sender: TObject);
        procedure btVLeftClick(Sender: TObject);
        procedure btSLeftClick(Sender: TObject);
        procedure btAheadClick(Sender: TObject);
        procedure btStopClick(Sender: TObject);
        procedure btBackClick(Sender: TObject);
        procedure btRightClick(Sender: TObject);
        procedure btVRightClick(Sender: TObject);
        procedure btSRightClick(Sender: TObject);
        procedure seTimeChange(Sender: TObject);
      private
        function LPTSelected: TLPT;
      public
        rob: TRobotMove;
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    { TForm1 }

    function TForm1.LPTSelected: TLPT;
    begin
      case cbxPortas.ItemIndex of
        0: result := pLPT1;
        else result := pLPT2;
      end;
    end;

    procedure TForm1.btOnClick(Sender: TObject);
    begin
      rob:= TRobotMove.Create(self, LPTSelected, seTime.Value);
      btOff.Enabled:= true;
      btOn.Enabled:= false;
      pnMov.Enabled:= true;
    end;

    procedure TForm1.btOffClick(Sender: TObject);
    begin
      rob.Stop;
      rob.Free;
      btOn.Enabled:= true;
      btOff.Enabled:= false;
      pnMov.Enabled:= false;
    end;

    procedure TForm1.btTurboClick(Sender: TObject);
    begin
      rob.HiTorq := not rob.HiTorq;
      if rob.HiTorq
        then btTurbo.Caption := 'Turbo on'
        else btTurbo.Caption := 'Turbo off'
    end;

    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
      case Key of
        '8': begin
          rob.Ahead;
          btAhead.SetFocus;
        end;
        '2': begin
          rob.Back;
          btBack.SetFocus;
        end;
        '5': begin
          rob.Stop;
          btStop.SetFocus;
        end;
        '7': begin
          rob.Left;
          btLeft.SetFocus;
        end;
        '9': begin
          rob.Right;
          btRight.SetFocus;
        end;
        '4': begin
          rob.VeryLeft;
          btVLeft.SetFocus;
        end;
        '6': begin
          rob.VeryRight;
          btVRight.SetFocus;
        end;
        '1': begin
          rob.SpinLeft;
          btSLeft.SetFocus;
        end;
        '3': begin
          rob.SpinRight;
          btSRight.SetFocus;
        end;
      end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      seTime.Enabled:= true;
    end;

    procedure TForm1.btLeftClick(Sender: TObject);
    begin
      Rob.Left;
    end;

    procedure TForm1.btVLeftClick(Sender: TObject);
    begin
      rob.VeryLeft;
    end;

    procedure TForm1.btSLeftClick(Sender: TObject);
    begin
      rob.SpinLeft;
    end;

    procedure TForm1.btAheadClick(Sender: TObject);
    begin
      rob.Ahead;
    end;

    procedure TForm1.btStopClick(Sender: TObject);
    begin
      rob.Stop;
    end;

    procedure TForm1.btBackClick(Sender: TObject);
    begin
      rob.Back;
    end;


    procedure TForm1.btRightClick(Sender: TObject);
    begin
      rob.Right;
    end;

    procedure TForm1.btVRightClick(Sender: TObject);
    begin
      rob.VeryRight;
    end;

    procedure TForm1.btSRightClick(Sender: TObject);
    begin
      rob.SpinRight;
    end;

    procedure TForm1.seTimeChange(Sender: TObject);
    begin
      rob.PulseTime:= seTime.Value;
    end;

    end.



    Índice

    2) Visão geral do projeto
    3) Fonte de alimentação para testes de bancada
    4) A porta paralela
    5) Motores de passo
    6) Montagem dos circuitos
    7) Montagem do robô
    8) Alimentação
    9) Software de navegação
    10) Conclusão
    Apêndice - Duplicando polias e engrenagens