Escolar Documentos
Profissional Documentos
Cultura Documentos
Circuito de Interface para Microcontroladores - v2
Circuito de Interface para Microcontroladores - v2
ndice
2. Interfaceamento do Microcontrolador
Neste captulo iremos explicar como realizar as interfaces para que diferentes dispositivos de entrada e de sada possam ser ligados ao microcontrolador. Iremos tratar dos seguintes dispositivos:
Note que comum colocar um dodo invertido em paralelo com o dispositivo controlado (dodo de roda-livre). Isto essencial para cargas indutivas, como so os casos de motores e rels. Sempre que se desliga um destes dispositivos cria-se uma corrente inversa que iria destruir o transstor. Poder ser usado um vulgar dodo 1N4001.
A verso ULN2803 contm 8 transstores. Se for necessrio controlar correntes mais elevadas podero ser ligadas duas sadas como na figura.
Os pinos do microcontrolador PIC podem deixar passar (sink) ou fornecer (source) correntes de 20 mA, o que significa que possvel ligar directamente um LED a um pino de sada. Lembre-se de que os pinos de um microcontrolador como o PICAXE vm j configurados, uns como sadas e outros como entradas. Alguns so reprogramveis. Para limitar a corrente utiliza-se em srie uma resistncia de 330 ohms.
LED ligado massa. Para ligar o LED (ON) - high 1 Para desligar o LED (OFF) - low 1
LED ligado alimentao. Para ligar o LED (ON) - low 1 Para desligar o LED (OFF) - high 1
Para produzir uma nota de tom 100, durao 50 no pino 1 sound 1, (100,50) Para produzir um som variado usando a varivel b1 for b1 = 1 to 100 sound 1, (b1,25) next b1 ; a instruo sound repetida tomando os valores de tom ; de 1 a 100
2.2.5. Micromotores
Muitos projectos requerem a utilizao de motores de corrente contnua (CC) baratos para criar movimento circular. Existem vrias possibilidades de interfacear motores ao microcontrolador. O circuito da figura utiliza transistores Darlington para accionar o motor. Este circuito funciona bem com motores CC de brinquedos baratos. No entanto importa acautelar o facto de que os motores produzem muito rudo elctrico nas linhas de alimentao do microcontrolador, podendo lev-lo a deixar de funcionar.
Uma soluo para o rudo elctrico consiste em colocar entre os terminais do motor um condensador de polister (no polarizado) de 220nF.
Para accionar motores de maior potncia, pode usar-se o circuito a MOSFET anteriormente descrito.
Em vrias circunstncias ir ser necessrio accionar mais do que um motor, como o caso dos robs mveis. A soluo mais simples e barata consiste em utilizar um integrado motor driver como o L293D. Este integrado possibilita o controlo de dois motores CC, utilizando quatro pinos de sada do microcontrolador. Naturalmente se tivermos um s motor bastam dois pinos. Esta soluo ir ser utilizada nos nossos robs pois alm de permitir o accionamento nos dois sentidos dos dois motores, permite ainda o controlo de velocidade por PWM, como se ver mais frente.
Ambas as entradas baixas - o motor pra Primeira entrada alta, segunda entrada baixa - motor para frente Primeira entrada baixa, segunda entrada alta - motor para trs Ambas as entradas altas - motor pra A mudana dos sinais nos pinos de entrada tem o efeito de produzir a alterao do sentido da corrente no enrolamento do motor, logo do seu sentido de rotao.
Note que o L293D aquecer com uso intenso. O uso de um dissipador colocado no topo do integrado pode ajudar ao arrefecimento. No caso de montagens em placas prperfuradas (stripboard) a soldadura s pistas dos quatro terminais de massa centrais pode ajudar a dissipar. Uma maneira de reduzir os efeitos do rudo elctrico sobre o microcontrolador, consiste em usar fontes de alimentao separadas para a parte de controlo (microcontrolador) e para os motores. No caso dos robs que iremos construir, pode usar-se uma vulgar pilha de 9V com regulador de tenso para 5V para a electrnica e um pack de baterias de modelismo (NiCad ou NiMH de 9,6V) para os motores. Naturalmente continua a ser necessrio manter um terminal de massa comum s duas alimentaes. A separao total de circuitos pode ser realizada usando circuitos optoelectrnicos mas apenas se justifica, face sua complexidade, no caso de rudo elctrico excessivo, resultante de comutao de rels ou motores.
microprocessador utilizam quatro pinos de sada para controlar cada um dos quatro enrolamentos.
Como o motor passo-a-passo alimentado a 12V, necessrio um circuito a transstor para cada enrolamento. Como os enrolamentos so indutivos, necessrio proteger cada transstor com um dodo de roda-livre. O uso do integrado ULN2003 (ou 2803) neste caso de particular relevncia, simplificando o nmero de componentes e as ligaes. A tabela abaixo apresenta os quatro passos necessrios para que o motor rode.
Analisando com cuidado a tabela, reparamos que existe um padro. O enrolamento 2 sempre o oposto (operao lgica NOT) do enrolamento 1. O mesmo se aplica aos enrolamentos 3 e 4. assim possvel reduzir a metade o nmero de pinos do microcontrolador necessrios para controlar o motor, desde que se acrescentem duas portas lgicas NOT. Na figura seguinte, este sistema implementado usando os transstores livres como inversores (portas NOT).
Repare que na passagem do passo 1 para o passo 2, apenas muda o enrolamento 3. Repare agora no passo seguinte s o enrolamento 1 muda. De facto os dois enrolamentos mudam vez de alto para baixo sucessivamente. Esta passagem altobaixo-alto pode ser descrita como um estado de toggling. Isso torna a programao ainda mais simples basta usar a instruo toggle. steps: toggle 1 pause 200 toggle 2 pause 200 goto steps
10
Note que como os enrolamentos so indutivos, para proteger os transstores da extracorrente de rotura, so necessrios dodos de roda-livre em paralelo com cada um deles. A tabela abaixo mostra os quatro passos necessrios para fazer rodar o motor.
Afortunadamente, o motor driver L293D foi desenhado especificamente para esta funo de comutao. Cada L293D possui 8 transstores e os respectivos dodos num encapsulamento de 16 pinos. Quatro pinos do microcontrolador so ligados aos quatro pares de transstores (pinos 2, 7, 10 e 15).
11
O programa junto faz o motor rodar 100 passos para a esquerda e a seguir 100 passos para a direita, utilizando duas subrotinas. A subrotina lstep faz o motor rodar um passo para a esquerda, a subrotina rstep faz o motor rodar um passo para a direita. A varivel b1 utilizada para guardar a posio do passo e dever ser utilizada em qualquer outra parte do programa.
main: for b3 = 0 to 99 gosub lstep next b3 for b3 = 0 to 99 gosub rstep next b3 lstep: let b1 = b1 + 1 goto step rstep: let b1 = b1 - 1 step: let b1 = b1 & 2 lookup b1,(%1010,%1001,%0101,%0110),b2 let pins = b2 return ; inicia um ciclo for...next ; chama subrotina left step ; ciclo seguinte ; inicia um ciclo for...next ; chama subrotina right step ; ciclo seguinte ; soma 1 varivel b1 ; salta para tabela lookup ; subtrai 1 da varivel b1 ; mascara os dois bits menos pesados de b1 ; guarda o cdigo lookup em b2 ; faz sair o valor de b2 para os pinos de controlo
Os servos so vulgarmente utilizados nos carros e avies radiocontrolados para controlar mecanismos de direco. Trata-se de dispositivos muito precisos que rodam sempre o mesmo ngulo para um dado sinal, pelo que so ideais para utilizao em automatismos. Um servo tpico possui trs condutores de ligao, normalmente preto, encarnado e branco (ou amarelo). O condutor preto a referncia de massa da alimentao (0 volts), o condutor encarnado a alimentao de 5V (de 4,8V a 6V) e o condutor branco (ou amarelo) o sinal de posicionamento. Este sinal de posio um impulso de 0,75 a 2,25 milisegundos (ms), repetido cada 18 ms aproximadamente (portanto, temos 50 impulsos por segundo). Com o impulso de 0,75 ms o servo move-se (roda) para uma das extremidades e com o impulso de 2,25 ms para a extremidade oposta. Desse modo, com um impulso de 1,5 ms, o servo roda para a posio central. Se os impulsos terminarem o servo move-se ao acaso. Lamentavelmente, os servos consomem correntes elevadas (de 200 mA a 1 A) e introduzem rudo elctrico nos condutores de alimentao. Devero, portanto, ser alimentados por fonte de alimentao
12
separada, como se mostra na figura abaixo. Lembre-se que o condutor de massa (referncia) deve ser comum s duas alimentaes.
loop: servo 4,75 pause 2000 servo 4,150 pause 2000 servo 4,225 pause 2000 goto loop ; move servo para um dos lados ; espera 2 segundos ; move servo para posio central ; espera 2 segundos ; move servo para o outro lado ; espera 2 segundos ; volta para o incio
Um solenide consiste num mbolo de ferro colocado no interior de uma bobina (indutncia) elctrica, enrolada em torno de um tubo. Quando se alimenta electricamente a bobina, cria-se um campo magntico que atrai o mbolo para dentro do tubo. Quando se retira a alimentao, uma mola empurra o mbolo para fora do tubo. O controlo de um solenide pode ser efectuado com o circuito a MOSFET atrs descrito.
13
2.3.1. Interruptores
Existe disponvel uma enorme variedade de interruptores, mas a maior parte possui dois contactos, que ou esto abertos (off) ou fechados (on). Os dois circuitos apresentados abaixo podem ser usados com a maioria dos interruptores. Com este primeiro circuito o pino de entrada (Pin 0) fica baixo (0) quando o interruptor est aberto e alto (1), quando o interruptor fechado. Um programa possvel Vai para salta quando o interruptor est aberto: if pin0 = 0 then salta Vai para salta quando o interruptor fechado: if pin0 = 1 then salta
Com o circuito seguinte o pino de entrada (Pin 0) fica alto (1) quando o interruptor est aberto e baixo (0), quando o interruptor fechado.
14
2.3.2. Potencimetro
Um potencimetro (ou resistncia varivel) possui um eixo que pode ser rodado para variar o valor da resistncia do potencimetro. Podemos usar potencimetros para medir movimentos circulares ou ngulos. Para serem utilizados com o microcontrolador, os potencimetros so colocados como divisores de tenso e o microcontrolador l efectivamente a tenso que converte para um valor numrico (digital). Para isso usa-se a
15
instruo readADC que activa o Conversor Analgico-Digital. O valor da resistncia vem assim transformado num valor entre 0 e 255, que guardado numa varivel. A instruo ifpoder agora ser utilizada para definir as aces a desenvolver consoante o valor lido.
O programa abaixo acende trs LEDs diferentes (ligados aos pinos 1,2 e 3), dependendo da leitura do sensor analgico (potencimetro)
main: readadc 0,b1 if b1<75 then light1 if b1<175 then light2 goto light3 high 1 low 2 low 3 goto main low 1 high 2 low 3 goto main low 1 low 2 high 3 goto main ; l o valor no pin0 para a varivel b1 ; se b1 menor do que 75 ento salta para light 1 ; se b1 menor do que 175 ento salta para light 2 ; se b1 maior do que 175 ento salta para light 3 ; LED 1 on ; LED 2 off ; LED 3 off ; loop ; LED 1 off ; LED 2 on ; LED 3 off ; loop ; LED 1 off ; LED 2 off ; LED 3 on ; loop
light1:
light2:
light3:
16
Convm lembrar que a resposta de uma LDR no linear, pelo que as leituras no variam como num potencimetro. Em geral, existe uma grande variao de resistncia para nveis de iluminao elevados. Isso pode ser compensado por software, utilizando gamas de variao menores para os nveis escuros. Experimente at encontrar os ajustes adequados ao circuito e s condies de iluminao.
main: readadc 0,b1 if b1<50 then light1 if b1<100 then light2 if b1<145 then light3 if b1<175 then light4 goto main ; leitura do valor ; gama 0-50 = 50 ; gama 50-100 = 50 ; gama 100-145 = 45 ; gama 145-175 = 30
NOTA: A PICAXE dispe de uma placa (Analogue Calibration Board BAS810) que permite ver nos displays de 7 segmentos o valor exacto, entre 0 e 255, quando um sensor est l ligado. Permite tirar leituras nas mais diversas condies de teste de modo a obtermos a melhor gama de valores para um programa. Se quiser consultar mais informaes: www.techsupplies.co.uk/cgibin/techsupplies.storefront/43afe871050f0ef a2740c2c98abb0710/Product/View/BAS810
Exemplo de ligao:
17
2.3.4. Termistor
Um termistor uma resistncia varivel com a temperatura. Na realidade todas as resistncias variam com a temperatura, s que os termistores so feitos para terem uma grande variao com a temperatura. A ligao do termistor ao microcontolador muito simples, mas convm tambm calibr-lo (com o BAS810, por exemplo).
Convm lembrar que a resposta de um termistor no linear, pelo que as leituras no variam como num potencimetro. Em geral, existe uma grande variao de resistncia para temperaturas baixas. Isso pode ser compensado por software, utilizando gamas de variao menores para os nveis de temperatura mais altos. Experimente at encontrar os ajustes adequados ao circuito e s condies de temperatura.
main: readadc 0,b1 if b1<50 then light1 if b1<100 then light2 if b1<145 then light3 if b1<175 then light4 goto main ; leitura do valor ; gama 0-50 = 50 ; gama 50-100 = 50 ; gama 100-145 = 45 ; gama 145-175 = 30
18
contrapartida h consumo de energia nos LED enquanto que nos LCD praticamente no h consumos.
O preo a pagar que se tm que fazer as ligaes de acordo com os dois esquemas abaixo: A) LIGAES DO FIRMWARE B) LIGAES DO MDULO LCD
20
O Programa que se segue escreve a frase Hello there! em duas linhas do display LCD. Temos que usar trs subrotinas standard chamadas init, wrins e wrchr. Elas resolvem todos os nossos problemas no s de inicializao como de envio para o LCD tanto das instrues como das mensagens. Essas rotinas standard fazem exactament o seguinte: init Faz a inicializao do LCD, deixando-o pronto a aceitar as instrues wrins envia as instrues armazenadas na varivel b1 para o mdulo LCD wrchr envia um caracter armazenado na varivel b1 para ser mostrado no ecr LCD
gosub init
main:
for b3 = 5 to 11
21
O programa seguinte faz rodar na janela do LCD a mensagem Hello there everybody!. Isto porque o texto tem mais do que as 16 letras que um ecr suporta. A mensagem primeiro armazenada na memria do LCD, indo depois rodando na janela do display repetidamente para que seja mostrada toda a mensagem.
EEPROM 0,(Hello there everybody!) armazena o texto na memria EEPROM
gosub init
initializa o LCD b1=1 => instruo clear display envia instruo para o LCD ciclo for...next (Hello there everybody! 22 caracteres) b1=EEPROM[b3] envia character para LCD continua b1=12 => instruo hide cursor envia instruo para o LCD b1=24 => instruo scroll display left envia instruo para o LCD pausa 0.25s roda a mensagem (Hello there everybody!)
start:
let b1 = 12 gosub wrins main: let b1 = 24 gosub wrins pause 250 goto main
Nos programas que vimos fazendo, vemos que o LCD tanto tem que receber instrues como caracteres. o pino 4 (RS) do LCD controlado pela sada 2 do microcontrolador que define se instruo ou caracter o que est entrada. Pondo o pin 2 baixo o LCD est em modo de instruo enquanto que quando o pin 2 est alto fica em modo de caracter. Cada instruo ou caracter enviada como um nmero binrio de 4 bits para as linhas de dados (pinos 7-4). Depois o LCD, quando recebe um impulso de ENABLE, no seu pino 6 - SE (e que enviado pela sada 3 do microcontrolador) l os dados e imprime o caracter (ou cumpre a instruo) correspondente ao nmero nas linhas de dados.
22
Todos os cdigos de caracteres e instrues (comandos) tm 8 bit. Como s h 4 linhas de dados, os 8 bit so mandados em duas metades, uma a seguir outra. Cada um dos quatro bit recebe o nome de nibble (nibble alto e nibble baixo). Portanto, por cada caracter (ou comando) so transmitidos 2 nibbles. 1011 0101 = 10110101 nibble alto + nibble baixo = byte A funo das trs subrotinas standard (init, wrins e wrchr) levar a cabo toda esta tarefa complicada quando trabalhamos com displays LCD.
init: let pins = 0 let b4 = 0 let dirs = 252 pause 200 let pins = 48 pulsout 3,1 pause 10 pulsout 3,1 pulsout 3,1 let pins = 32 pulsout 3,1 pulsout 3,1 let pins = 128 pulsout 3,1 let b1 = 14 gosub wrins return wrchr: let pins = b1 & 240 high 2 pulsout 3,1 let b2 = b1 * 16 let pins = b2 & 240 high 2 pulsout 3,1 Return wrins: let pins = b1 & 240 pulsout 3,1 Let b2 = b1 * 16 let pins = b2 & 240 pulsout 3,1 high 2 return Todas sadas=0 Reset variavel Pins 2-7 como sada (%11111100). 200 ms para reset ao LCD. Funcionamento LCD a 8-bit. Envia comando (enable) Espera 10 ms Envia comando outra vez(enable) Envia comando outra vez(enable) Funcionamento LCD a 4-bit. Envia comando(enable) Envia comando outra vez(enable) Funcionar em duas linhas Envia comando (enable). LCD ON e com cursor. Ecrever instruco no LCD nibble alto de b1=>fora(ateno RS=0). Enviar Caracter=> RS alto Pulsa enable (envia nibble alto). nibble baixo de b1=>b2. nibble baixo de b1=>fora(ateno RS=0). Caracter=> RS alto Pulsa enable pin (envia nibble baixo). nibble alto de b1=>fora(RS=0->instru). Pulsa enable (envia nibble alto). b2=b1 rodado 4x p/ esquerda. nibble baixo de b1=>fora(+RS=0-instru). Pulsa enable pin (envia nibble baixo). Modo character
Nota: na subrotina init, o comando let dirs =252(%11111100) vai afectar os 8 pinos e no apenas os 6 usados pelo LCD. Como se pode ver, nem wrins nem wrchr necessitam dos pinos 0 e 1. Se o nosso programa usar estas rotinas deve ter em conta que, quando retorna da chamada, o valor de b2 vem alterado (assim como w0).
Os cdigos das instrues de comando para o LCD, como vimos, devem ir na varivel b1 quando se chama a subrotina wrins, que se encarrega de modificar o estado do LCD.
Cdigos das instrues (comandos) para o LCD.
23
1 Limpa o display e move para a primeira linha 2 Move o cursor e a janela de display para o incio da primeira linha 4 Modo escrever da direita para a esquerda 5 Modo scroll para a esquerda 6 Modo escrever da esquerda para a direita 7 Modo scroll para a direita 10 Visualizao do LCD off 12 Sem cursor 13 Cursor a piscar 14 Visualizao do LCD (e cursor) on 16 Move cursor para a esquerda uma posio 20 Move cursor para a direita uma posio 24 Faz o scroll da janela uma posio para a esquerda 28 Faz o scroll da janela uma posio para a direita 128 Move o cursor para o incio da primeira linha 192 Move o cursor para o incio da segunda linha
Exemplos
Limpar o display clear: let b1 = 1 b1=instruo clear call wrins Envia para o LCD Mover o cursor para a segunda linha clear: let b1 = 192 b1=incio da segunda linha call wrins Envia para o LCD Piscar uma menssagem 10 vezes flash:for b3 = 1 to 10 let b1 = 10 gosub wrins pause 200 let b1 = 14 gosub wrins pause 200 next b3 for...next usando variable b3(nunca b1!!) b1= Visualizao do LCD off Envia para o LCD Pausa de 0.2 segundos b1= Visualizao do LCD on Envia para o LCD Pausa de 0.2 segundos Fim do loop for...next for...next usando variable b3(nunca b1!!) b1= Scroll da janela uma posio p/ direita Envia para o LCD Pausa de 0.2 segundos Fim do loop for...next b1=instruo clear Envia para o LCD Pausa de 0.2 segundos Loop
Fazer scroll a uma mensagem longa (30 caracteres) scroll: for b3 = 1 to 30 let b1 = 28 gosub wrins pause 200 next b3 let b1 = 1 gosub wrins pause 200 goto scroll
24