Professional Documents
Culture Documents
0
o ciclo de trabalho (duty-cicle), ou seja, o tempo em que o pulso permanece com a
amplitude em nvel lgico alto.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 143 ]
Figura 115: Ciclo de trabalho.
No mdulo CCP, o registro PR2 carregado para servir de referncia de contagem
para o timer 2 de 8 bits com prescaler (multiplicador de tempo de geralmente 4 ou 16).
Quando o timer 2quando chega ao valor de PR2, seta o flip-flop do CCP para gerar o
perodo (T
0
)e consequentemente a frequncia desejada do PWM (freqPWM).
O valor digital (Vdig) de 10 bits do ciclo de trabalho, obtido do valor percentual (0 a
100)inserido pelo usurio. O Vdig O Vdig carregado em CCPR1L,que guarda os 8 bits
mais significativos do valor digital, e nos bits5 e 4 do CCP1CON so carregados os dois
bits menos significativos do valor digital, e serve de referncia para o timer2 resetar o ciclo
de trabalho.
Mais detalhes no vdeo: http://www.youtube.com/watch?v=lB21b3zA4Ac
14.9 DRIVER DE POTNCIA ULN2803
Um driver de potncia utilizado sempre quando se necessita acionar um hardware
especifico de maior potncia. Esse driver pode ser usado para controlar motores de
passos, solenides, rels, motores CC e vrios outros dispositivos. Ele contm
internamente 8 transistores Darlington NPN de potncia, oito resistores de base de 2K7 e
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 144 ]
oito diodos de roda livre, para descarregar no Vcc (pino 10) a corrente reversa da fora
contra-eletromotriz gerada no chaveamento dos transistores, protegendo os mesmos.
Quando o microcontrolador coloca +5V (nvel lgico 1) no pino 1 do driver ULN2803,
ele conecta o pino 18 do outro lado, onde est liga um plo do motor, ao Gnd (nvel lgico
0, por isso a simbologia de porta inversora na figura abaixo). Como o outro lado da bobina
(o comum) ou do motor deve estar ligado ao Vcc da fonte de at 30V, esse comando ir
energizar a bobina ou o motor.
Figura 116: ULN 2803.
Figura 117: Esquemtico Rel b7.
Cdigo em C para CCS para acionar rel de forma temporizada:
#include SanUSB.h//BIBLIOTECA DE INSTRUES
main(){//PROGRAMA PRINCIPAL
while (1)//LAO INFINITO
{
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 145 ]
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta //e entra
em estado de gravao
output_toggle(pin_b7);//ALTERNA SADA PARA O REL PINO B7
delay_ms(1000);//ATRASO 1 SEG
}}
Figura 118: Rel b7 com placa SanUSB.
Inicialmente sero utilizados 2 LEDs conectados aos contatos NA e NF do rel
apenas para testar seu funcionamento. Enquanto um LED acender, o outro estar apagado.
Para alimentar o LED, ser utilizada a tenso de 5V da prpria USB do circuito SanUSB. A
figura a seguir mostra detalhes da montagem.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 146 ]
Figura 119: Rel b7 com SanUSB em protoboard.
Figura 120: Ligar lmpada com rel.
Para acionar uma lmpada 220Vca, deve-se seguir o esquema acima. A ligao do rel a
mesma da prtica com LEDs. Deve-se utilizar sempre o driver de potncia ULN2803.
Para ligar a lmpada via botes, basta inserir a programao com IF e INPUT. Alm de
acrescentar o boto no circuito real.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 147 ]
14.10 SOLENIDES E RELS Acionamento de motores e lmpadas
Uma solenide consiste num mbolo de ferro colocado no interior de uma bobina
(indutncia) eltrica, enrolada em torno de um tubo. Quando se alimenta eletricamente a
bobina, cria-se um campo magntico que atrai o mbolo (ncleo mvel) para dentro da
bobina como mostrado na figura abaixo. No caso de um rel, fecha um contato para
circulao de outro nivel maior de corrente.
Figura 121: Solenide.
Os rels so dispositivos comutadores eletromecnicos (Figura 2.14). A estrutura
simplificada de um rel mostrada na figura abaixo e a partir dela explicado o seu
princpio de funcionamento.
Figura 122: Rels.
O controle de uma solenide ou rel pode ser feito pelo chaveamento de um
transistor Darlington ou de um MOSFET mostrado abaixo. O rel um tipo de interruptor
acionado eletricamente que permite o isolamento eltrico de dois circuitos. O rel
formado por um eletrom (uma bobina enrolada sobre um ncleo de material
ferromagntico) que quando acionado, atravs da atrao eletromagntica, fecha os
contatos de um interruptor. Normalmente o interruptor de um rel tem duas posies, com
isso existem dois tipos, os NF(normalmente fechado) e NA (normalmente aberto), como
mostra a figura abaixo. A bobina do rel acionada por uma tenso contnua que
especificada de acordo com o fabricante, bobinas de 5, 12 e 24 Volts so as mais comuns.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 148 ]
Figura 123: Acionamento de motor 12V com rel bobina 5V.
Uma das caractersticas do rel que ele pode ser energizado com correntes muito
pequenas em relao corrente que o circuito controlado exige para funcionar. Isso
significa a possibilidade de controlar circuitos de altas correntes como motores, lmpadas e
mquinas industriais, diretamente a partir de microcontroladores.
Figura 124: Aplicao de um rel.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 149 ]
Figura 125: Rel em protoboard.
A Figura 7.18 mostra a ligao de um rel no pino b6 com o driver de potncia
ULN2803. Utilize sempre um transistor/driver entre o PIC e o rel, para dar um ganho de
corrente e proteger o PIC contra corrente reversa.
14.11 PONTE H COM MICRORELS
Como foi visto, acionamento da ponte H permite o movimento do motor nos dois
sentidos. A ponte H pode ser feita tambm com apenas dois microrels. Neste caso, pode-
se utilizar tambm o driver ULN2803 para a energizao das bobinas, pois j contm
internamente oito transistores com resistores de base e oito diodos de roda livre. Esse tipo
de ponte H, mostrada na figura abaixo, no causa queda de tenso na fonte de
alimentao do motor, porque as fontes de energizao da bobina do microrel e de
alimentao do motor devem ser diferentes, ou seja, isoladas uma da outra, para que seja
possvel o chaveamento do rel.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 150 ]
Figura 126: Acionamento de motor nos 2 sentidos com rels em Ponte H.
Note que inicialmente os dois rels esto conectados ao V-Motor. Ao energizar a
bobina do rel da esquerda, conectando o V+Motor, a corrente da fonte passa pelo motor
no sentido da esquerda para a direita o que determina o sentido de rotao do motor. Ao
desligar o rel da esquerda e acionar o rel da direita ocorre o sentido de rotao inverso
do motor.
Quando se utiliza motor CC em ponte H para atuadores robticos, como rodas de
veculos ou braos mecnicos, o que determina o torque e a velocidade do atuador a
relao de transmisso da caixa de engrenagens conectada ao motor.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 151 ]
Figura 127: Ponte H com rels motor CC.
Cdigo em C para CCS:
#include SanUSB.h
main(){
// clock_int_4MHz();
while (TRUE)
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta //e
//entra em estado de gravao
//gira esquerda
output_high(pin_b7);
output_low(pin_b6);
delay_ms(2000);//aguarda 2 segundos
//gira direita
output_low(pin_b7);
output_high(pin_b6);
delay_ms(2000);
}}
O acionamento da ponte H permite o movimento do motor nos dois sentidos. A ponte
H pode ser feita com transistores MOSFETs, mais aconselhvel devido a baixa queda de
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 152 ]
tenso, ou de potncia Darllington TIP ou BD. Mais detalhes em
://www.youtube.com/watch?v=6IIH02dbboE .
Figura 128: Motor em Ponte H.
14.12 DRIVER PONTE H L293D
Uma das solues mais simples e barata em atuao de robs mvis consiste
utilizar um integrado motor driver como o L293D. Este integrado possibilita o controle de
dois motores CC, utilizando quatro pinos de sada do microcontrolador, ou seja, substitui o
driver ULN2803 e 4 rels.
O circuito integrado L293D deve ter duas alimentaes. Uma para comando (5V) no
pino 16 e outra para potncia (por exemplo 9,6 V ou 5V) no pino 8. Os motores percebem
uma queda de 0,7V em relao tenso da fonte externa.
As entradas nos pinos 2 e 7 so para acionar o motor A e entradas nos pinos 10 e
15 so para acionar o motor B. O pino 8 conectado fonte de alimentao dos motores
que tem o mesmo Gnd do circuito de controle.
Figura 129: CI Ponte H L293D.
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. A Tabela
permite programar o movimento em qualquer direo (conjugando 2 motores).
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 153 ]
Se a primeira entrada alta, segunda entrada baixa , ento o motor se desloca para
frente, se a primeira entrada baixa e a segunda entrada alta , o motor se movimenta para
trs. Se ambas as entradas baixas ou altas, o motor pra.
Pode-se utilizar tambm o shield ponte H baseado no CI L293D mostrado na figura
a seguir.
Figura 130: Shield ponte H L293D.
Conexo dos pinos no shield ponte H (L293D) de acordo com o firmware a seguir.
PINO DESCRIO CONEXO
1 Sinal motor 1 5V
2 PINO 1 Pin_b7
3 MOTOR1 A Terminal positivo motor 1
4,5
12,13
GND
No shield j esto
jumpeados, portanto
conecte apenas um deles no
terra (negativo, 0V, -)
Lembre-se de interligar os
terras das 2 fontes!
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 154 ]
6 MOTOR1 B Terminal negativo motor 1
7 PINO 1 Pin_b6
8 Tenso motores
Terminal positivo da fonte
externa de at 36V (mnimo
1A). O CI suporta motores
de at 1A.
9 Sinal motor 2 5V
10 PINO 4 Pin_b4
11 MOTOR2 B Terminal negativo motor 2
14 MOTOR2 A Terminal positivo motor 2
15 PINO 3 Pin_b5
16 +5V 5V
Cdigo para reverso de sentido de 2 motores utilizando o shield L293D ou 4 rels
em ponte H.
#include SanUSB.h//BIBLIOTECA DE INSTRUES
#define time 1000 // delay de 1000 ms
main(){
clock_int_4MHz();
while (1) {
// motor 1 - pinos b7 e b6
// motor 2 - pinos b5 e b4
// os 2 motores avanam juntos:
output_high(pin_b7);//motor 1 frente
output_low(pin_b6);
output_high(pin_b5);//motor 2 frente
output_low(pin_b4);
delay_ms(time); //aguarda 1000 ms definidos no cabealho
// os 2 motores retornam juntos:
output_low(pin_b7);//motor 1 retorna
output_high(pin_b6);
output_low(pin_b5);//motor 2 retorna
output_high(pin_b4);
delay_ms(time); //aguarda 1000 ms definidos no cabealho
// os 2 motores param:
output_low(pin_b7);//motor 1 retorna
output_low(pin_b6);
output_low(pin_b5);//motor 2 retorna
output_low(pin_b4);
delay_ms(time); //aguarda 1000 ms definidos no cabealho
}
}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 155 ]
15 ACIONAMENTO DE MOTORES DE PASSO
Motores de passos so dispositivos mecnicos eletromagnticos que podem ser
controlados digitalmente.
A crescente popularidade dos motores de passo se deve total adaptao desses
dispositivos lgica digital. So encontrados no s em aparelhos onde a preciso um
fator muito importante como impressoras, plotters, scanners, drivers de disquetes, discos
rgidos, mas tambm, como interface entre CPUs e movimento mecnico, constituindo, em
suma, a chave para a Robtica.
15.1 MOTORES DE PASSO UNIPOLARES
Os motores de passo unipolares so facilmente reconhecidos pela derivao ao
centro das bobinas. O motor de passo tem 4 fases porque o nmero de fases duas vezes
o nmero de bobinas, uma vez que cada bobina se encontra dividida em duas pela
derivao ao centro das bobinas (comum).
Normalmente, a derivao central das bobinas est ligada ao terminal positivo da
fonte de alimentao (Vcc) e os terminais de cada bobina so ligados alternadamente
terra atravs de chaveamento eletrnico produzindo movimento.
As bobinas se localizam no estator e o rotor um im permanente com 6 plos ao
longo da circunferncia. Para que haja uma maior resoluo angular, o rotor dever conter
mais plos.
Figura 131: Motor de passo unipolar.
Os motores de passo unipolares mais encontrados possuem 5 ou 6 fios. Os motores
de passo unipolares de 6 fios possuem dois fios comuns (derivao central). Para o
acionamento do motor de passo, estes fio comuns devem ser ligados fonte de
alimentao (+5V ou +12V) e os terminais da bobina ligados ao controle de chaveamento
do motor de passo.
Motor de 5 fios Motor de 6 fios
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 156 ]
Figura 132: Motores de passo unipolar conexo interna.
Figura 133: Identificao dos terminais do motor de Passo 28BYJ48.
Download datasheet:
https://dl.dropboxusercontent.com/u/41097376/SanUSB/DATASHEETS_Geral/28BYJ48.pdf
Para descobrir os terminais de um motor de passo, deve-se considerar que:
Para motores de 6 fios, a resistncia entre os fios comuns (Fio 1 e Fio 2) infinita por se
tratarem de bobinas diferentes.
A resistncia entre o fio comum (Fio 1) e o terminal de uma bobina a metade da
resistncia entre dois terminais desta bobina.
Para encontrar a seqncia correta dos fios para chaveamento das bobinas, pode-
se ligar manualmente o fio comum ao Vcc, e de forma alternada e seqencial, o GND
(terra) da fonte aos terminais das bobinas, verificando o movimento do motor de passo.
15.2 MODOS DE OPERAO DE UM MOTOR DE PASSO UNIPOLAR
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 157 ]
PASSO COMPLETO 1 (FULL-STEP)
-Somente meia bobina energizada a cada passo a partir
do comum;
-Menor torque;
-Pouco consumo de energia.
N do
passo
1a 2a 1b 2b Decimal
1--> 1 0 0 0 8
2--> 0 1 0 0 4
3--> 0 0 1 0 2
4--> 0 0 0 1 1
PASSO COMPLETO 2 (FULL-STEP 2)
-Duas meia-bobinas so energizadas a cada passo;
-Maior torque;
-Consome mais energia que o Passo completo 1.
N do
passo
1a 2a 1b 2b Decimal
1--> 1 1 0 0 8
2--> 0 1 1 0 4
3--> 0 0 1 1 2
4--> 1 0 0 1 1
Figura 134: Caractersticas e Lgica de acionamento de motor de passo.
15.3 ACIONAMENTO BIDIRECIONAL DE DOIS MOTORES DE PASSO
Como o driver de potncia ULN2803 ou ULN2804 possui internamente 8
transistores de potncia ele capaz de manipular dois motores de passo ao mesmo
tempo. Ele contm internamente oito diodos de roda livre e oito resistores de base dos
transistores, o que possibilita a ligao direta ao microcontrolador e aos motores de passo.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 158 ]
Figura 135: Conexo do motor de passo no PIC.
A bateria para motores de passo deve ter uma corrente suficiente para energizar as
bobinas do motor de passo. Dessa forma, possvel associar baterias 9V em paralelo
para aumentar a corrente de energizao ou utilizar baterias de No-Breaks. O link abaixo
mostra esse motor utilizando a ferramenta SanUSB
http://www.youtube.com/watch?v=vaegfA65Hn8.
Exemplo de cdigo em C para CCS:
OBS: Utilize sempre o ULN2803. Caso o comum esteja no Vcc, utilize o programa abaixo.
Se o comum estiver no GND, inverta high com low. Atente-se que o ULN2803 inverte os
sinais vindos dos pinos do PIC.
#include SanUSB.h
#define time 30
main(){
clock_int_4MHz();
while(1){
output_high(pin_b7);//b7, b6, b5, b4 so as 2 bobinas.
output_low(pin_b6);
output_low(pin_b5);
output_low(pin_b4);
delay_ms(time);
output_low(pin_b7);
output_high(pin_b6);
output_low(pin_b5);
output_low(pin_b4);
delay_ms(time);
output_low(pin_b7);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 159 ]
output_low(pin_b6);
output_high(pin_b5);
output_low(pin_b4);
delay_ms(time);
output_low(pin_b7);
output_low(pin_b6);
output_low(pin_b5);
output_high(pin_b4);
delay_ms(time);
}}
Cdigo Motor de Passo 28BYJ48 para CCS:
#include SanUSB.h
///COMUM - VERMELHO - VCC
///ANTIHORARIO
///LARANJA B6
///AMARELO B5
///ROSA B4
/// AZUL B3
#define time 5
main(){
clock_int_4MHz(); com a biblioteca SanUSB.h nova pode retirar esta linha
while(1){
delay_ms(time);
output_low(pin_b6); //0
output_high(pin_b5);//1
output_high(pin_b4);//1
output_high(pin_b3);//1
delay_ms(time);
output_high(pin_b6);//1
output_low(pin_b5); //0
output_high(pin_b4);//1
output_high(pin_b3);//1
delay_ms(time);
output_high(pin_b6);//1
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 160 ]
output_high(pin_b5);//1
output_low(pin_b4); //0
output_high(pin_b3);//1
delay_ms(time);
output_high(pin_b6);//1
output_high(pin_b5);//1
output_high(pin_b4); //0
output_low(pin_b3);//1
delay_ms(time);
}}
Use o shield ULN2803, mostrado abaixo, onde as 8 entradas ficam do lado
esquerdo e as 8 sadas, no direito. Nos pinos 9 e 10 conecta-se a fonte, que pode ser de
at 30 V. Lembre-se de interligar os terras das duas fontes, se for o caso.
Figura 136: Shield driver de potncia ULN2803.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 161 ]
16 SERVOMOTORES
H dois tipos de servos: os de posio, com giro de 180, e o de rotao, que possui
o giro contnuo. O Servo de Posio utilizado em antenas parablicas, em braos
robticos, na robtica mvel terrestre com o controle de pernas mecnicas e no controle de
cmeras. O Servo de Rotao prioritariamente escolhido para a locomoo por rodas.
Trata-se de dispositivos muito precisos que giram sempre o mesmo ngulo para um
dado sinal. Um servo tpico possui trs fios de ligao, normalmente preto, vermelho e
branco (ou amarelo). O condutor preto a referncia de massa da alimentao (0 volts), o
condutor vermelho a alimentao e o condutor branco (ou amarelo) o sinal de
posicionamento, como mostrado na figura abaixo que um carro para desvio de
obstculos, acionado por dois servo-motores de rotao. O sinal do servo-motor de
posio normalmente um pulso de 1 a 2 milisegundos (ms), repetido depois de um pulso
de 10 a 20ms. Com o pulso de aproximadamente 1 ms o servo move-se para um sentido e
com o impulso de 2 ms para o sentido oposto. Desse modo, com um impulso de 1,5 ms, o
servo roda para a posio central. possvel visualizar na figura abaixo servo-motores
aplicados em um rob mvel, como destacado em vermelho. O firmware para implementar
este rob pode ser encontrado no tpico 17 a seguir, que estuda sensores ultrassnicos.
Figura 137: Aplicao de servo-motores em rob mvel.
A tenso de alimentao do servomotor tipicamente de 5V, podendo variar entre
4,5V e 6V. Devido alta reduo do jogo de engrenagens, o torque que se obtm de um
servo bastante alto, considerando o seu tamanho reduzido. Lamentavelmente, os servos
consomem correntes elevadas (de 200 mA a 1 A) e introduzem rudo eltrico nos
condutores de alimentao, necessitando a aplicao de capacitores de filtro. O programa
abaixo move um servo-motor de rotao para frente e um outro para trs. Note que essa
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 162 ]
operao utilizada por robs mveis que possuem dois motores em anti-paralelo.
Observe o firmware a seguir.
#include SanUSB.h
#define motor1 pin_b5
#define motor2 pin_b6
int16 frente=50;
short int led;
main(){
clock_int_4MHz();
while (TRUE){
while (frente>0)
{ output_high(motor2); //Inicializa o pulso do motor 1
output_high(motor1); //Inicializa o pulso do motor 2
delay_ms(1);
output_low(motor1); //Termina o pulso de 1ms do motor1 sentido horrio
delay_ms(1);
output_low(motor1);
output_low(motor2) //Termina o pulso de 2ms do motor2 sentido anti-horrio
delay_ms(10);
--frente;
}
frente=50;
led=!led; //pica led a cada 50 ciclos do servo-motor, ou seja a cada 12ms*50 = 600ms
output_bit(pin_b7,led);
}}
Figura 138: Visualizao interna de um servo-motor.
O programa abaixo move um servo-motor de posio. Com o pulso de
aproximadamente 1 ms, o servo move-se para 0 graus, e com o pulso de 1,2 ms para 90
graus e com o pulso de 2 ms para 180 graus. Note que este motor utilizado em antenas
parablicas, em sistemas robticos e no controle de cmeras.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 163 ]
#include SanUSB.h //Servo-motor de parablica - 3 posies definidas: 0, 90 e 180 graus.
int16 FRENTE=200, TRAS=200; //no servo de teste 200 passos corresponderam a aprox. 1 volta
void main()
{
clock_int_4MHz();
while (1)
{
while (FRENTE>0)
{
FRENTE--;
output_high(pin_b0);
delay_ms(1); // tempo de busca de 0 graus
output_low(pin_b0);
delay_ms(10);
}
FRENTE=200;
while (TRAS>0)
{
TRAS--;
output_high(pin_b0);
delay_ms(2); // tempo de busca de 180 graus
output_low(pin_b0);
delay_ms(10);
}
TRAS=200;
output_toggle(pin_b7);
}}
O micro-servomotor da figura a seguir suporta 1,6kg e possui apenas 3 fios:
BRANCO SINAL PWM (PINO B0)
VERMELHO VCC (5V) +
PRETO GND (0V) -
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 164 ]
Figura 139: Micro-servomotor 1,6kg com placa SanUSB.
Abaixo, possvel observar a mesma ligao feita para o servo de maior porte, 10kg.
Figura 140: Micro-servomotor 10kg com placa SanUSB.
Cdigo em C para CCS Micro-servomotor:
#include SanUSB.h
int x;
void main()
{
//clock_int_4MHz(); observe na biblioteca SanUSB.h se j inseriu esta funo
while (1){
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta //e entra
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 165 ]
em estado de gravao
output_high(pin_b7);
for(x=0;x<40;x++){
output_high(pin_b0);
delay_ms(2);
output_low(pin_b0);
delay_ms(10);
}
for(x=0;x<40;x++){
output_high(pin_b0);
delay_ms(1);
output_low(pin_b0);
delay_ms(11);
}
for(x=0;x<40;x++){
output_high(pin_b0);
delay_ms(0);
output_low(pin_b0);
delay_ms(12);
}}}
Cdigo em C para CCS Servomotor:
#include SanUSB.h
int x;
void main()
{
//clock_int_4MHz();
while (1){
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta //e entra
em estado de gravao
output_high(pin_b7);
for(x=0;x<200;x++){//anti horario
output_high(pin_b0);
delay_ms(2);
output_low(pin_b0);
delay_ms(8);
}
for(x=0;x<40;x++){//parado
output_high(pin_b0);
delay_ms(0);
output_low(pin_b0);
delay_ms(10);
}
for(x=0;x<200;x++){//horario
output_high(pin_b0);
delay_ms(1);
output_low(pin_b0);
delay_ms(9);
}}}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 166 ]
17 ULTRASSOM
O sensor de ultrassom, ver Figura abaixo, funciona de forma satisfatria mesmo em
um ambiente hostil, com ou sem a presena de luz ou com a presena de fumaa ou
gases. Com este sensor implementado em um mdulo robtico, por exemplo, o rob
poder se locomover e identificar objetos, auxiliando assim o usurio a direcion-lo para
uma nova rota, ou permitindo que o mesmo tome atitudes autnomas. O sensor
ultrassnico SR-04, mostrado abaixo, pode identificar objetos a uma distncia de 2 a 450
cm.
Figura 141: Sensor ultrassom.
O firmware mostrado abaixo implementa o sensor ultrassnico em um rob mvel
controlado via Bluetooth e baseado em servomotores, estudados no item anterior.
possvel ajustar a distncia de deteco de obstculos na varivel dist.
Ao ser solicitado pelo usurio que o rob faa o movimento de r, o sensor de
ultrassom, que pode estar fixo ao eixo de um micro servomotor, movimentado por 180
no intuito de verificar se h algum obstculo prximo. A distncia sensvel ao objeto pode
ser alterada de 2 cm a 450 cm na programao feita no PIC atravs da placa SanUSB. Se
o espao estiver livre, o rob deslocado para trs por 2 cm; caso contrrio, permanece
imvel, permitindo o deslocamento somente para frente ou para os lados.
#include <SanUSB_BLUE_R.h>
#use rs232(baud=19200, xmit=pin_c6, rcv=pin_c7)
int x,obstaculo=0;
short int pisca=0;
char comando;
//ULTRASSOM INCIO
#define trig pin_c1
#define echo input(pin_c2)
#define dist 10 //distncia desejada
int16 mide_distancia(void){
int16 centimetros=0;
output_high(trig);
delay_us(50);
output_low(trig);
while(echo==0);
while(echo==1){
centimetros++;
delay_us(58);
}
delay_ms(50);
return(centimetros);}
//ULTRASSOM FIM
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 167 ]
#INT_RDA
void recepcao_serial()
{
comando=getc();
switch (comando)
{
case 'P' : {output_toggle(pin_B7);printf ("\r\n FRENTE \r\n");
// comando P recebido via bluetooth
for(x=0;x<20;x++){//frente
output_high(pin_b0);
delay_ms(1);
output_high(pin_b1);
delay_ms(1);
output_low(pin_b0);
output_low(pin_b1);
delay_ms(8);
}}
break;
case 'T' : { output_toggle(pin_B7);printf ("\r\n TRAS \r\n");
// comando T recebido via bluetooth
//MICROSERVO atua procurando obstculo
for(x=0;x<30;x++){//esquerda
output_high(pin_b2);
delay_ms(1);
output_low(pin_b2);
delay_ms(10);
}
//Ultrassom Verifica
if(mide_distancia() < dist){ // se detectar obstculo na faixa definida...
output_high(pin_b7);
obstaculo=1;
}
if(mide_distancia() > dist){
output_low(pin_b7);
obstaculo=0;
}
//MICROSERVO
for(x=0;x<30;x++){//direita
output_high(pin_b2);
delay_ms(2);
output_low(pin_b2);
delay_ms(10);
}
//Ultrassom Verifica
if(mide_distancia() < dist){
output_high(pin_b7);
obstaculo=1;
}
if(mide_distancia() > dist){
output_low(pin_b7);
obstaculo=0;
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 168 ]
}
if (obstaculo==0){//s vai para trs se no houver obstculo
for(x=0;x<20;x++){//tras
output_high(pin_b1);
delay_ms(1);
output_high(pin_b0);
delay_ms(1);
output_low(pin_b0);
output_low(pin_b1);
delay_ms(10);
}}
}
break;
case 'L': { output_toggle(pin_B7);printf ("\r\n ESQUERDA \r\n");
for(x=0;x<20;x++){//esquerda
output_high(pin_b1);
delay_ms(1);
output_high(pin_b0);
delay_ms(0);
output_low(pin_b0);
output_low(pin_b1);
delay_ms(10);
}}
break;
case 'D': { output_toggle(pin_B7);printf ("\r\n DIREITA \r\n");
for(x=0;x<20;x++){//direita
output_high(pin_b0);
delay_ms(2);
output_high(pin_b1);
delay_ms(0);
output_low(pin_b0);
output_low(pin_b1);
delay_ms(10);
}
} //Recebe B e Transmite byte A para teste
break;
}}
void main()
{
enable_interrupts(GLOBAL); // Possibilita todas interrupcoes
enable_interrupts(INT_RDA); // Interrupcao da serial
output_toggle(pin_B7);// pisca Led
delay_ms (100);
while(1)
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1, reseta e entra em estado de gravao
//ULTRASSOM VERIFICA
if(mide_distancia() < dist){
output_high(pin_b7);
obstaculo=1;
}
if(mide_distancia() > dist){
output_low(pin_b7);
obstaculo=0;
} }}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 169 ]
18 FOTOACOPLADORES E SENSORES INFRAVERMELHOS
Fotoacopladores ou optoisoladores proporcionam a isolao de sinais em uma
grande variedade de aplicaes. Tambm chamados de acopladores ticos, eles comutam
ou transmitem sinais e informaes ao mesmo tempo que isolam diferentes partes de um
circuito.
Optoisoladores lineares so usados para isolar sinais anlogos at 10MHz,
enquanto optoisoladores digitais so usados para controle, indicao de estados, isolao
de sinais de comando e mudanas de nveis lgicos.
Existem fotoacopladores de diversos tipos e com construes internas diversas,
como, por exemplo, acopladores onde a construo interna baseada em um diodo
infravermelho e um fototransistor. Como exemplo podemos citar o 4N25 e o TIL111:
Figura 142: Visualizao interna de um Fotoacoplador.
Esse dispositivo pode ser utilizado por um microcontrolador para identificar a
presena de tenso 220VAC em um determinado ponto. A potncia mxima dissipada por
esse componente de 250mW em 25 graus Celsius. Dessa forma, deve-se dimensionar
um resistor em srie com o foto-diodo interno para proteg-lo.
Escolhendo resistores so de 333mW, ou seja, a potncia mxima que pode ser
dissipada em cada um deles. interessante que exista um certo intervalo de segurana
entre a potncia mxima do componente e a potncia mxima dissipada. Ento, a potncia
mxima escolhida para os resistores de 200mW. Na Equao (6.1) calculado o resistor
que ser utilizado no circuito, considerando a tenso de pico. Considere 311V como a
tenso de pico.
P=V
2
/R -> 0,2W = (311)
2
/R -> R=483 K.
O resistor comercial mais prximo desse valor 470K.
Figura 143: Aplicao de um fotoacoplador.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 170 ]
18.1 TRANSMISSOR E RECEPTOR IR
Os transmissores e receptores IR (infrared ou Infravermellhos) so muito utilizados
como sensor tico por reflexo difusa para registro de posio. A figura abaixo mostra o
circuito do sensor e um grfico do sinal de sada (em mV) do receptor IR em funo da
distncia perceptvel pelo receptor IR com resistor de elevao de tenso para 5V (pull-up
2K2). O vdeo http://www.youtube.com/watch?v=18w0Oeaco4U mostra essa variao, com
o acionamento de um led pela queda do sinal analgico atarvs da conduo do receptor
IR.
Figura 144: Esquema Par infavermelho.
Se o receptor no for escuro, preto ou azul, mas sim transparente, deve-se diferenciar como
mostra a Figura a seguir. O Emissor visto frontalmente apresenta contato circular, enquanto o
receptor, quadrado.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 171 ]
Figura 145: Conexo do par infravermelho: TIL 32 (emissor) e TIL 78 (receptor).
Para ter um maior alcance e perceber uma maior variao de posio, com esse
sensor, aconselhvel utilizar o conversor AD de 10 bits do microcontrolador para
identificar variaes de at 5mV no sinal do sensor. A distncia tima a distncia em que
incide no receptor a maior parte do feixe de luz emitido pelo transmissor. Nessa distncia
ocorre a maior variao (queda) do sinal de sada analgico do receptor IR.
Utilizando o princpio on/off, s h identificao de posio quando o sinal do
receptor for menor ou igual a 2,5V (nvel lgico baixo), o que torna o sensoreamento muito
limitado.
Durante os testes desse circuito foi verificado que, devido a resistncia de 390 em
paralelo com 2K2, quando o led conectado no circuito, h uma diminuio na variao do
sinal de sada analgico do receptor IR. O programa abaixo mostra a leitura em mV do
sensor tico via emulao serial.
#include SanUSB.h //Leitura de tenso em mV com variao de um potencimetro
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int32 tensao;
main() {
TIL 78
receptor
TIL 32
emissor
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 172 ]
clock_int_4MHz();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
setup_adc_ports(AN0); //Habilita entrada analgica - A0
setup_adc(ADC_CLOCK_INTERNAL);
while(1){ //ANALGICO DIGITAL(10 bits)
set_adc_channel(0); // 5000 mV 1023
delay_ms(10); // tensao read_adc()
tensao= (5000*(int32)read_adc())/1023;
printf (usb_cdc_putc,"\r\nA tensao e' = %lu mV\r\n",tensao); // Imprime pela serial virtual
output_toggle(pin_b7);
delay_ms(500);
}}
Figura 146: Sensor Infravermelho com SanUSB em protoboard.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 173 ]
Figura 147: Sensor Infravermelho com placa SanUSB.
Cdigo em C para CCS: Sensor Infravermelho - DIGITAL
#include SanUSB.h
int32 tensao;
main() {
clock_int_4MHz();
setup_adc_ports(AN0); //Habilita entrada analgica - A0
setup_adc(ADC_CLOCK_INTERNAL);
while(1){ //ANALGICO DIGITAL(10 bits)
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta
//e entra em estado de gravao
set_adc_channel(0); // 5000 mV 1023
delay_ms(10); // tensao read_adc()
tensao= (4700*(int32)read_adc())/1023;//com diodo -300mV
if (tensao>3500){
output_high(pin_b6);
}
if (tensao<2500){
output_low(pin_b6);
}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 174 ]
output_toggle(pin_b7);
delay_ms(500);
}}
Cdigo em C para CCS: Sensor Infravermelho - ANALGICO
#include SanUSB.h //Leitura de tenso em mV
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int32 tensao;
main() {
clock_int_4MHz();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
setup_adc_ports(AN0); //Habilita entrada analgica - A0
setup_adc(ADC_CLOCK_INTERNAL);
while(1){ //ANALGICO DIGITAL(10 bits)
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta //e
entra em estado de gravao
set_adc_channel(0); // 5000 mV 1023
delay_ms(10); // tensao read_adc()
tensao= (5000*(int32)read_adc())/1023;
printf (usb_cdc_putc,"\r\n Tensao = %lu mV\r\n",tensao); // Imprime pela serial virtual
output_high(pin_b7);
delay_ms(500);
output_low(pin_b7);
delay_ms(500); }}
18.2 AUTOMAO E DOMTICA COM CONTROLE REMOTO UNIVERSAL
A comunicao entre uma unidade remota e um eletrodomstico, como uma TV, se
d geralmente por emisso de radiao infravermelha modulada por pulsos.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 175 ]
Figura 148: Diagrama de blocos de comunicao infravermelha.
Para tornar o sistema insensvel a interferncias e filtrar os rudos, aceitando apenas
as ordens do controle remoto, o cdigo de pulsos do emissor contm um dado binrio, que
identificado pelo decodificador do receptor.
As interferncias podem se originar de fontes estticas, isto , que no pulsam,
como o sol, lmpadas incandescentes, aquecedores, e de fontes dinmicas que so mais
intensas e geram maior interferncia, como lmpadas fluorescentes, a imagem da TV,
outros transmissores de infravermelho e etc.
O receptor, geralmente contido num nico invlucro montado no painel frontal do
televisor, entrega ao decodificador apenas os pulsos retangulares correspondentes aos
cdigos de identificao e dados, eliminando a maioria das fontes de interferncias, exceto
as que tenham a mesma frequncia de pulsos, cabendo a rejeio destas ao
Decodificador, se no tiverem o mesmo cdigo de pulsos.
Para acionar uma carga distncia basta ter o controle remoto e o receptor
infravermelho, pois ao invs de capturar o cdigo em bits emitidos pelo controle remoto
para decodificao, possvel identificar apenas o start bit desse cdigo que apresenta
nvel lgico baixo (0V) que, conectado ao pino de interrupo externa (B0) do
microcontrolador com um resistor de pull-up de 2K2, executar uma tarefa desejada como,
por exemplo, o chaveamento de um rel para acionamento de uma mquina. Um exemplo
de circuito para acionamento de cargas remotas com controle universal pode ser vista
abaixo e em http://www.youtube.com/watch?v=1l6s9xtrJl0 .
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 176 ]
Figura 149: Conexo de receptor infravermelho de TV no PIC.
Note que, se nesse caso no houver um sistema de decodificao, o receptor deve
ter um invlucro para proteo contra interferncias, pois est sujeito s fontes estticas e
dinmicas. Abaixo um programa exemplo de acionamento de um rel atravs de um
controle remoto universal.
#include SanUSB.h
short int rele;
#int_ext
void bot_ext() {
rele=!rele;
output_bit(pin_b5,rele);
delay_ms(1000); //Tempo para deixar o receptor cego por 1 seg aps a 1 atuao da //interrupo
}
main() {
clock_int_4MHz();
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_ext);//Habilita int. ext. 0 no pino B0 onde est o receptor //infravermelho
while (TRUE) {
output_toggle(pin_B7);
delay_ms(500);
}}
Para filtrar as interferncias dinmicas necessrio colocar o receptor em uma
caixa preta com um pequeno orifcio ou em um tubo feito de caneta com cola quente, como
mostra a figura abaixo, para receber somente a luz IR direcional.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 177 ]
Figura 150: Exemplo de proteo do receptor contra emisses externas de raios IR.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 178 ]
19 LCD (DISPLAY DE CRISTAL LQUIDO)
O LCD, ou seja, display de cristal lquido, um dos perifricos mais utilizados como
dispositivo de sada em sistemas eletrnicos. Ele contm um microprocessador de
controle, uma RAM interna que mantm escritos no display (DDRAM) os dados enviados
pelo microcontrolador e uma RAM de construo de caracteres especiais (CGRAM). Os
LCDs so encontrados nas configuraes previstas na Tabela abaixo.
Nmero de
Colunas
Nmero de
Linhas
Quantidade
de pinos
8 2 14
12 2 14/15
16 1 14/16
16 2 14/16
16 4 14/16
20 1 14/16
20 2 14/16
20 4 14/16
24 2 14/16
24 4 14/16
40 2 16
40 4 16
Os displays mais comuns apresentam 16 colunas e duas linhas. Eles tm
normalmente 14 pinos ou 16 pinos. Destes, oito pinos so destinados para dados ou
instruo, seis so para controle e alimentao do perifrico e dois para backlight. O LED
backlight (iluminao de fundo) serve para facilitar as leituras durante a noite. Neste caso,
a alimentao deste led faz-se normalmente pelos pinos 15 e 16, sendo o pino 15 para
ligao ao anodo e o pino 16 para o catodo. A ferramenta SanUSB tem uma biblioteca em
C para este perifrico que utiliza somente o nibble superior do barramento de dados
(D7, D6, D5 e D4), como o caso da biblioteca MOD_LCD_SANUSB.c com a seguinte
configurao:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 179 ]
Figura 151: Esquema LCD.
Figura 152: Conexo do LCD no PIC.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 180 ]
Figura 153: Display LCD com placa SanUSB.
Caso deseje praticidade, utilize o shield LCD com encaixe direto na placa SanUSB,
conforme figura a seguir. Este mdulo suporta os LCDs 16x2 azul e verde, alm do 20x4,
como mostra a figura. Caso esteja usando com o LCD big number, lembre-se de usar uma
fonte com boa corrente ou duas, uma para o PIC e outra para o LCD. Neste ltimo caso,
interligue os terras.
Vdeo do shield LCD em funcionamento:
https://www.youtube.com/watch?v=fExsyrxRu18.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 181 ]
Figura 154: Shield LCD com encaixe direto na placa SanUSB.
Cdigo em C para CCS: Escrever em LCD / Rolar Caracteres
#include SanUSB.h
#include <MOD_LCD_SANUSB.c> // RB0-RS, RB1-EN, RB2-D4, RB3-D5, RB4-//D6, //RB5-D7
main() {
clock_int_4MHz();
lcd_ini(); // Configurao inicial do LCD
while (1) {
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o //cabo, reseta //e
//entra em estado de gravao
lcd_pos_xy(1,1); // Posiciona primeira linha
printf(lcd_escreve,"** Teste LCD **");//Exibe texto '** Teste LCD **' na linha //superior
lcd_pos_xy(1,2); // Posiciona segunda linha
printf(lcd_escreve," SanUSB"); //Exibe texto 'SanUSB' na linha inferior
lcd_envia_byte(0,0x18);//rola caracteres
lcd_envia_byte(0,0x0C); //Apaga o cursor
delay_ms(500); } }
A Tabela abaixo traz um resumo das instrues mais usadas na comunicao com
os mdulos LCD.
Tabela - Instrues mais comuns
DESCRIO MODO
R
S
R/W
Cdigo
(Hex)
Display Liga (sem cursor) 0 0 0C
Desliga 0 0 0A/ 08
Limpa Display com Home cursor 0 0 01
Controle do Cursor Liga 0 0 0E
Desliga 0 0 0C
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 182 ]
Desloca para
Esquerda
0 0 10
Desloca para Direita 0 0 14
Cursor Home 0 0 02
Cursor Piscante 0 0 0D
Cursor com
Alternncia
0 0 0F
Sentido de deslocamento Para a esquerda 0 0 04
cursor ao entrar com caractere Para a direita 0 0 06
Deslocamento da mensagem Para a esquerda 0 0 07
ao entrar com caractere Para a direita 0 0 05
Deslocamento da mensagem Para a esquerda 0 0 18
sem entrada de caractere Para a direita 0 0 1C
End. da primeira posio primeira linha 0 0 80
segunda linha 0 0 C0
Utilizando as instrues do LCD
Para rolar o contedo do LCD um caractere para a direita, utilize o comando
lcd_envia_byte(0, instruo), por exemplo, lcd_envia_byte(0,0x1C) e para rolar o
contedo do LCD um caractere para a esquerda, utilize o comando
lcd_envia_byte(0,0x18).
Exemplo de uso do recurso de rolagem do display:
A seguinte seqncia de comandos, gera o efeito de uma mensagem rolando no
display. Para isso, ser necessrio declarar uma varivel do tipo INT x.
////////////////////////////Exemplo Teste LCD////////////////////////////////
#include SanUSB.h
#include <MOD_LCD_SANUSB_T.c> // RB0-RS, RB1-EN, RB2-D4, RB3-D5, RB4-D6, RB5-D7
int1 led;//varivel led
main() {
clock_int_4MHz();
lcd_ini(); // Configurao inicial do LCD
while (1) {
lcd_pos_xy(1,1); // Posiciona primeira linha
printf(lcd_escreve,"** Teste LCD **");//Exibe texto '** Teste LCD **' na linha superior
lcd_pos_xy(1,2); // Posiciona segunda linha
printf(lcd_escreve," SanUSB"); //Exibe texto 'SanUSB' na linha inferior
lcd_envia_byte(0,0x0C); //Apaga o cursor
lcd_envia_byte(0,0x18);//rola caracteres
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 183 ]
led=!led; output_bit(pin_b7,led);//inverte LED no pino b7
delay_ms(300);//aguarda 0,5 segundos
} }
Para ativar o cursor, utilize o comando lcd_envia_byte(0,0x0E). Para ativar o cursor
piscante, utilize o comando lcd_envia_byte(0,0x0F), e para desativar o cursor, use
lcd_envia_byte(0,0x0C);
Posicionando o cursor
Para posicionar o cursor no LCD, podemos usar a funo lcd_pos_xy(x,y), onde
x e y so, respectivamente, a coluna e a linha onde o cursor deve ser reposicionado.
Desta forma, caso deseje escrever algo na primeira linha do display, sem apagar a
segunda linha, basta inserir o comando lcd_pos_xy(1,1). Isso ir posicionar o cursor na
primeira linha, e primeira coluna. No entanto, tome cuidado, pois uma vez que o display
no foi apagado, as informaes antigas permanecero na primeira linha, a menos que
voc as sobrescreva.
STRING : o trecho de caracteres delimitado por aspas duplas, que ir definir como ser
a seqncia de caracteres a ser gerada. Dentro das aspas, podem ser inseridos caracteres
de texto, caracteres especiais e especificadores de formato.
No caso dos caracteres especiais, por no possurem uma representao impressa, so
compostos por uma barra invertida seguida de um smbolo, geralmente uma letra.
Exemplo de caracteres especiais : \f (limpar display), \n (nova linha), \b (voltar um
caractere), \r (retorno de carro), \g (beep), etc...
Obs: alguns caracteres especiais somente resultaro efeito em terminais seriais.
J os especificadores de formato so os locais, em meio ao texto, onde sero
inseridas as variveis que aparecero aps a STRING. Desta forma, estes especificadores
devem obedecer algumas regras, de acordo com o tipo da varivel a ser impressa.
Observe a seguinte tabela:
Tipo de
varivel
Especificador de formato e exemplos de uso
int
%u valor decimal (ex: 30)
%x valor em hexadecimal (ex: 1D)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 184 ]
%3u valor decimal alinhado com trs dgitos (ex: _30)
%03u valor decimal alinhado 3 dgitos c/ zero (ex: 030)
signed int
%i valor decimal com sinal. (ex: -2)
%02i decimal com sinal, 2 casas e zeros a esq. (ex: -02)
long
int32
%lu valor decimal (ex: 32345675);
%05lu valor decimal 5 casas c/ zeros a esquerda. (ex: 01000)
signed
long
signed
int32
%li valor decimal c/ sinal (ex: -500)
%4li valor decimal c/ sinal alinhado a esquerda (ex: -_500)
float
%f valor real. Ex: (23.313451)
%2.3f valor real c/ 2 casas inteiras, 3 decimais. Ex: (23.313)
char %c caractere. Ex: (A)
19.1 EXEMPLO: CONTROLE DE TENSO DE UMA SOLDA CAPACITIVA COM LCD
O princpio de uma solda capacitiva acontece atravs da descarga instantnea de
capacitores previamente carregados por dois terminais de solda em um ponto especfico.
Este projeto consiste em realizar o controle de tenso de uma solda capacitiva em
baixo custo, atravs de um sistema microcontrolado utilizando o PIC18F2550. Para a
leitura da tenso CC nos terminais da solda capacitiva, na ordem de 300V, necessrio
inicialmente utilizar um divisor de tenso para adequao tenso mxima do conversor
AD do microcontrolador de 5V. Esta relao do divisor compensada via software,
multiplicando o valor de tenso lido pela mesma relao de diviso. Os valores de tenso
real e tenso de referncia na ordem de 270V, que pode ser incrementada ou
decrementada por dois botes de ajuste, so mostrados em um display LCD. A ltima
tenso de referncia ajustada guardada na memria. Dessa forma, quando o sistema
reiniciado a tenso de referncia assume o ltimo valor ajustado.
Quando a tenso real e a de referncia so iguais, a alimentao de 220V do
circuito de potncia cortada pela abertura de um rel NF (normalmente fechado) e um
LED de atuao ascende indicando que a tenso de referncia foi atingida. O LED de
atuao indica a presena ou no de tenso residual nos capacitores de carga e apaga
somente aps a descarga de tenso nos terminais de solda, o que contribui para evitar
descargas de tenso nos operadores durante o manuseio da solda.
Para regular esse sistema embarcado necessrio medir a tenso nos terminais da
solda capacitiva com o multmetro e igualar com o valor atual indicado no LCD atravs do
potencimetro de ajuste do divisor de tenso. O circuito do sistema de controle de tenso e
a foto do LCD aps a montagem em protoboard indicando a tenso de referncia para
desligamento (Vref) e a tenso atual (Vat) podem ser vistos na figura abaixo.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 185 ]
Figura 155: Exemplo de aplicao do LCD.
////////////////////////////Cabealho Padro////////////////////////////////
#include SanUSB.h
#include <MOD_LCD_SANUSB.c> // RB0-RS, RB1-E, RB2-D4, RB3-D5, RB4-D6, RB5-D7
#define botaoinc pin_a4
#define botaodec pin_a5
#define rele pin_b7
#define ledrele pin_b6
unsigned int16 vref=270, guardavref, constante=100;
unsigned int32 vatual, valorAD;//Deve ser de 32 bits devido ao clculo do AD que estoura //65536
unsigned int8 baixovref, altovref; // Como vref> 256 guardar o valor em 2 bytes, posies //10 e 11 da
EEPROM interna
int1 flag1, flag2;
main() {
clock_int_4MHz();
lcd_ini(); // Configurao inicial do LCD
output_low(rele);
output_low(ledrele);
guardavref=(256*read_eeprom(10))+read_eeprom(11)+1; //+1 para compensar um bug //de decremento
no reincio
if (guardavref>=100 && guardavref<=500) {vref=guardavref;} // Resgata o ltimo valor //de referncia
adotado
setup_ADC_ports (AN0); //(Selecao_dos_pinos_analogicos)
setup_adc(ADC_CLOCK_INTERNAL ); //(Modo_de_funcionamento)
set_adc_channel(0); //(Qual_canal_vai_converter)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 186 ]
delay_ms(10);
printf(lcd_escreve,"SOLDA CAPACITIVA");
while (1) {
//********************************BOTES**********************************
if (!input(botaoinc)) {flag1=1;}
if (flag1==1 && input(botaoinc) ) {flag1=0;++vref; //se o boto foi pressionado //(flag1==1) e se o boto j
foi solto (input(botao)) incremente vref
altovref=vref/256; baixovref=vref%256;
write_eeprom(10,altovref); write_eeprom(11,baixovref); }// Como Vref>256, guarde o valor de vref nas
posices 10 e 11 da eeprom interna
if (!input(botaodec)) {flag2=1;}
if (flag2==1 && input(botaodec) ) {flag2=0;--vref; //se o boto foi pressionado (flag2==1) e se o boto j foi
solto (input(botao)) decremente vref
altovref=vref/256; baixovref=vref%256;
write_eeprom(10,altovref); write_eeprom(11,baixovref); }// guarde o valor na de vref nas posices 10 e
11 da eeprom interna
//************************************************************************
if (vatual>=vref) {output_high(rele); output_high(ledrele); } //Abre o rel, avisa com led
if (vatual<=20) {output_low(rele); output_low(ledrele);} //S desliga depois da descarga
//************************************************************************
valorAD = read_adc(); // efetua a converso A/D
vatual=((constante*5*valorAD)/1023); //Regra de trs: 5 -------- 1023
// Tenso real (mV) -------- ValorAD
lcd_pos_xy(1,2);
printf(lcd_escreve,"Vref=%lu Vat=%lu ",vref, vatual);
delay_ms(300); }}
19.2 CGRAM (RAM de gerao de caracteres especiais)
Os LCDs possuem, alm da DDRAM (RAM dinmica de dados) e ROM, tambm
uma rea de memria chamada de CGRAM (Caracter Generator RAM). Atravs da
CGRAM o programador poder definir caracteres especiais que no constam na tabela
ASCII.
Assim, quando enviamos um cdigo ASCII para o LCD, geralmente um texto com
aspas , o controlador do LCD verifica na memria ROM o mapa de bits correspondente
daquele caractere. A memria ROM possui 192 caracteres correspondentes as letras do
alfabeto, nmeros e smbolos. Quando se quer utilizar um smbolo que no existe na ROM,
este pode ser criado e armazenado na CGRAM. A CGRAM (RAM de gerao de
caracteres especiais) possui tipicamente 8 caracteres onde cada caractere possui 5 bits
horizontais e 8 bits verticais. Cada caractere da CGRAM pode ser escrito na DDRAM para
aparecer no display.
Existem 8 posies para programar caracteres especiais como, por exemplo,
smbolos e figuras. Cada caractere especial ocupa 8 bytes, pois um caractere contm 5
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 187 ]
colunas de pixels por 8 linhas de pixels e cada linha ocupa um byte. Como o padro mais
comum de caractere 5 x 7 pixels, o byte da ltima coluna igual a zero. Como mostrado
em http://www.quinapalus.com/hd44780udg.html, cada caractere desenhado gera um vetor
com um conjunto de bytes que ao ser enviado para a CGRAM poder ser mostrado pelo
LCD.
Figura 156: Criao de caracteres especiais.
Os vetores gerados podem ser programados utilizando uma varivel char de 8 bits:
char b1[8] = {4,21,14,4,10,10,10};//Desenho 1
char b2[8] = {4,14,21,4,10,10,10};//Desenho 2
char b3[8] = {14,27,27,31,27,27,27};//Desenho 3
char b4[8] = {21,14,4,4,10,17,0};//Desenho 4.
Assim, os caracteres especiais podem ser programados na CGRAM, durante a
inicializao, enviando byte a byte o vetor gerado com a funo abaixo:
for (i = 0; i < 8; i++) { //Ocupa a posio 3 (8 bytes) da CGRAM
lcd_envia_byte(1, b3[i]); }
Aps o envio para a CGRAM, o caractere pode ser utilizado a qualquer momento
como se fossem caracteres normais, lembrando que os endereos bases em hexadecimal
para gravao dos caracteres especiais, na maioria dos mdulos LCD, so
respectivamente: 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70 e 0x78. Os endereos iniciais 0
a 7 (0x00 a 0x07) da RAM so reservados como ponteiros para os endereos bases. Ento
para enviar o terceiro byte da CGRAM para a DDRAM e plotar no display basta digitar a
funo EnviaCaracter(3);
Vale salientar que, com esse princpio, possvel desenvolver jogos e criar estrias
animadas utilizando esse simples display 16x2. Video do exemplo:
http://www.youtube.com/watch?v=BFJ9g-R3ZFc Firmware disponvel em
https://dl.dropboxusercontent.com/u/101922388/SmartLCD.zip .
Para um programa que utilize com mais de 8 caracteres especiais, necessrio
programar o firmware para apagar ou sobrescrever a CGRAM com 8 novos caracteres
especiais.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 188 ]
20 MODELAGEM DE UM LUXMETRO MICROCONTROLADO COM LDR
Uma das formas utilizadas para modelar sinais lineares e no lineares de sensores
utilizando funes de aproximao por equao da reta. Esta tcnica consiste em obter o
grfico de resposta real tenso do sensor para diversas situaes. Aps a obteno do
grfico real, gerar funes lineares deste grfico atravs da equao da reta, traando
retas lineares prximas a curva real do grfico no linear.
Esta tcnica pode ser utilizada para diversos tipos de sensores, como LDR,
acelermetro, etc.
LDR significa LightDependent Resistor, ou seja, Resistor Varivel Conforme
Incidncia de Luz. Esse resistor varia sua resistncia conforme a intensidade de radiao
eletromagntica do espectro visvel que incide sobre ele.
Um LDR um transdutor de entrada (sensor) que converte a (luz) em valores de
resistncia. feito de sulfeto de cdmio (CdS) ou seleneto de cdmio (CdSe). Sua
resistncia diminui quando a luz intensa, e quando a luz baixa, a resistncia no LDR
aumenta.
Um multmetro pode ser usado para encontrar a resistncia na escurido (geralmente
acima de 1M) ou na presena de luz intensa (aproximadamente 100).
O LDR muito frequentemente utilizado nas chamadas fotoclulas que controlam o
acendimento de poste de iluminao e luzes em residncias. Tambm utilizado em
sensores foto-eltricos.
Este luxmetro tem em seu circuito sensor um LDR, um resistor divisor de tenso e
uma fonte de tenso estabilizada, como mostra a figura abaixo.
Figura 157: Circuito sensor com LDR.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 189 ]
Figura 158: Esquemtico Sensor de Luminosidade LDR.
Figura 159: Sensor de luminosidade LDR com placa SanUSB.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 190 ]
Figura 160: Sensor de luminosidade LDR com SanUSB em protoboard.
Cdigo em C para CCS: Monitoramento de Temperatura e Luminosidade via LCD e
CDC
#include SanUSB.h
#include <MOD_LCD_SANUSB.c>//biblioteca para LCD
#include <usb_san_cdc.h>//biblioteca para CDC
float tens,lux,temp;
main()
{
clock_int_4MHz();
lcd_ini();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_INTERNAL);
output_low(pin_b6);
printf (lcd_escreve," \f ");
while(1){
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta //e entra
em estado de gravao
set_adc_channel(1);
delay_ms(20);
tens=5*(float)read_adc()/1023;
if (tens>2 && tens<2.8) { lux=(3936.4-(1249*tens))/0.8; }
if (tens>=2.8 && tens<=3.8) { lux=2057.2-494*tens; }
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 191 ]
if (tens>3.8) { lux=(900-180*tens)/1.2; }
if (tens>2) { //Leitura vlida
lcd_pos_xy(1,1);
printf (usb_cdc_putc,"%.0f",lux);
delay_ms(50);
printf (usb_cdc_putc,"L");
printf (lcd_escreve,"Iluminancia: %.0f lux ",lux );
lcd_envia_byte(0,0x0C); //Apaga o cursor
}
if (tens<=2) //Leitura no vlida
{
lcd_pos_xy(1,1);
printf (usb_cdc_putc,"Erro");
delay_ms(50);
printf (usb_cdc_putc,"L");
printf (lcd_escreve,"valor fora da faixa! ");
lcd_envia_byte(0,0x0C); //Apaga o cursor
}
delay_ms(30);
set_adc_channel(0);
delay_ms(20);
temp=500*(float)read_adc()/1023;
lcd_pos_xy(1,2);
printf (usb_cdc_putc,"%.1f",temp);
delay_ms(50);
printf (usb_cdc_putc,"T");
printf (lcd_escreve,"Temperatura: %.1f oC ",temp);
lcd_envia_byte(0,0x0C); //Apaga o cursor
delay_ms(800);
output_high(pin_b6);
delay_ms(200);
output_low(pin_b6); }
}
Para obter este circuito e os valores de tenso na sada para as diferentes
luminosidades, forma tidos por ANTONIETI, B. Em que as medies da tenso de sada
foram feitas e colocadas em uma tabela juntamente com as iluminncias medidas por um
luxmetro comercial da marca MINIPA, modelo MLM-1010, de 3 dgitos , com preciso
de 4% da leitura + 0.5% do fundo de escala, na faixa de 1 a 50000 Lux. Os valores
encontrados so vistos na tabela abaixo. Os valores em negrito foram considerados como
limite de cada equao da reta.
Correspondncia entre a tenso da sada e a iluminncia
Lux 2 5 12 20 36 60 94 130 180 240 338 430 530 674 827 1000 1183 1404 1651 1923
Volt 4,9 4,9 4,8 4,7 4,5 4,3 4,1 4 3,8 3,6 3,3 3,1 3 2,8 2,7 2,5 2,4 2,3 2,1 2
Com base na tabela, foi construdo o grfico da figura a seguir.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 192 ]
Figura 161: Grfico Lux x Volt.
Para simplificar o programa do PIC, foi modelado a curva do grfico acima, dividindo-a em
trs retas como mostra a figura abaixo.
Figura 162: Modelagem matemtica dos valores obtidos.
O programa funciona da seguinte maneira: l o conversor A/D e multiplica esse valor
por sua resoluo (no caso de um converso AD de 10 bits, a resoluo de
aproximadamente 5 mV), encontrando ento a tenso (V), depois so feitas 3
comparaes (IF) para saber qual das trs equaes acima deve ser utilizada para calcular
a iluminncia (Lux). A figura abaixo mostra o novo grfico lux versus volts, utilizando as
equaes 03, 04 e 05.
Os clculos da equao geral de cada reta so mostrados a seguir:
0
500
1000
1500
2000
2500
2 2,3 2,5 2,8 3,1 3,6 4 4,3 4,7 4,9
(V)
(
L
u
x
)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 193 ]
Figura 163: Grfico lux x tenso utilizando as equaes 3, 4 e 5.
20.1 SUPERVISRIO EM DELPHI
Esta interface foi desenvolvida utilizando ambiente de programao Delphi e
atravs da emulao via USB de um canal serial COM virtual. A figura 8 mostra a tela do
supervisrio para iluminncia e temperatura.
0
500
1000
1500
2000
2500
2 2,2 2,4 2,6 2,8 3 3,2 3,4 3,6 3,8 4 4,2 4,4 4,6 4,8 5
(V)
(
L
u
x
)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 194 ]
Figura 164: Figura da tela do supervisrio para Iluminncia e Temperatura.
Veja abaixo, na figura abaixo, o esquema circuito eletrnico montado e a na figura
10, a foto do circuito montado em operao. No final do trabalho mostrado o programa
completo para ler a iluminncia no canal AD 1 e a temperatura do ambiente com um LM35
no canal AD 0.
Figura 165: Esquema eletrnico do circuito luxmetro.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 195 ]
Figura 166: Foto do circuito montado.
O luxmetro mostrado neste trabalho apresenta como uma soluo de baixo custo
para aplicaes onde no necessrio haver uma grande preciso nas medies. O
mtodo do modelagem de curva pode ser aplicado em vrias ocasies onde no se sabe a
equao que gerou o grfico proposto. Isto ratifica a versatilidade de sistemas
microcontrolados.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 196 ]
21 INTERFACE I
2
C
I
2
C significa Inter-IC (Integrated Circuit). Este barramento serial foi desenvolvido
pela Philips como o objetivo de conectar CIs e perifricos de diferentes fabricantes em um
mesmo circuito, como microcontroladores, memrias externas e relgio em tempo real,
usando o menor nmero de pinos possvel. Este protocolo serial necessita somente de
duas linhas: uma linha serial de dados (SDA) e uma de clock (SCL). Quando o baramento
no est em uso, as duas linhas ficam em nvel lgico alto foradas pelos resistores de
pull-up.
Figura 167: Barramento I
2
C.
O barramento serial, com transferncia de 8 bits por vez, possibilita comunicao
bidirecional com velocidade de 100 Kbps no modo Padro, 400 Kbps no modo Fast, ou at
3,4 Mbits/s no modo High-speed.
Esta interface apresenta a filosofia multi-master onde todo CI da rede pode
transmitir ou receber um dado, e o transmissor gera o seu prprio clock de transmisso. O
nmero mximo de CIs que podem ser conectados limitado apenas pela capacitncia
mxima do barramento de 400pF.
Um exemplo tpico de configurao I
2
C em TVs mostrado na figura abaixo:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 197 ]
Figura 168: Configurao I
2
C em TVs.
21.1 REGRAS PARA TRANSFERNCIA DE DADOS
Cada bit da linha de dados s lido quando o nvel da linha de clock est em nvel
alto.
Figura 169: Leitura de dados em comunicao.
As condies de partida e parada de transmisso so sempre geradas pelo
MASTER. O barramento considerado como ocupado aps a condio de partida, e livre
um certo perodo de tempo aps a condio de parada.
Uma transio de H para L da linha SDA (start bit) durante o tempo em que a linha
SCL permanece em H, ou seja, um dado vlido, definido como condio de partida e
uma transio de L para H da linha SDA(stop bit) durante o perodo H da linha SCL,
define uma condio de parada.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 198 ]
Figura 170: Comandos de incio e fim de comunicao.
Cada byte acompanhado de um bit de reconhecimento obrigatrio. O
reconhecimento gerado pelo MASTER no dcimo bit liberando a linha SDA (nvel alto)
durante a ocorrncia do pulso de clock de reconhecimento. Por sua vez, o CI receptor
(SLAVE) obrigado a levar a linha SDA a nvel baixo durante o perodo H do clock de
reconhecimento.
Figura 171: reconhecimento do byte.
Se o SLAVE reconhecer o endereo, mas depois de algum tempo na transferncia
no receber mais nenhum byte de dados, o MASTER dever abortar a transferncia. Esta
condio indicada pelo SLAVE, devido no gerao do reconhecimento logo aps a
recepo do primeiro byte de dados. O SLAVE deixa a linha de dados em nvel H e o
MASTER gera a condio de parada.
Caso haja uma interrupo interna no SLAVE durante a transmisso, ele dever
levar tambm a linha de clock SCL a nvel L, forando o MASTER a entrar em um modo de
espera.Para escrever um dado nos escravos necessrio enviar um byte de endereo do
escravo, onde os 4 bits mais significativos identificam o tipo de escravo (por exemplo,
memrias EEPROM 1010 ou 0xa0 e RTC 1101 ou 0xd0 (com exceo do RTC
PCF8583 cujo endereo tambm 0xa0). Os 3 bits intermedirios especificam de um at
8 dispositivos, que so discriminados nos pinos de endereo de cada escravo, e o bit
menos significativo R/W indica se a operao de leitura (1) ou escrita (0). Aps isso,
deve-se enviar uma palavra de 8 ou16 bits de endereo onde se quer escrever e depois o
dado. No final do pacote uma condio de parada (i
2
c_stop).
Figura 172: Escrita de dados.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 199 ]
Funo da biblioteca I2C que descreve essa operao de escrita em memria EEPROM:
---------------------------------------------------------------------------------------------------------------
void escreve_eeprom(byte dispositivo, long endereco, byte dado)
// Escreve um dado em um endereo do dispositivo
// dispositivo - o endereo do dispositivo escravo (0 - 7)
// endereco - o endereo da memria a ser escrito
// dado - a informao a ser armazenada
{
if (dispositivo>7) dispositivo = 7;
i2c_start();
i2c_escreve_byte(0xa0 | (dispositivo << 1)); // enderea o dispositivo livrando o LSB que
// o R\W
i2c_le_ack(); // L reconhecimento do escravo
i2c_escreve_byte(endereco >> 8); // parte alta do endereo de 16 bits
i2c_le_ack();
i2c_escreve_byte(endereco); // parte baixa do endereo de 16 bits
i2c_le_ack();
i2c_escreve_byte(dado); // dado a ser escrito
i2c_le_ack();
i2c_stop();
delay_ms(10); // aguarda a programao da memria
---------------------------------------------------------------------------------------------------------------
Para a operao de leitura de um escravo necessrio um start repetido e no final do
pacote um sinal de no-reconhecimento (nack) e uma condio de parada (i2c_stop).
Figura 173: Recepo e transmisso de dado.
A Funo da biblioteca I2C que descreve este protocolo de operao de leitura de
memria EEPROM a seguinte:
---------------------------------------------------------------------------------------------------------------
byte le_eeprom(byte dispositivo, long int endereco)
// L um dado de um endereo especificado no dispositivo
// dispositivo - o endereo do dispositivo escravo (0 - 7)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 200 ]
// endereco - o endereo da memria a ser escrito
{
byte dado;
if (dispositivo>7) dispositivo = 7;
i2c_start();
i2c_escreve_byte(0xa0 | (dispositivo << 1)); // enderea o dispositivo
i2c_le_ack();
i2c_escreve_byte((endereco >> 8)); // envia a parte alta do endereo de 16 bits
i2c_le_ack();
i2c_escreve_byte(endereco); // envia a parte baixa do endereo de 16 bits
i2c_le_ack();
i2c_start(); //repetido start
// envia comando para o escravo enviar o dado
i2c_escreve_byte(0xa1 | (dispositivo << 1)); //enderea o dispositivo e colocando em
//leitura 0xa1
i2c_le_ack();
dado = i2c_le_byte() // l o dado
i2c_nack();
i2c_stop();
return dado;
21.2 MEMRIA EEPROM EXTERNA I
2
C
Para sistemas embarcados em que so necessrios a aquisio de dados de mais
de 256 bytes (capacidade da EEPROM interna dos microcontroladores), necessria a
utilizao de memrias EEPROM externals. Os modelos mais comuns so o 24LC e
24C256 (256 Kbits que corresponde a 32Kbytes). Estas memrias possuem oito pinos e
apresentam, entre outras caractersticas, interface de comunicao I2C. A figura abaixo
mostra o circuito simples de uma EEPROM I2C ligada nn ferramenta SanUSB.
Figura 174: Uso de memria EEPROM externa via I
2
C.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 201 ]
O programa abaixo mostra o armazenamento de valores digital de tenso de 0 a
5000mV de um potencimetro, a cada segundo, em um buffer (regio de memria circular)
de 150 registros de 16 bits na memria EEPROM externa, ou seja, 300 bytes, que
mostrado via emulao serial somente quando a tecla L pressionada.
#include "SanUSBi2c.h" // Firmware para configurao e leitura por SOFTWARE de EEPROM i2c e do
relgio DS1307 (BCD): https://dl.dropboxusercontent.com/u/101922388/121007SanUSBOrig.zip
#include "i2c_sanusb.h"//Biblioteca de funcoes I2C com a placa SanUSB. RB0(SDA) e RB1(SCL)
unsigned int32 resultado, tensao_lida16;
unsigned int16 i,j,endereco16=0, posicao=0, valorgravado;
unsigned char byte1,byte2; // 2 Partes do valor da tensao_lida16
unsigned int16 conv_dec_2bytes(unsigned int16 valor16)
{//Funo auxiliar para alocar um valor de 16 bits (at 65535) em 2 bytes
//unsigned int resultado=0;
byte1= valor16%256; byte2 = valor16/256; //o que for resto (%) menos significativo
return(byte2,byte1);
}
#INT_RDA
void recepcao_serial(){}
void main(){
clock_int_4MHz();
taxa_serial(19200);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
setup_adc_ports(AN0); //Habilita entradas analgicas - A0
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
while(true){
resultado = read_adc();
tensao_lida16 = (resultado * 5000)/1023; //Valor at 16 bits (2 bytes)
sendnum(tensao_lida16); swputc(' ');
//***************************************************************************
conv_dec_2bytes(tensao_lida16);
posicao=2*endereco16; //endereo o ponteiro de 16 bits (byte 1 e byte 2)
escreve_eeprom(0, posicao, byte2); //Byte mais significativo do int16
escreve_eeprom(0, posicao+1, byte1 ); //byte menos significativo do int16
++endereco16; if (endereco16>=150){endereco16=0;} //Buffer de 300 bytes posicao<300
//***************************************************************************
if(input(pin_e3)==0){ //Clique no boto para ler o buffer gravado
send_hex(le_eeprom(0,1000)); sendsw("\n\r");//teste leitura eeprom i2c
//***************LEITURA DO BUFFER DA EEPROM EXTERNA I2C********************
for(i=0; i<10; ++i) { //150 Valores de 16 bits ou 300 de 8 bits.
for(j=0; j<15; ++j) {
valorgravado= 256*le_eeprom(0,(i*30)+2*j) + le_eeprom(0,(i*30)+2*j+1);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 202 ]
sendnum(valorgravado); swputc(' ');
}
sendsw("\n\r");
}
sendsw("\n\r");
}
//***************************************************************************
escreve_eeprom(0,1000, le_rtc(seg)); //Escreve na posicao 1000 para depurar a leitura da eeprom
output_toggle(pin_b7);
delay_ms(1000);
}
Figura 175: Leitura de valores da memria.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 203 ]
22 RTC (RELGIO EM TEMPO REAL)
O Real Time Clock I
2
C DS1307 um relgio/calendrio serial de baixo custo
controlado por um cristal externo de 32.768 Hz. A comunicao com o DS1307 atravs
de interface serial I
2
C (SCL e SDA). Oito bytes de RAM do RTC so usados para funo
relgio/calendrio e so configurados na forma Binary Coded Decimal BCD. possvel a
reteno dos dados na falta de energia utilizando uma bateria de ltio de 3V - 500mA/h
conectada ao pino 3.
Figura 176: RTC DS1307 e similar.
Para representar nmeros decimais em formato binrio, o relgio DS1307, bem
como calculadoras e computadores utilizam o cdigo BCD, que incrementa a parte alta do
byte hexadecimal quando o nmero da parte baixa maior que 9. Isto possvel somando
6 (0110b) ao resultado maior que 9. Este cdigo facilita a transmisso de dados e a
compreenso do tempo, tendo em vista que em formato hexadecimal, apresenta o valor
em decimal.
Para transformar decimal em BCD, possvel dividir o nmero binrio (byte) por 10
e colocar o resultado isolado das dezenas no nibble alto do byte BCD e o resto, ou seja, as
unidades, no nibble baixo do byte BCD.
Para iniciar o relgio DS1307, aps o power-on, necessrio incrementar os
segundos quando estiverem todos os registros da RAM em zero. A bateria GP 3.6V
garante o funcionamento do relgio e tambm o processamento do PIC16F877A. Testes
indicaram que a bateria suportou o processamento e incremento automtico do relgio por
cerca de sete horas sem alimentao externa.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 204 ]
Figura 177: Registros de tempo DS1307.
#include "SanUSBi2c.h" // Firmware para configurao serial (via bluettoh) e leitura por SOFTWARE de
EEPROM i2c e do relgio DS1307 (BCD):
https://dl.dropboxusercontent.com/u/101922388/121007SanUSBOrig.zip
#include "i2c_sanusb.h"//Biblioteca de funcoes I2C com a placa SanUSB. RB0(SDA) e RB1(SCL)
unsigned char endereco, numquant=0;
unsigned char comando[6], n=0;
short int flagA4=0, flagA5=0;
unsigned int32 resultado, tensao_lida16;
unsigned int16 i,j,endereco16=0, posicao=0, valorgravado;
unsigned char byte1,byte2; // 2 Partes do valor da tensao_lida16
unsigned int16 conv_dec_2bytes(unsigned int16 valor16)
{//Funo auxiliar para alocar um valor de 16 bits (at 65535) em 2 bytes
//unsigned int resultado=0;
byte1= valor16%256; byte2 = valor16/256; //o que for resto (%) menos significativo
return(byte2,byte1);
}
#INT_RDA
void recepcao_serial()
{ comando[n] = RCREG;
//////////FUNCAO 4: CONFIGURA RELGIO////////////////////Ex: Digitar A4H09 (Hora = 09) , A4D15 (Dia =
15).
if (comando[n]=='A'){n=0;comando[0] = 'A';} //UTILIZAR VALORES DECIMAIS EM DOIS DIGITOS. ex:06,
23, 15, etc.
if ( comando[1]== '4' && comando[2]== 'H' && n==2) { endereco=2;} //Escreve o endereco das horas
if ( comando[1]== '4' && comando[2]== 'M' && n==2) { endereco=1;} //Escreve o endereco dos minutos
if ( comando[1]== '4' && comando[2]== 'S' && n==2) { endereco=0;} //Escreve o endereco dos
segundos
if ( comando[1]== '4' && comando[2]== 'D' && n==2) { endereco=4;} //Escreve o endereco do dia
if ( comando[1]== '4' && comando[2]== 'N' && n==2) { endereco=5;} //Escreve o endereco do mes
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 205 ]
if ( comando[1]== '4' && comando[2]== 'Y' && n==2) { endereco=6;} //Escreve o endereco do ano
if ( comando[1]== '4' && comando[3]>='0'&&comando[3]<='9'&& n==3) {numquant=(comando[3]-0x30);}
if ( comando[1]== '4' && comando[4]>='0'&&comando[4]<='9'&& n==4)
{numquant=numquant*10+(comando[4]-0x30);
flagA4=1;
}
//////////////////////FUNCAO 5: L RELGIO////////////////////////////Ex: A5- L o relgio e o calendrio
if (comando[1]== '5' && n==1){flagA5=1;}
++n; if(n>=5){n=0;}
}
void main(){
clock_int_4MHz();
taxa_serial(9600);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
setup_adc_ports(AN0); //Habilita entradas analgicas - A0
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
i2i_ini();
delay_ms(500);sends(icm);delay_ms(500);sputc(26);delay_ms(500);n=0;
while(true){
if (flagA4){ flagA4=0; //Comandos A4 para Configurar o RTC
escreve_rtc(endereco, dec_para_bcd(numquant)); //Escrever em BCD no RTC
send_hex(le_rtc(hora)); swputc (':'); //Envia resultado via serial por bluetooth ou qualquer outro
modem.
send_hex(le_rtc(min)); swputc (':'); //Exemplo de resposta: 18:49:37 19/04/14
send_hex(le_rtc(seg)); swputc (' ');
send_hex(le_rtc(dia)); swputc ('/');
send_hex(le_rtc(mes)); swputc ('/');
send_hex(le_rtc(ano));
}
if (flagA5){ flagA5=0; //BCD em hexadecimal representa o decimal
send_hex(le_rtc(hora)); swputc (':');
send_hex(le_rtc(min)); swputc (':');
send_hex(le_rtc(seg)); swputc (' ');
send_hex(le_rtc(dia)); swputc ('/');
send_hex(le_rtc(mes)); swputc ('/');
send_hex(le_rtc(ano));
}
resultado = read_adc();
tensao_lida16 = (resultado * 5000)/1023; //Valor at 16 bits (2 bytes)
sendnum(tensao_lida16); swputc(' ');
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 206 ]
//***************************************************************************
conv_dec_2bytes(tensao_lida16);
posicao=2*endereco16; //endereo o ponteiro de 16 bits (byte 1 e byte 2)
escreve_eeprom(0, posicao, byte2); //Byte mais significativo do int16
escreve_eeprom(0, posicao+1, byte1 ); //byte menos significativo do int16
++endereco16; if (endereco16>=150){endereco16=0;} //Buffer de 300 bytes posicao<300
//***************************************************************************
if(input(pin_e3)==0){ //Clique no boto para ler o buffer gravado
send_hex(le_eeprom(0,1000)); //teste leitura eeprom i2c
//***************LEITURA DO BUFFER DA EEPROM EXTERNA I2C********************
for(i=0; i<10; ++i) { //150 Valores de 16 bits ou 300 de 8 bits.
for(j=0; j<15; ++j) {
valorgravado= 256*le_eeprom(0,(i*30)+2*j) + le_eeprom(0,(i*30)+2*j+1);
sendnum(valorgravado); swputc(' ');
}
sendsw("\n\r");
}
sendsw("\n\r");
}
//***************************************************************************
escreve_eeprom(0,1000, le_rtc(seg)); //Escreve na posicao 1000 para depurar a leitura da eeprom
output_toggle(pin_b7);
delay_ms(1000);
}
}
22.1 EXEMPLO: PROTTIPO DATALOGGER USB DE BAIXO CUSTO
Em muitos sistemas de aquisio de dados e controle necessria a medida de
algumas grandezas fsicas, como exemplo, temperatura, presso e velocidade, entre
outras. Tais grandezas so inerentes a alguns fenmenos fsicos e, em geral, sua natureza
analgica. Isto , trata-se de variveis que assumem valores contnuos e reais, diferentes
de sinais digitais que so descontnuos e expressados segundo representao binria.
Comumente quando as sadas analgicas dos sensores so processadas por sistemas
digitais, h a necessidade do condicionamento do sinal para que os sinais provenientes
dos sensores sejam adequados s caractersticas de um conversor AD. Assim, com o uso
de um microcontrolador dotado de um conversor interno AD para aquisio de dados, o
valor analgico convertido para digital processado pelo software de controle de acordo
com decises lgicas baseadas em comparaes ou em operaes matemticas.
A bateria em paralelo com a fonte de alimentao tem uma grande relevncia neste
projeto de aquisio de dados. Alm de evitar reset por queda de tenso, ela permite a
mudana da fonte de alimentao da USB para a fonte externa sem desconexo do
sistema.
O conversor TTL/EIA-232 Max232 utilizado para conexo do mdulo GPRS ao
sistema, cujos comandos AT so descritos no prximo tpico.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 207 ]
Figura 178: Datalogger.
Este sistema de aquisio de dados USB Dual Clock, ou seja, utiliza duas fontes
de clock, uma para o canal USB de 48MHz, proveniente do oscilador externo de 20MHz, e
outra para o processador na execuo do protocolo i2c, proveniente do oscilador RC
interno de 4 MHz. (#byte OSCCON=0XFD3 //Aponta o registro do oscilador interno para
configurao de 4MHz na funo Main -> OSCCON=0B01100110;).
Figura 179: Comunicao PIC com PC e via I
2
C.
/////////////////////////////////////////////////////////////////////////////////////////
//// Este programa utiliza duas fontes de clock, uma para o canal USB
//// de 48MHz proveniente do oscilador externo de 20MHz e outra para
//// o processador na execuo do protocolo i2c, proveniente do
//// oscilador interno 4 de MHz
//// O Watch Dog Timer (WDT) protege contra travamento do programa
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 208 ]
////////////////////////////Cabealho Padro///////////////////////////////////////
#include SanUSB.h
//#device ADC=8
#include ".\include\usb_san_cdc.h"// Biblioteca para comunicao serial
#include <i2c_dll16sanc.c>
char escravo,funcao,sensor,endrtc,
valorrtc1,valorrtc2,posmeme1,posmeme2,posmeme3,posmeml1,posmeml2,posmeml3,posquant1,posquant2;
unsigned int ender, endereco, val, valor,valorbcd;
unsigned int mult=2,end=0, reg, numquant;
unsigned int16 hora,horadec,minuto,minutodec,segundo,segundodec,dia,diadec; unsigned int16
mes,mesdec,ano,anodec;
unsigned int16 i, j,numpose, numposl,num16,endpromext,k,puloext,bufferdia;
int8 regi[2];
boolean led,ledint,flagwrite;
/************************************************************************
* Converso BCD P/ DECIMAL
*******************************************************************/
int bcd_to_dec(int valorb)
{
int temp;
temp = (valorb & 0b00001111);
temp = (temp) + ((valorb >> 4) * 10);
return(temp);
}
/************************************************************************
* Converso DECIMAL p/ BCD
***************************************************************/
int dec_para_bcd(unsigned int valord)
{
return((0x10*(valord/10))+(valord%10));//Coloca a parte alta da diviso por 10 no nibble mais significativo
}
//////////////////////////////////////////////////////////////////////////////////
#int_timer1
void trata_t1 ()
{--mult;
if (!mult)
{mult=2; // 2 *(48MHz/4MHz) - 4 seg
hora=le_rtc(2);
minuto=le_rtc(1);
segundo=le_rtc(0);
dia=le_rtc(4);
mes=le_rtc(5);
ano=le_rtc(6);
ledint = !ledint; // inverte o led de teste - pisca a cada 2 *12 interrupcoes = 1 seg.
output_bit (pin_b0,ledint);
reg= read_adc(); //Tenso e corrente
//escreve_eeprom(0,end,reg); no funciona a escrita i2c dentro da interrupo do timer
write_eeprom( end, reg );
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 209 ]
++end; if(end>=127){end=0;}
segundodec=bcd_to_dec(segundo);minutodec=bcd_to_dec(minuto);horadec=bcd_to_dec(hora);
diadec=bcd_to_dec(dia);mesdec=bcd_to_dec(mes);anodec=bcd_to_dec(ano);
if (segundodec==05 &&
(minutodec==00||minutodec==10||minutodec==20||minutodec==30||minutodec==40||minutodec==50))
//if
((segundodec==00||segundodec==10||segundodec==20||segundodec==30||segundodec==40||segundodec==
50))
{flagwrite=1;}
//endpromext=(minutodec/10)+(horadec*6)+((diadec-1)*24*6*2)+24*6*k;
//endpromext=(segundodec/10)+(minutodec*6); }//No aceita DE JEITO NENHUM escrever na eeprom ext
por interrupo do timer via i2c
//printf(usb_cdc_putc,"\n\rEndpromext = %lu e reg = %u \n\r, segundodec =
%lu\n\r",endpromext,reg,segundodec); //Aceita imprimir via USB
set_timer1(3036 + get_timer1()); }} // Conta 62.500 x 8 = 0,5s
//////////////////////////////////////////////////////////////////////////////////
main() {
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
OSCCON=0B01100110; //Clock interno do processador de 4MHZ
setup_adc_ports(AN0_TO_AN1); //Habilita entradas analgicas - A0 A1
setup_adc(ADC_CLOCK_INTERNAL); //Configurao do clock do conversor AD
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_timer1); // Habilita interrupcao do timer 1
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8);// inicia o timer 1 em 8 x 62500 = 0,5s
set_timer1(3036);
setup_wdt(WDT_ON); //Habilita o temporizador co de guarda - resseta se travar o programa principal ou
ficar em algum usb_cdc_getc();
while (1) {
//***********************************************************************
if (flagwrite==1) {flagwrite=0; //Flag de gravao setada na interrupo do timer quando chega a hora de
gravar
k=0;
for(k=0;k<2;k++)
{
set_adc_channel(k);
delay_ms(20);
regi[k]= read_adc(); //Tenso M1[0], correnteM1[1]
endpromext=(minutodec/10)+(horadec*6)+((diadec-1)*24*6*2)+24*6*k;
//endpromext=(segundodec/10)+(minutodec*6)+((diadec-1)*60*6*2)+60*6*k; //Para teste 60 em vez de 24
escreve_eeprom(0,endpromext, regi[k]);
printf(usb_cdc_putc,"\r\nPosicao = %lu -> Sensor[%lu] = %u\r\n",endpromext,k,regi[k]);
}
}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 210 ]
//***********************************************************************
led = !led; // inverte o led de teste
output_bit (pin_b7,led);
restart_wdt(); // Limpa a flag do WDT para que no haja reset
delay_ms(500);
//***********************************************************************
if (usb_cdc_kbhit(1)) { //verifica se acabou de chegar um novo dado no buffer de recepo, //depois o kbhit
zerado para prximo dado
escravo=usb_cdc_getc(); //comando o Byte recebido pela serial usb_cdc_putc,
if (escravo=='A')
{ funcao=usb_cdc_getc();
switch (funcao) //UTILIZAR VALORES DECIMAIS EM DOIS DIGITOS. ex:06 ou 23 ou 15
{
//***********************************************************************
case '4':
{
endrtc=usb_cdc_getc();
valorrtc1=usb_cdc_getc();
valorrtc2=usb_cdc_getc(); //Ex: A4M43 - Altera os minutos para 43
if (endrtc=='H') { endereco=2;} //Escreve o endereco das horas
if (endrtc=='M') { endereco=1;} //Escreve o endereco dos minutos
if (endrtc=='S') { endereco=0;} //Escreve o endereco dos segundos
if (endrtc=='D') { endereco=4;} //Escreve o endereco do dia
if (endrtc=='N') { endereco=5;} //Escreve o endereco do mes
if (endrtc=='Y') { endereco=6;} //Escreve o endereco do ano
if (valorrtc1>='0'&&valorrtc1<='9') {numquant=(valorrtc1-0x30);}
if (valorrtc2>='0'&&valorrtc2<='9') {numquant=numquant*10+(valorrtc2-0x30);
valor=numquant;
if (endereco==0) { if(valor>59) {valor=0;}}
if (endereco==1) { if(valor>59) {valor=0;}}
if (endereco==2) { if(valor>23) {valor=0;}}
if (endereco==4) { if(valor>31) {valor=1;}}
if (endereco==5) { if(valor>12) {valor=1;}}
if (endereco==6) { if(valor>99) {valor=0;}}
//---------Converte byte hexadecimal para byte BCD decimal --------------
valorbcd=dec_para_bcd(valor);
//-----------------------------------------------------------------------
escreve_rtc(endereco,valorbcd); //Valor1 byte BCD (decimal).
//printf(usb_cdc_putc,"\r\nVALOR ESCRITO = %2x\r\n",valorbcd);
//printf(usb_cdc_putc,"\r\nPOSICAO = %2x\r\n",endereco);
hora=le_rtc(2);minuto=le_rtc(1);segundo=le_rtc(0);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 211 ]
printf(usb_cdc_putc,"\r\nA4%2x:%2x:%2x",hora, minuto,segundo);
printf(usb_cdc_putc," %2x%2x%2x\r\n",le_rtc(4), le_rtc(5), le_rtc(6));
}
}
break;
/////////////FUNCAO 5: L RELGIO////////////////////////Ex: A5- L o relgio e o calendrio
case '5':
printf(usb_cdc_putc,"\r\nA5 %2x:%2x:%2x",le_rtc(2), le_rtc(1),le_rtc(0));
printf(usb_cdc_putc," %2x%2x%2x\r\n",le_rtc(4), le_rtc(5), le_rtc(6));
break;
//////////////FUNCAO 6: L BUFFER EEPROM/////////////////////Ex: A6 09(DIA) 0(SENSOR)
case '6':{
posmeme1=usb_cdc_getc();
posmeme2=usb_cdc_getc();
sensor=usb_cdc_getc();
if (posmeme1>='0' && posmeme1<='9') {bufferdia=(posmeme1-0x30);}
if (posmeme2>='0' && posmeme2<='9') {bufferdia=bufferdia*10+(posmeme2-0x30);}
if (sensor>='0' && sensor<='1') {k=(sensor-0x30);}
printf(usb_cdc_putc,"Buffer Sensor %lu - Dia %lu\r\n",k,bufferdia);
delay_ms(10);
//puloext=((bufferdia-1)*60*6*2)+60*6*k;// Seleciona buffer de teste de tensao
puloext=((bufferdia-1)*24*6*2)+24*6*k;// Seleciona buffer
for(i=0; i<6; ++i)
{
//for(j=0; j<60; ++j) {printf(usb_cdc_putc,"%2u ", le_eeprom(0,puloext+(i*60+j)) );}
//"%2u\n\r" para gerar grfico no excell
for(j=0; j<24; ++j){printf(usb_cdc_putc,"%2u ", le_eeprom(0,puloext+(i*24+j)) );}
delay_ms(15);
}
printf(usb_cdc_putc,"\r\n"); //posiciona prxima linha
}
break;
}}}}}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 212 ]
23 TRANSMISSO DE DADOS VIA GSM
A sigla GSM significa Global Standard Mobile ou Global System for Mobile
Communications que quer dizer Sistema Global para Comunicaes Mveis. O GSM
um sistema de celular digital baseado em diviso de tempo, como o TDMA, e
considerado a evoluo deste sistema, pois permite, entre outras coisas, a troca dos dados
do usurio entre telefones atravs do SIM Card e acesso mais rpido a servios WAP e
Internet, atravs do sistema GPRS.
A transmisso de dados GSM pode ser feita por:
- GPRS (General Package Radio Service): uma conexo em uma rede de pacote de
dados. Uma vez conectado nessa rede, o sistema estar sempre on line, podendo
transferir dados imediatamente. O GPRS compatvel com o protocolo de rede TCP/IP e
as operadoras de GSM disponibilizam um gateway para a Internet, possibilitando conectar
e controlar equipamentos wireless atravs da Internet. Como o GPRS baseado no
protocolo IP, ele necessita de autenticao de um servidor da internet.
- SMS (Short Message Service): o servio de envio/recebimento de pequenas
mensagens de texto do tipo datagrama, sem autenticao de um servidor de internet.
Os Modems GSM so controlados atravs de comandos AT. Esses comandos so
normalizados pelas normas GSM 07.07 e GSM 07.05.
A manipulao do modem pode ser realizada em algum emulador de comunicao
serial como o Hyperterminal, nele deve-se ajustar para 9600 bps,e no esquecendo de
instalar o SIM Card no modem.
23.1 COMANDOS AT PARA ENVIAR MENSAGENS SMS DE UM
COMPUTADOR PARA UM CELULAR OU MODEM GSM
A seguinte tabela lista os commandos AT para escrever e enviar mensagens SMS:
Comando AT Significado
+CMGS Envia mensagem
+CMSS Envia uma mensagem armazenada
+CMGW Escreve uma mensagem na memria
+CMGD Apaga mensagem
+CMGC Envia comando
+CMMS Envia mais mensagens
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 213 ]
Exemplo feito com um computador:
1-AT
2-OK
3- AT+CMGF=1
4- OK
5-AT+CMGS="+558588888888"//<ctrl + z (minsculo)> digita-se o texto aps >
6-> Teste de mensagem
7- OK
+CMGS: 170 OK
Abaixo est o significado de cada linha:
1- Testa conexo com o modem.
2- Modem conectado.
3- Coloca o celular no modo texto.
4- Modo texto confirmado.
5- Nmero do telefone que ir receber a mensagem.
6- O modem retorna o caractere > solicitando a mensagem a ser enviada (ao final: ctrl
z).
7- Mensagem enviada.
23.2 COMANDOS AT PARA RECEBER MENSAGENS SMS EM UM
COMPUTADOR ENVIADAS POR UM CELULAR OU MODEM GSM
A seguinte tabela lista os commandos AT para receber e enivair mensagens SMS:
Comando AT Significado
+CNMI New message indications
+CMGL Lista mensagens
+CMGR L menssagens
+CNMA Reconhecimento de nova menssagem
Exemplo feito com um computador:
AT
OK
AT+CMGF=1
OK
AT+CMGL="ALL"
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 214 ]
+CMGL: 1,"REC READ","+85291234567",,"06/11/11,00:30:29+32"
Hello, welcome to our SMS tutorial.
+CMGL: 2,"REC READ","+85291234567",,"06/11/11,00:32:20+32"
A simple demo of SMS text messaging.
Adiante apresentado um exemplo de como enviar uma mensagem SMS do modem
GSM para um celular com uso do PC. Os comandos enviados ao modem esto em negrito
para diferenciar de suas respostas.
1-AT
2-OK
3- AT+CMGF=1
4- OK
5-AT+CMGS="+558588888888"
6->Intruso
7- OK
As figuras abaixo apresentam a foto em protoboard e o circuito esquemtico para
transmisso GPRS/GSM. A conexo USB observado no esquema, foi utilizada pela
ferramenta SanUSB para a alimentao do circuito e gravao do programa no PIC
atravs do PC. O LED verde foi usado por esta ferramenta para sinalizar o momento em
que o sistema estava no modo de gravao. O vermelho simulou o acionamento do
alarme, como descrito anteriormente. As chaves conectadas aos pinos 23, 24 e 25,
representam as chaves sinalizadoras dos trs sensores utilizados. A figura abaixo mostra
tambm o dispositivo MAX232 usado na interface RS/EIA-232 entre o microcontrolador e o
modem. Este, representado na figura apenas pelo conector DB9, possui o pino 2 para
transmisso de dados e o 3 para recepo, j que se trata de um equipamento do tipo
DCE (Data Comunication Equipment).
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 215 ]
Figura 180: Esquemtico e foto do datalogger conectado ao PIC.
#include SanUSB.h
short int ledpisca;
#USE RS232 (BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7,stream=PC)
main(){
clock_int_4MHz();
printf("AT+CMGF=1\r"); //configura modo texto para o modem
ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
output_bit(pin_b7,ledpisca); // b7 recebe o valor de ledpisca
delay_ms(2000);
printf("AT+CMGS=\"+558588888888\"\r"); //5- Envia para o numero de destino
ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
delay_ms(2000);
printf("Alarme atuado\r"); //6 - escreve a mensagem para o modem GSM
putc(0x1A); // control z
ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
delay_ms(2000);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 216 ]
putc(0x0D);
while(TRUE){ output_high(pin_B7);
delay_ms(500);
output_low(pin_B7);
delay_ms(500);
}}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 217 ]
24 O PROTOCOLO MODBUS EMBARCADO
O protocolo Modbus foi desenvolvido pela Modicon Industrial Automation Systems,
hoje Schneider, para comunicar um dispositivo mestre com outros dispositivos escravos.
Embora seja utilizado normalmente sobre conexes seriais padro EIA/RS-232 e EIA/RS-
485, ele tambm pode ser usado como um protocolo da camada de aplicao de redes
industriais tais como TCP/IP sobre Ethernet.
Este talvez o protocolo de mais utilizado em automao industrial, pela sua
simplicidade e facilidade de implementao.
A motivao para embarcar um microcontrolador em uma rede MODBUS pode ser
por:
- Baixo custo;
- Tamanho reduzido;
- Alta velocidade de processameto (1 a 12 MIPs);
- Possuir 10 canais ADs internos com resoluo de 10 bits;
- Ferramentas de desenvolvimento gratuitas e possibilidade de programao da memria
de programa sem necessidade de hardware adicional, bastando uma porta USB;
- Estudo das caractersticas construtivas de hardware e de software de uma rede
MODBUS.
24.1 MODELO DE COMUNICAO
O protocolo Modbus baseado em um modelo de comunicao mestre-escravo,
onde um nico dispositivo, o mestre, pode iniciar transaes denominadas queries. O
demais dispositivos da rede (escravos) respondem, suprindo os dados requisitados pelo
mestre ou executando uma ao por ele comandada. Geralmente o mestre um sistema
supervisrio e os escravos so controladores lgico-programveis. Os papis de mestre e
escravo so fixos, quando se utiliza comunicao serial, mas em outros tipos de rede, um
dispositivo pode assumir ambos os papis, embora no simultaneamente.
Figura 181: Checagem de dados.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 218 ]
24.2 DETECO DE ERROS
H dois mecanismos para deteco de erros no protocolo Modbus serial: bits de
paridade em cada caractere e o frame check sequence ao final da mensagem. O modo
RTU utiliza como frame check sequence um valor de 16 bits para o CRC (ciclic redundance
check), utilizando como polinmio, P(x) = x
16
+ x
15
+ x
2
+ 1. O registro de clculo do CRC
deve ser inicializado com o valor 0xffff.
24.3 MODOS DE TRANSMISSO
Existem dois modos de transmisso: ASCII (American Code for Information
Interchange) e RTU (Remote Terminal Unit), que so selecionados durante a configurao
dos parmetros de comunicao.
Como a comunicao geralmente utilizada em automao industrial em modo
RTU, o projeto proposto foi desenvolvido nesta forma de comunicao.
A implementao prtica de um projeto com o modbus embarcado mostrada no
diagrama de blocos abaixo.
Figura 182: Diagrama de blocos comunicao ModBus.
Para testar a comunicao com escravo Modbus (microcontrolador) em protocolo
RTU, atravs da porta serial emulada pela USB do PC, possvel utilizar o Modbus Tester
que um software livre de Mestre MODBUS escrito em C++. Ele pode ser utilizado para
testar se o desenvolvimento das rotinas de processamento do protocolo Modbus contidas
no microcontrolador. Durante o teste possvel utilizar tambm um sistema supervisrio
real como o Elipse SCADA.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 219 ]
Figura 183: Software de teste de comunicao ModBus.
Os sistemas supervisrios so softwares que permitem que sejam monitoradas e
rastreadas informaes de um processo produtivo ou instalao fsica. Tais informaes
so coletadas atravs de equipamentos de aquisio de dados e, em seguida,
manipuladas, analisadas, armazenadas e posteriormente apresentadas ao usurio. Estes
sistemas tambm so chamados de SCADA (Supervisory Control and Data Aquisition).
Para comunicar com o supervisrio Elipse necessrio instalar um driver dedicado
a comunicao ModBus RTU, que fornecido gratuitamente pela prpria Elipse.
O modo Modbus RTU com microcontrolador PIC desse projeto, mostrado no link
http://www.youtube.com/watch?v=KUd1JkwGJNk , suporta funes de leitura (3) e
escrita (16).
#include SanUSB.h
#include <usb_san_cdc.h>// Biblioteca para comunicao serial
#byte port_a = 0xf80
#byte port_b = 0xf81
long int checksum = 0xffff;
unsigned int x,i,y,z;
unsigned char lowCRC;
unsigned char highCRC;
int tamanhodata;
int32 buffer[100];
void CRC16 (void) //Modo RTU
{
for (x=0; x<tamanhodata; x++)
{
checksum = checksum^(unsigned int)buffer[x];
for(i=8;i>0;i--)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 220 ]
{
if((checksum)&0x0001)
checksum = (checksum>>1)^0xa001;
else
checksum>>=1;
}
}
highCRC = checksum>>8;
checksum<<=8;
lowCRC = checksum>>8;
buffer[tamanhodata] = lowCRC;
buffer[tamanhodata+1] = highCRC;
checksum = 0xffff;
}
void ler (void) {
buffer[2]=usb_cdc_getc();
buffer[3]=usb_cdc_getc();
buffer[4]=usb_cdc_getc();
buffer[5]=usb_cdc_getc();
buffer[6]=usb_cdc_getc();
buffer[7]=usb_cdc_getc();
delay_ms(3);
buffer[2]=0x02;
buffer[3]=0x00;
buffer[4]=port_a; //o buffer[4] leva o valor de entrada da porta A do microcontrolador para o SCADA
tamanhodata = 5;
CRC16();
}
void rxler (void) //Leu a porta a no buffer[4] e escreve o CRC no buffer[5] e [6], pois tamanhodata = 5
{
printf(usb_cdc_putc,"%c%c%c%c%c%c%c",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5],buffer[6]);
// 6 bytes
}
void escrever (void)
{
buffer[2]=usb_cdc_getc();
buffer[3]=usb_cdc_getc();
buffer[4]=usb_cdc_getc();
buffer[5]=usb_cdc_getc();
buffer[6]=usb_cdc_getc();
buffer[7]=usb_cdc_getc();
buffer[8]=usb_cdc_getc();
buffer[9]=usb_cdc_getc();
buffer[10]=usb_cdc_getc();
delay_ms(3);
tamanhodata = 6;
CRC16();
port_b = buffer[8]; //A porta B do microcontrolador recebe o valor enviado pelo SCADA
}
void rxescrever (void)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 221 ]
{
printf(usb_cdc_putc,"%c%c%c%c%c%c%c%c",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5],buffer[6]
,buffer[7]); //7 bytes
}
main(){
clock_int_4MHz();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
set_tris_b(0b00000000);
while(1){
if (usb_cdc_kbhit(1))
{
//verifica se acabou de chegar um novo dado no buffer USB, depois o kbhit zerado para prximo dado
buffer[0]=usb_cdc_getc();
z = buffer[0];
if (z==1) //verifica se o endereco do slave e igual a 1
{
buffer[1]=usb_cdc_getc(); //verifica a funo contida no segundo byte buffer[1]
y = buffer[1]; }
if (y==3) //verifica se a funo para leitura e encaminha para leitura de varivel do microcontrolador
{
ler();
rxler(); }
if (y==16) //verifica se a funo para escrita no microcontrolador, ou seja, comando de atuao do uC
{
escrever();
rxescrever();
} } }}
O fluxograma desse firmware mostrado abaixo:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 222 ]
Figura 184: Fluxograma do sistema de comunicao ModBus.
Note que a comunicao serial desse projeto foi emulada via USB, para aplicao
em um processo real necessrio utilizar um transceptor ou TTL/EIA-232 (MAX232) ou
transceptor ou TTL/EIA-485 (MAX485). Com o MODBUS embarcado possvel integrar
um microcontrolador, preservando as limitaes de funes, em um processo de
automao industrial que utiliza esse protocolo.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 223 ]
25 INTRODUO SISTEMAS OPERACIONAIS EM TEMPO REAL
(RTOS)
Um sistema operacional em tempo real (RTOS) um programa (geralmente chamado de
kernel), que controla a alocao de tarefas quando o processador est operando em um
ambiente multitarefas (multitasking) concorrentes.
O uso de um sistema operacional em tempo real (RTOS) para processamento
de multitarefas uma realidade cada vez mais presente nos projetos de sistemas
embarcados. A ferramenta computacional SanUSB implementa um RTOS livre,
desenvolvido pelo russo Victor Timofeev, atravs dos compiladores MPLABX C18 e CCS,
baseado em interrupo de temporizadores.
Uma das principais caractersticas de um RTOS a capacidade de processar
tarefas concorrentes, ou seja, tarefas paralelas. Dessa forma, o RTOS torna a
programao de projetos reais mais simples, pois basta descrever cada tarefa em uma
funo task do firmware, que o RTOS se encarrega do gerenciamento do processo. Dessa
forma, O RTOS baseado na ideia de multitarefas (multithread), onde cada tarefa uma
funo em C do firmware em lao infinito.
Em um sistema multitarefa, inmeras tarefas exigem tempo da CPU, e uma vez que
existe apenas uma CPU, necessria alguma forma de organizao e coordenao pelo
RTOS para que cada tarefa tenha o tempo que necessita. Na prtica, cada tarefa tem um
intervalo de tempo muito curto, assim parece que as tarefas so executadas de forma
paralela e simultnea.
Como exemplo, esto disponveis uma vdeo-aula em
http://www.youtube.com/watch?v=s6BG8ZN0aDk e os programas em
https://dl.dropbox.com/u/101922388/RTOSB.zip para os compiladores CCS e MPLABX
C18. As duas prticas descritas abaixo de RTOS foram desenvolvidas com a placa
SanUSB, que pode ser construda seguindo os tutoriais disponveis em
https://dl.dropbox.com/u/101922388/121007SanUSBOrig.zip .
Prtica 1: Nesta prtica o RTOS executa em paralelo 3 tarefas concorrentes e paralelas
em loop infinito para acionar 3 leds, conectados nos pinos B7, B6 e B5, de forma
independente.
Prtica 2: Nesta prtica o RTOS executa em paralelo:
1- Tarefa de leitura do AD com potencimetro para modificar a velocidade
de brilho dos leds;
2- Tarefa de rotao de oito leds na porta B; e
3- Tarefa que inverte o sentido de rotao dos leds por boto no pino 1
(PIN_E3) utilizando display de sete segmentos como leds.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 224 ]
Figura 185: Diagrama RTOS SanUSB.
OBS: Dentro de cada projeto necessrio inserir o cabealho OSAcfg.h, como descrito
abaixo, que deve indicar a quantidade de tarefas e as caractersticas do projeto como a
prioridade das tarefas.
#ifndef _OSACFG_H
#define _OSACFG_H
#define OS_TASKS 3
#define OS_DISABLE_PRIORITY
#define OS_ENABLE_TTIMERS
Quase todos os sistemas baseados em microcontroladores executam mais de uma
atividade e trabalham em tempo real. Por exemplo, um sistema de monitoramento da
temperatura composto de trs tarefas que, normalmente, que se repete aps um
pequeno intervalo de tempo, a saber:
- Tarefa 1 l a temperatura;
- Tarefa 2 Formata o valor da temperatura;
- Tarefa 3 exibe a temperatura;
25.1 MQUINAS DE ESTADO
As mquinas de estado so simples construes usadas para executar diversas
atividades, geralmente em uma sequncia. Muitos sistemas da vida real que se enquadram
nesta categoria. Por exemplo, o funcionamento de uma mquina de lavar roupa ou
mquina de lavar loua facilmente descrito com uma mquina de estado de construo.
Talvez o mtodo mais simples de implementar uma mquina de estado em C usar um
switch-case. Por exemplo, nosso sistema de monitoramento de temperatura tem trs
tarefas, nomeado Tarefa 1, Tarefa 2, Tarefa 3 e, como mostrado na Figura abaixo.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 225 ]
Figura 186: Implementao de mquina de estado.
A mquina de estado executa as trs tarefas usando declaraes switch-case.
O estado inicial 1, incrementado a cada tarefa do Estado para selecionar o
prximo estado a ser executado. O ltimo estado seleciona o estado 1, e h um atraso no
final do switch-case. A mquina de estado executada continuamente no interior
de um lao infinito.
Figura 187: Mquina de estado implementada em Linguagem C.
Em muitas aplicaes, os estados no precisam ser executados em seqncia. Pelo
contrrio, o prximo estado selecionado direto pelo estado atual ou baseado em alguma
condio.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 226 ]
Figura 188: Selecionando o prximo estado a partir do estado atual.
O RTOS tambm o responsvel por decidir o agendamento (scheduling) da
sequncia das tarefas a serem executadas considerando os nveis de prioridade ou pelo
tempo mximo de execuo de cada tarefa.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 227 ]
26 UTILIZANDO O COMPILADOR C18 E A IDE MPLABX
MULTIPLATAFORMA COM FUNES EM PORTUGUS
Para utilizar esta ferramenta multiplataforma, instale o MPLABX e o compilador C18.
possvel baixar gratuitamente o MPLABX e a verso C18 livre e completa (full) para o
sistema operacional desejado nos links abaixo. Importante enfatizar que estas verses
so livres e foram testadas com sucesso. Outras verses podem apresentar erro na
compilao e/ou gravao. Detalhes da instalao podem ser vistos em:
http://www.youtube.com/watch?v=1EmYiiB_b8I .
Instalador de Gravao:
https://dl.dropboxusercontent.com/u/101922388/InstaladorGravacao.zip
O instalador SanUSB contm o Java JRE 6 necessrio para a instalao do MPLABX. Caso no
seja compatvel, baixe e instale o Java JRE 6 (32 ou 64 bits) ou OpenJDK6, se for Linux, antes do
MPLABX.
Compilador Windows:
http://www.4shared.com/get/3F4Uk_r1/MPLABX-v1_30-windows-installer.html
http://www.4shared.com/get/zNr7oYwX/mplabc18-v340-windows-lite-ins.html
Compilar Linux:
http://www.4shared.com/get/eThaIjBM/mplabx-ide-v141-linux-installe.html
http://www.4shared.com/get/DYhGwftJ/mplabc18-v340-linux-full-insta.html
Para instalar a IDE MPLABX no Linux aps o download, acesse a pasta Downloads
pelo terminal e, como super-usurio, digite:
chmod 770 mplabx-ide-v1.41-linux-installer.run
e depois:
./ mplabx-ide-v1.41-linux-installer.run
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 228 ]
Realize o mesmo mtodo para instalar o compilador C18.
Compilador Mac OSX:
http://www.4shared.com/get/XXEP5oc8/mplabx-ide-v141-osx-installer.html
http://www.4shared.com/get/eLoh2Vzl/mplabc18-v340.html
1) Para compilar os programas com o C18 e o SanUSB, basta abrir o Projeto1C18.X
em https://dl.dropbox.com/u/101922388/ProjSanUSB1_MPLABX/Projeto1C18.X.zip.
Todos esses programas esto disponveis no Grupo SanUSB
(www.tinyurl.com/SanUSB). A apostila atualizada pode ser obtida no link:
https://dl.dropboxusercontent.com/u/101922388/Apostila_SanUSB_MPLABX.pdf .
Depois de instalado possvel abrir o projeto MPLAX clicando em Open project e
escolher o projeto Projeto1C18.X. possvel visualizar o programa com um duplo
clique sobre pisca.c. Para compilar pressione Build and Clean (cone com martelo e
vassoura). Para compilar outros programas.c basta modifica-los ou cri-los com a
extenso .c dentro da mesma pasta do projeto Projeto1C18.X e adicion-los em Source
Files (somente um firmware por vez).
Em linux, a gravao pode ser realizada tambm pelo terminal, aps a instalao do
SanUSB. Logado como super-usurio e com o Projeto1C18.X salvo na Pasta Pessoal,
basta digitar (ou copiar e colar no terminal):
/usr/share/sanusb/sanusb w ~/Projeto1C18.X/dist/default/production/Projeto1C18.X.production.hex -r
Se no Linux Ubuntu, a pasta Projeto1C18.X no aparecer em cor de projeto
MPLABX, como um chip, basta criar um novo projeto ( File ->New Project-> Standalone
Project --> Advanced 8 bits MCU PIC18F4550 -> PicKit3 -> C18 -> Nome Projeto2 e
Finish.). Aps criar o novo projeto, basta copiar todos os arquivos da pasta
Projeto1C18.X e colar dentro do novo Projeto2.X. Pronto, basta abrir o Projeto2.X e
compilar o arquivo em Source files.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 229 ]
Figura 189: Projeto pisca LED no compilador C18.
26.1 FUNES EM PORTUGUS
Este captulo descreve todas as funes em portugus da biblioteca SanUSB no
C18. importante salientar que alm dessas funes, so vlidas as funes padres
ANSI C e tambm que as funes do compilador C18 esto descritas em cdigo aberto
dentro na biblioteca SanUSB1.h. A fim de facilitar o entendimento, as funes SanUSB
foram divididas em grupos, definidos por sua utilizao e os perifricos do hardware que
esto relacionadas.
26.1.1 FUNES BSICAS DA APLICAO DO USURIO
Este grupo de funes define a estrutura do programa uma vez que o usurio deve
escrever o programa.c de sua aplicao.
O microcontrolador possui um recurso chamado watchdog timer (wdt) que nada
mais do que um temporizador co-de-guarda contra travamento do programa. Caso seja
habilitado habilita_wdt(); na funo principal main(), este temporizador est configurado
para contar aproximadamente um intervalo de tempo de 16 segundos. Ao final deste
intervalo, se a flag limpa_wdt(); no for zerada, ele provoca um reset do microcontrolador e
consequentemente a reinicializao do programa. A aplicao deve permanentemente
zerar a flag limpa_wdt() dentro do lao infinito ( while(1){ } ) da funo principal main() em
intervalos de no mximo 16 segundos. Este recurso uma segurana contra qualquer
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 230 ]
possvel falha que venha travar o programa e paralisar a aplicao. Para zerar o wdt, o
usurio pode tambm utilizar a funo ClrWdt(); do compilador C18.
A seguir esto as caractersticas detalhadas destas funes.
clock_int_4MHz()
Funo: Habilita o clock para a processador do oscilador interno de 4MHz.
Argumentos de entrada: No h.
Argumentos de sada: No h.
Observaes: O clock padro proveniente do sistema USB interno do PIC de 48MHz
gerado a partir do cristal de 20 MHz. Isto possvel atravs de um multiplicador interno de
clock do PIC. A funo _int_4MHz() habilita, para o processador do microcontrolador, o
oscilador RC interno em 4 MHz que adqua o perodo de incremento dos temporizadores
em 1us. aconselhvel que seja a primeira declarao da funo principal
main().Exemplo:
#include SanUSB1.h
void main (void) {
clock_int_4MHz();
A seguir esto as caractersticas detalhadas destas funes.
clock_int_48MHz()
Funo: Habilita o clock para a processador do oscilador interno de 4MHz.
Observaes: O clock padro, proveniente do sistema USB interno do PIC de 48MHz
gerado a partir do cristal de 20 MHz, utilizado tambm pela CPU:
#include SanUSB48.h
void main (void) {
clock_int_48MHz();
nivel_alto()
Funo: Fora nivel lgico alto (+5V) em uma sada digital.
Argumentos de entrada: Nome da sada digital que ir para nivel lgico alto. Este nome
construdo pelo inicio pin_ seguido da letra da porta e do nmero do pino. Pode ser
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 231 ]
colocado tambm o nome de toda a porta, como por exemplo, portb.
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
nivel_alto(pin_b7); //Fora nivel lgico 1 na sada do pino B7
nivel_alto(portb); //Fora nivel lgico 1 em toda porta b
nivel_baixo()
Funo: Fora nivel lgico baixo (0V) em uma sada digital.
Argumentos de entrada: Nome da sada digital que ir para nivel lgico baixo. Este nome
construdo pelo inicio pin_ seguido da letra da porta e do nmero do pino. Pode ser
colocado tambm o nome de toda a porta, como por exemplo, portc.
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
nivel_baixo(pin_b7); //Fora nivel lgico 0 na sada do pino B7
nivel_baixo(portc); //Fora nivel lgico 0 em toda porta c
sada_pino(pino,booleano)
Funo: Acende um dos leds da placa McData.
Argumentos de entrada: Pino que ir receber na sada o valor booleano, valor booleano 0
ou 1.
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
saida_pino(pin_b0,ledpisca); // b0 recebe o valor de ledpisca
inverte_saida()
Funo: Fora nivel lgico inverso em uma sada digital.
Argumentos de entrada: Nome da sada digital que ir ser invertida. Este nome
construdo pelo inicio pin_ seguido da letra da porta e do nmero do pino.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 232 ]
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
inverte_saida(pin_b7); //Fora nivel lgico inverso na sada do pino B7
sada_pino(pino,booleano)
Funo: Acende um dos leds da placa McData.
Argumentos de entrada: Pino que ir receber na sada o valor booleano, valor booleano 0
ou 1.
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
saida_pino(pin_b0,ledpisca); // b0 recebe o valor de ledpisca
tempo_us()
Funo: Tempo em mltiplos de 1us.
Argumentos de entrada: Tempo de tempo que multiplica 1 us.
Argumentos de sada: No h.
Observaes: Esta instruo s finalizada ao final do tempo determinado, ou seja, esta
funo paralisa a leitura do programa durante a execuo. Exemplo:
tempo_us(200); //Tempo de 200 us
tempo_ms()
Funo: Tempo em mltiplos de 1 ms.
Argumentos de entrada: Tempo de tempo que multiplica 1 ms.
Argumentos de sada: No h.
Observaes: Esta instruo s finalizada ao final do tempo determinado, ou seja, esta
funo paralisa a leitura do programa durante a execuo. Exemplo:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 233 ]
tempo_ms(500); //Tempo de 500 ms
entrada_pin_xx
Funo: L nivel lgico de entrada digital de um pino.
Argumentos de entrada: No h.
Observaes: Este nome construdo pelo inicio entrada_pin_ seguido da letra da porta e
do nmero do pino.
Exemplo:
ledXOR = entrada_pin_b1^entrada_pin_b2; //OU Exclusivo entre as entradas dos
pinos b1 e b2
habilita_interrupcao()
Funo: Habilita as interrupes mais comuns do microcontrolador na funo main().
Argumentos de entrada: Tipo de interrupo: timer0, timer1, timer2, timer3, ext0, ext1, ext2,
ad e recep_serial.
Argumentos de sada: No h.
Observaes: As interrupes externas j esto habilitadas com borda de descida. Caso
se habilite qualquer interruo deve-se inserir o desvio _asm goto interrupcao _endasm
na funo void _high_ISR (void){ } da biblioteca SanUSB.h
Exemplo:
habilita_interrupcao(timer0);
habilita_interrupcao(ext1);
if(xxx_interrompeu)
Funo: Flag que verifica, dentro da funo de tratamento de interrupes, se uma
interrupo especfica ocorreu.
Complemento: timer0, timer1, timer2, timer3, ext0, ext1, ext2, ad e serial.
Argumentos de sada: No h.
Observaes: A flag deve ser zerada dentro da funo de interrupo.
Exemplo:
#programa interrupt interrupcao
void interrupcao()
{
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 234 ]
if (ext1_interrompeu) { //espera a interrupo externa 1 (em B1)
ext1_interrompeu = 0; //limpa a flag de interrupo
PORTBbits.RB0 =! PORTBbits.RB0;} //inverte o LED em B0
if (timer0_interrompeu) { //espera o estouro do timer0
timer0_interrompeu = 0; //limpa a flag de interrupo
PORTBbits.RB0 =! PORTBbits.RB0; //inverte o LED em B7
tempo_timer16bits(0,62500); } }
liga_timer16bits(timer,multiplicador)
Funo: Liga os timers e ajusta o multiplicador de tempo na funo main().
Argumentos de entrada: Timer de 16 bits (0,1ou 3) e multiplica que o valor do prescaler
para multiplicar o tempo.
Argumentos de sada: No h.
Observaes: O timer 0 pode ser multiplicado por 2, 4, 6, 8, 16, 32, 64, 128 ou 256. O
Timer 1 e o Timer 3 podem ser multiplicados por 1, 2, 4 ou 8.
Exemplo:
liga_timer16bits(0,16); //Liga timer 0 e multiplicador de tempo igual a 16
liga_timer16bits(3,8); //Liga timer 0 e multiplicador de tempo igual a 8
tempo_timer16bits(timer,conta_us)
Funo: Define o timer e o tempo que ser contado em us at estourar.
Argumentos de entrada: Timer de 16 bits (0,1ou 3) e tempo que ser contado em us (valor
mximo 65536).
Argumentos de sada: No h.
Observaes: O No h.
Exemplo:
habilita_interrupcao(timer0);
liga_timer16bits(0,16); //liga timer0 - 16 bits com multiplicador (prescaler) 16
tempo_timer16bits(0,62500); //Timer 0 estoura a cada 16 x 62500us = 1 seg.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 235 ]
habilita_wdt()
Funo: Habilita o temporizador co-de-guarda contra travamento do programa.
Argumentos de entrada: No h.
Argumentos de sada: No h.
Observaes: O wdt inicia como padro sempre desabilitado. Caso seja habilitado na
funo principal main(), este temporizador est configurado para contar aproximadamente
um intervalo de tempo de 16 segundos. Ao final deste intervalo, se a flag limpa_wdt() no
for zerada, ele provoca um reset do microcontrolador e conseqentemente a reinicializao
do programa. Exemplo:
#include SanUSB1.h
void main (void) {
clock_int_4MHz();
habilita_wdt(); //Habilita o wdt
limpaflag_wdt()
Funo: limpa a flag do wdt
Argumentos de entrada: No h.
Argumentos de sada: No h.
Observaes: Caso o wdt seja habilitado, a flag deve ser limpa em no mximo 16
segundos para que no haja reinicializao do programa. Geralmente esta funo
colocada dentro do lao infinito while(1) da funo principal main(). possvel ver detalhes
no programa exemplowdt.c e utilizar tambm a funo ClrWdt() do compilador C18 .
Exemplo:
#include SanUSB1.h
#pragma interrupt interrupcao //Tem que estar aqui ou dentro do firmware.c
void interrupcao(){}
void main (void) {
clock_int_4MHz();
habilita_wdt();
while(1) { limpaflag_wdt();
.....
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 236 ]
tempo_ms(500);
}
escreve_eeprom(posio,valor)
Funo: Escrita de um byte da memria EEPROM interna de 256 bytes do
microcontrolador.
Argumentos de entrada: Endereo da memria entre 0 a 255 e o valor entra 0 a 255.
Argumentos de sada: No h.
Observaes: O resultado da leitura armazenado no byte EEDATA.
Exemplo:
escreve_eeprom(85,09); //Escreve 09 na posio 85
le_eeprom()
Funo: Leitura de um byte da memria EEPROM interna de 256 bytes do
microcontrolador.
Argumentos de entrada: Endereo da memria entre 0 a 255.
Argumentos de sada: No h.
Observaes: O resultado da leitura armazenado no byte EEDATA.
Exemplo:
dado=le_eeprom(85);
26.2 FUNES DO CONVERSOR ANALGICO DIGITAL (A/D)
As funes a seguir so utilizadas para a aquisio de dados utilizando as entradas
analgicas.
habilita_canal_AD()
Funo: Habilita entradas analgicas para converso AD.
Argumentos de entrada: Nmero do canal analgico que ir ser lido. Este dado habilita um
ou vrios canais AD e pode ser AN0, AN0_a_AN1 , AN0_a_AN2 , AN0_a_AN3,
AN0_a_AN4, AN0_a_AN8, AN0_a_AN9, AN0_a_AN10, AN0_a_AN11, ou AN0_a_AN12.
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
habilita_canal_AD(AN0); //Habilita canal 0
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 237 ]
le_AD8bits()
Funo: Leitura de uma entrada analgica com 8 bits de resoluo.
Prototipagem: unsigned char analog_in_8bits(unsigned char).
Argumentos de entrada: Nmero do canal analgico que ir ser lido. Este nmero pode ser
0, 1 , 2 , 3, 4, 8, 9, 10, 11 ou 12.
Argumentos de sada: Retorna o valor da converso A/D da entrada analgica com
resoluo de 8 bits.
Observaes: No h.
Exemplo:
PORTB = le_AD8bits(0); //L canal 0 da entrada analgica com resoluo de 8 bits e
coloca na porta B
le_AD10bits()
Funo: Leitura de uma entrada analgica com 8 bits de resoluo.
Prototipagem: unsigned char analog_in_8bits(unsigned char).
Argumentos de entrada: Nmero do canal analgico que ir ser lido. Este nmero pode ser
0, 1 , 2 , 3, 4, 8, 9, 10, 11 ou 12.
Argumentos de sada: Retorna o valor da converso A/D da entrada analgica com
resoluo de 10 bits.
Observaes: No h.
Exemplo:
resultado = le_AD10bits(0);//L canal 0 da entrada analgica com resoluo de 10 bits.
SetaPWM1(int freqPWM, int duty);
Funo: Seta a frequncia e o ciclo de trabalho do pino de PWM1 (pin_c2).
Exemplo: for(i = 0 ; i < 100 ; i=i+5) {
SetaPWM1(10000, i);SetaPWM2(10000, i);
tempo_ms(500);
}
Exemplos de aplicao:
https://www.youtube.com/watch?v=lB21b3zA4Ac
https://www.youtube.com/watch?v=KbH3yzPHX4U
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 238 ]
26.3 FUNES DA COMUNICAO SERIAL RS-232
As funes a seguir so utilizadas na comunicao serial padro RS-232 para
enviar e receber dados, definir a velocidade da comunicao com o oscilador interno
4MHz.
As configuraes da comunicao so: sem paridade, 8 bits de dados e 1 stop bit. Esta
configurao denominada 8N1 e no pode ser alterada pelo usurio.
taxa_serial();
Funo: Configura a taxa de transmisso/recepo (baud rate) da porta RS-232
Argumentos de entrada: Taxa de transmisso/recepo em bits por segundo (bps)
Argumentos de sada: No h.
Observaes: O usurio deve obrigatoriamente configurar taxa_rs232() da comunicao
assncrona antes de utilizar as funes le_serial e escreve_serial. As taxas programveis
so 1200 bps, 2400 bps, 9600 bps, 19200 bps.
Exemplo:
void main() {
clock_int_4MHz();
habilita_interrupcao(recep_serial);
taxa_rs232(2400); // Taxa de 2400 bps
while(1); //programa normal parado aqui }
le_serial();
Funo: L o primeiro caractere recebido que est no buffer de recepo RS-232.
Argumentos de entrada: No h.
Argumentos de sada: No h.
Observaes: Quando outro byte recebido, ele armazenado na prxima posio livre
do buffer de recepo, cuja capacidade de 16 bytes. Exemplo:
#pragma interrupt interrupcao
void interrupcao()
{ unsigned char c;
if (serial_interrompeu) {
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 239 ]
serial_interrompeu=0;
c = le_serial();
if (c >= '0' && c <= '9') { c -= '0'; PORTB = c;} }}
sendrw((rom char *) );
Funo: Transmite pela serial strings ou caracteres armazenados no ROM (memria flash).
Argumentos de entrada: O dado a ser transmitido deve ser de 8 bits do tipo char.
Argumentos de sada: No h.
Exemplo: const rom char nome [] ="Serial ";
sendsw((rom char *)nome); // escreve Serial
tempo_ms(300);
sendsw((rom char *) "Outra forma de enviar\r\n");// escreve Serial
tempo_ms(300);
Caso ocorra o erro sanusb Error: Odd address at beginning of HEX file line error,
compile e grave o firmware bsico pisca.hex, tente novamente compilar e gravar o
firmware desejado. Evitar o uso da funo printf().
sendsw((char *) );
Funo: Transmite caracteres pela serial UART alocados na RAM.
Argumentos de entrada: O dado a ser transmitido deve ser de 8 bits do tipo char.
Argumentos de sada: No h.
Exemplo: const char nome [] ="Serial ";
sendsw((char *)nome); // escreve Serial
tempo_ms(300);
sendsw(( char *) "Outra forma de enviar\r\n");// escreve Serial
tempo_ms(300);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 240 ]
Caso ocorra o erro sanusb Error: Odd address at beginning of HEX file line error,
compile e grave o firmware bsico pisca.hex, tente novamente compilar e gravar o
firmware desejado. Evitar o uso da funo printf().
sendnum();
Funo: Transmite nmeros de variveis pela serial UART.
Argumentos de entrada: O dado a ser transmitido deve ser de 8 bits do tipo char.
Argumentos de sada: No h.
Exemplo: const char nome [] ="Valor= "; unsigned int ADvalue;
ADvalue=le_AD10bits(0);
sendsw((char *)nome);
sendnum(ADvalue);
tempo_ms(300);
Caso ocorra o erro sanusb Error: Odd address at beginning of HEX file line error,
compile e grave o firmware bsico pisca.c e tente novamente compilar e gravar o firmware
desejado. Evitar o uso da funo printf().
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 241 ]
27 APNDICE I: CABEALHOS DA FERRAMENTA PARA DIVERSOS
COMPILADORES
27.1 CCS C Compiler
#include <18F4550.h> //This library 18F4550.h is valid for the whole family USB PIC18Fx5xx
#device ADC=10
#fuses HSPLL,PLL5, USBDIV,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
#byte OSCCON=0XFD3
#use delay(clock=48000000)// USB standard frequency (cpu and timers 12 MIPS = 4/48MHz)
//#use delay(clock=4000000) // internal Oscillator Clock of 4MHz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
//SanUSB program memory allocation
#define CODE_START 0x1000
#build(reset=CODE_START, interrupt=CODE_START+0x08)
#org 0, CODE_START-1 {}
void clock_int_4MHz(void)
{
//OSCCON=0B01100110; //with dual clock -> cpu and timers #use delay(clock=4000000)
while(read_eeprom(0xfd));
}
27.2 C18 compiler
/* www.tinyurl.com/SanUSB */
#include "p18F4550.h"
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 242 ]
void low_isr(void);
void high_isr(void);
#pragma code low_vector=0x1018
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code
#pragma code high_vector=0x1008
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interruptlow low_isr
void low_isr (void)
{
return;
}
#pragma interrupt high_isr
void high_isr (void)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 243 ]
{
return;
}void main( void )
{ ...;
}
27.3 SDCC
Example Format:
/* www.tinyurl.com/SanUSB */
#include <pic18f4550.h>
#pragma code _reset 0x001000
void _reset( void ) __naked
{
__asm
EXTERN __startup
goto __startup
__endasm;
}
#pragma code _high_ISR 0x001008
void _high_ISR( void ) __naked
{
__asm
retfie
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 244 ]
__endasm;
}
#pragma code _low_ISR 0x001018
void _low_ISR( void ) __naked
{
__asm
retfie
__endasm; }
void main() { }
27.4 MikroC
Example Format:
/* www.tinyurl.com/SanUSB */
#pragma orgall 0x1000
void interrupt(void) org 0x1008
{
;
}
void interrupt_low(void) org 0x1018
{;}
void main()
{
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 245 ]
......;
}
27.5 Hi-Tech C Compiler
step1:goto Build option
step2:linker tap
step3:set offset : 1000
27.6 Microchip ASSEMBLY
/* www.tinyurl.com/SanUSB */
processor PIC18F4550
#include"p18f4550.inc"
org 0x1000
goto init
org 0x1020
goto int_isr
init
... ; initialization
loop
... ; code
goto loop
int_isr
... ; interrupt code
retfie
end
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 246 ]
28 APNDICE II: O AMPLIFICADOR OPERACIONAL
Um amplificador operacional (abreviadamente AmpOp) basicamente um
dispositivo amplificador de tenso, caracterizado por um elevado ganho em tenso,
impedncia de entrada elevada (no puxam corrente), impedncia de sada baixa e
elevada largura de banda. O termo operacional surgiu porque foi projetado inicialmente
para realizar operaes matemticas em computadores analgicos.
Estes dispositivos so normalmente dotados de uma malha de realimentao com
funes que transcendem a simples amplificao.
O ampop um componente que possui dois terminais de entrada e um terminal de
sada que referenciado massa. O seu smbolo eltrico, que se apresenta na Figura 1,
um tringulo que aponta no sentido do sinal. Das duas entradas, uma, assinalada com o
sinal (-) chamada de entrada inversora e a outra, a que corresponde o sinal (+)
chamada entrada no-inversora. A sada faz-se no terminal de sada que se encontra
referenciado massa. O amplificador normalmente alimentado com tenses simtricas,
tipicamente +12 V e 12 V ou +15 V e 15 V, que so aplicadas aos respectivos terminais
de alimentao V+ e V-. Note-se que nos esquemas eltricos freqentemente estes
terminais so omitidos, representando-se apenas as entradas e a sada.
Em alguns casos podem estar disponveis terminais adicionais que permitem
compensar deficincias internas do amplificador, como a tenso de desvio (ou offset).
Figura 190: Simbologia de um amplificador operacional.
Ganho de tenso - Normalmente chamado de ganho de malha aberta (sem
realimentao), medido em C.C.(ou em freqncias muito baixas), definido como a
relao da variao da tenso de sada para uma dada variao da tenso de entrada.
Este parmetro, notado como A, tem seus valores reais que vo desde alguns poucos
milhares at cerca de cem milhes em amplificadores operacionais sofisticados.
Normalmente, A o ganho de tenso diferencial em C.C.. O ganho de modo comum , em
condies normais, extremamente pequeno.
O amplificador diferencial (AmpD) o primeiro estgio de um AmpOp estabelecendo
algumas de suas principais caractersticas. Por definio um AmpD um circuito que tem
duas entradas nas quais so aplicadas duas tenses Vi1 e Vi2 e uma sada (a) ou duas
sadas (b). No caso ideal, Vo= A.(Vi1 Vi2) onde A o Ganho de tenso diferencial. Se
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 247 ]
considerarmos a condio ideal, se Vi1 = Vi2, a sada ser nula, isto , um AmpD um
circuito que amplifica s a diferena entre duas tenses rejeitando os sinais de entrada
quando estes forem iguais.
Figura 191: Circuito simplificado de um amplificador diferencial.
Geralmente, o amplificador diferencial apresenta apenas um terminal de sada (a),
pois na maioria dos circuitos um lado da carga conectado ao terra.
Os amplificadores operacionais possuem elevada impedncia de entrada e baixa
impedncia na sada. Para amplificadores operacionais como o 741, a resistncia de
entrada de 1 M, a resistncia de sada da ordem de 75 e o ganho pode chegar a
100.000.
Note em (a), que o lado da entrada positiva o mesmo lado da alimentao +Vcc e
que, quando a entrada no-inversora ou o transistor Q1 saturado, parte da corrente de
+Vcc tende a ir, passando por Rc, no sentido de Vo, gerando uma tenso na sada Vo
positiva. Quando a entrada inversora ou o transistor Q2 saturado, parte da corrente
tende a ir em sentido contrrio, gerando uma tenso na sada Vo negativa.
Na verdade, a estrutura interna de um amplificador operacional muito complexa,
sendo constitudo por dezenas de transistores e resistncias contidos numa muito
pequena pastilha de Silcio (chip). A figura 3 mostra o diagrama de componentes
internos do LM741.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 248 ]
Figura 192: Diagrama de componentes internos do LM741.
ANALOGIA DE UM AMPLIFICADOR OPERACIONAL
Um amplificador operacional alimentado pelo desequilibro das duas entradas.
Quando h uma tenso diferencial, ele satura rapidamente.
Figura 193: Analogia de um Amplificador operacional.
Essa simples analogia de um AO e o fluxo de gua est prxima da dinmica real.
medida que a diferena de fora nas duas entradas se torna finita, a pea azul gira, e a
sada conectada a umas das duas tenses de alimentao. Os canais so de tal forma
que a sada rapidamente enviada ao fornecimento +Vs ou -Vs. Quando o equilbrio entre
as entradas restaurado, ento a sada mais uma vez configurada em zero.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 249 ]
Tenso de "offset" - A sada de um amplificador operacional ideal nula quando suas
entradas esto em mesmo nvel de tenso. Nos amplificadores reais, devido
principalmente a um casamento imperfeito dos dispositivos de entrada, normalmente
diferencial, a sada do amplificador operacional pode ser diferente de zero quando ambas
entradas esto no potencial zero. Significa dizer que h uma tenso CC equivalente, na
entrada, chamada de tenso de "offset". O valor da tenso de "offset" nos amplificadores
comerciais esto situado na faixa de 1 a 100 mV. Os componentes comerciais so
normalmente dotados de entradas para ajuste da tenso de "offset".
AMPLIFICADOR OPERACIONAL REAL
Na prtica os Amp-Ops so circuitos integrados que, como qualquer sistema fsico tem
suas limitaes. Um dos Amp-Ops mais difundidos at hoje o 741, que recebe inmeras
codificaes de acordo com seu fabricante, como por exemplo: uA741, LM741 entre
outras. Os pinos 1 e 5 so destinados ao ajuste da tenso de off-set. O Amp-Op 741
mostrado na figura a seguir:
Figura 194: Representao de um amplificador operacional 741.
A descrio dos pinos a seguinte:
1 e 5 - So destinados ao ajuste da tenso de off-set
2- Entrada inversora
3- Entrada no-inversora
4- Alimentao negativa (-3V a -18V)
7- Alimentao positiva (+3V a +18V)
6- Sada
8- No possui nenhuma conexo
MODOS DE OPERAO DO AMPLIFICADOR OPERACIONAL
O amplificador operacional pode ser utilizado basicamente de trs modos distintos.
1) Sem Realimentao (Malha aberta)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 250 ]
Como foi visto, O amplificador operacional um amplificador diferencial, que
amplifica a diferena entre as tenses presentes as suas entradas. Se V
1
e V
2
forem as
tenses aplicadas s entradas no inversora e inversora respectivamente e Vo for a tenso
de sada, ento:
Vo=A (V
1
-V
2
) (1)
em que A o ganho do amplificador, dito em malha aberta (sem realimentao). Este
ganho normalmente muito elevado, sendo da ordem de 10
5
ou superior. A tenso
mxima de sada igual tenso de alimentao, por exemplo, 15 V, o que significa que
em malha aberta, uma diferena de tenso da ordem de 100mV entre as duas entradas
suficiente para elevar a sada a este valor, saturando o amplificador. Na Figura 2
representa-se esta "caracterstica de transferncia" de um amplificador operacional, isto ,
o traado da tenso de sada em funo da tenso de entrada.
Figura 195: Funo de transferncia de um amplificador operacional em malha aberta.
O amplificador operacional como um amplificador diferencial de ganho bastante alto
deixa claro que a tenso da sada levada muito rapidamente para as tenses de
alimentao. Com um ganho de cerca de 1 milho, necessria somente uma diferena
de alguns micro-volts entre as duas entradas para levar o amplificador at a saturao.
possvel ver uma pr
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 251 ]
Figura 196: Tenso de sada de um amplificador operacional em malha aberta.
Esse sistema em malha aberta tambm conhecido como comparador de tenso entre
Vi (tenso de entrada) e Vref (tenso de referncia), que nesse tem a Vref igual ao Gnd.
possvel ver uma prtica de LM 741 no link:
http://www.youtube.com/watch?v=EDol0zL96Ms
Ampl ificador Inversor com Realimentao Negativa
Esta a montagem bsica mais utilizada com amplificadores operacionais no
cotidiano de laboratrios, no interior de equipamentos que amplificam sinais, etc..
Caractersticas:
- A tenso na sada (Vo) ser nula ou a desejada quando as entradas inversora (-) e no
inversora (+) apresentem o mesmo potencial.
- Como a entrada no inversora (+) est aterrada, a entrada inversora (-) ser um
terra virtual.
- Nenhuma das entradas (em teoria) permite a passagem de corrente eltrica do exterior
para o amplificador operacional (impedncia de entrada infinita).
- Se a entrada inversora um terra virtual, temos que, simplesmente, resolver o circuito
abaixo, onde o terra virtual representado:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 252 ]
Para que haja o terra virtual necessrio que Iin = - Iout, ento:
1
2
2 1
R
R
V
V
R
V V
R
V V
in
out out in
Quase todas as aplicaes de AmpOps envolvem realimentao negativa. Nesse
caso, quando a tenso de sada aumenta, uma parte da tenso de sada realimentada
para a entrada inversora, i reduzindo a sada. Muito rapidamente, o AmpOp encontra seu
ponto operacional. Note que o ganho do AmpOp depende da relao entre R
2
e R
1
.
Exemplo de um amplificador inversor:
Nesse exemplo, o ganho de tenso com o resistor de realimentao varivel em
10K 10. Diminuindo-se o valor desse resistor, o ganho pode ficar bastante pequeno, e o
dispositivo se torna essencialmente um buffer inversor.
Amplificador Somador Inversor
Nesse circuito, a corrente i
4
igual a soma de i
1
, i
2
e i
3
. Na figura abaixo, observa-se que o
circuito um amplificador somador, em que cada entrada pode ser operada com fatores de
escala diferentes. i
4
= - e
s
/ R
4
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 253 ]
Uma das aplicaes mais utiizadas do somador inversor a realizao de um
conversor digital-analgico (DA). Com efeito, considerando, por exemplo, que as fontes de
sinal digital de entrada valem 1 V ou 0 V, e as resistncias Ri se encontram organizadas
binariamente em funo da ordem de grandeza do bit, por exemplo, R1=R, R2=R/2,
R3=R/4... Rk=R / 2
k-1
.
Dessa forma, considerando R4 igual a R e as palavras digitais 10011 e 00001 (em
decimal 19 e 1, respectivamente), os valores de tenso na sada sero:
Vo = -(16 + 0 + 0 + 2 + 1) = -19V
Vo = -(0 + 0 + 0 + 0 + 1) = -1V
Na prtica pode se considerar o valor de R4 muito maior que R para limitar o valor da
tenso mxima de sada em 5V. Uma prtica interessante construir um conversor DA a
partir de sinais digitais de uma porta do microcontrolador e conferindo o valor convertido
com um multmetro.
Amplificador de Diferena
A utilizao conjunta das entradas inversora e no-inversora permite realizar um
circuito que implementa a amplificao da diferena entre dois sinais de entrada. Neste
amplificador, a tenso de sada a diferena entre duas tenses relativas aplicadas
entrada, multiplicada pelo ganho do amplificador. O amplificador da diferena ou subtrator
mostrado na figura abaixo. Mais detalhes no no link:
Onde : Us a tenso de sada em volts (V)
U
1
e U
2
so as tenses de entrada em volts (V)
R
1
e R
4
so as resistncias em ohms ()
A tenso de sada deve ser menor do que a tenso de alimentao, pois o ganho
linear somente se no h saturao. Se U
1
for ligado ao Gnd, a sada ser igual a entrada
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 254 ]
no inversora U
2
amplificada pelo ganho (R
4
/R
1
). Dessa forma, possvel amplificar sinais
de tenso com pequena amplitude (sensores de corrente e de vibrao) e aumente a
capacidade do conversor AD. Masi detalhes podem ser visots em:
http://www.youtube.com/watch?v=Z8zXBsPa1_k .
Amplificador de Instrumentao
Muito utilizados por sensores com sinais de tenso diferenciais como termopares e
sensores de corrente. O amplificador de instrumentao representado na figura abaixo,
adota dois amplificadores no inversores (AmpOps 1 e 2) na entrada e um amplificador de
diferena (AmpOp 3) na sada. Neste caso, a resistncia de entrada vista por cada uma
das duas fontes infinita (com a mesma resistncia de entrada dos terminais positivos dos
AmpOps 1 e 2), e o ganho de tenso dado pelo produto de dois cocientes entre as
resistncias no amplificador diferencial. Nesse caso a tenso de referncia na entrada
v
s2
pode ser flutuante, ou seja, possvel amplificar faixas de tenses entre as entradas
vs1 e vs2 no simtricas.
A anlise deste circuito pode ser efetuada em trs passos:
(i) determinao das tenses V
o1
e V
o2
nas sadas no inversoras dos AmpOps 1 e
2;
Para vo1 = vo2 = 0, ento:
v1+ = v1- = v
s1
-> v
o1
= v1- + Rx . i e i = (v
s1
-v
s2
) / R -> v
o1
= v
s1
+ Rx . (v
s1
-v
s2
) / R
v2+ = v2- = v
s2
-> v
o2
= v2- - Rx . i e i = (v
s1
-v
s2
) / R -> v
o2
= v
s2 -
Rx . (v
s1
-v
s2
) / R
(ii) obteno das expresses das tenses nos respectivos ns de sada;
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 255 ]
v
o1
v
o2
= (v
s1
- v
s2
) + 2. Rx . (v
s1
-v
s2
) / R -> vo1 vo2 = (v
s1
-v
s2
) (1 + 2. Rx / R)
(iii) aplicao da expresso do amplificador diferencial no inversor para determinar a
tenso na sada do circuito.
Assim, verifica-se que:
V
o3
= R4/R3 (v
o1
v
o2
) -> V
o3
= R4/R3 (v
s1
-v
s2
) (1 + 2. Rx / R)
V
o3 /
(v
s1
-v
s2
) = R4/R3 (1 + 2. Rx / R)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 256 ]
29 CONEXES DOS MDULOS SanUSB
Figura 197: Mdulos SanUSB.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 257 ]
30.1 SENSORES
30.1.1 INFRAVERMELHO, LDR, LM35
MDULO
INFRARED
PLACA SanUSB
+ +
- -
PINO A0
MDULO LDR PLACA SanUSB
+ +
PINO A1
- -
MDULO LM35 PLACA SanUSB
+ +
PINO A0
- -
OBS: Caso deseje-se usar de forma digital (sensor
acionado ou no), pode-se usar qualquer um dos pinos
tanto do PIC 18F2550 quanto do 18F4550.
Se desejar de forma analgica, segue-se um padro em
todos os programas: pinos A0 e A1 como descrito nas
tabelas acima.
Mas pode-se optar por qualquer um destes pinos
analgicos:
PIC18F2550 PIC18F4550
N PINO REF N PINO REF
2 A0 2 A0
3 A1 3 A1
4 A2 4 A2
5 A3 5 A3
7 A4 7 A4
23 A8 8 A5
24 A9 9 A6
22 A10 10 A7
25 A11 35 A8
21 A12 36 A9
34 A10
37 A11
33 A12
INFRARED
LM35
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 258 ]
LDR
LIGAO MDULO INFRARED E PLACA SanUSB
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 259 ]
LIGAO MDULO LDR E PLACA SanUSB
LIGAO MDULO LM35 E PLACA SanUSB
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 260 ]
30.2 BOTES
MDULO
BOTO
PLACA SanUSB
PINO B0
+ +
- -
Sugere-se os pinos acima, porm pode-se
utilizar qualquer pino de qualquer das 2
placas SanUSB! Pois todos os pinos so
entradas/sadas digitais.
Mas ateno com os pinos c6 e c7 (Rx e
Tx), pois so destinados comunicao
serial / Bluetooth.
LIGAO MDULO CHAVE TCTIL / BOTO E PLACA SanUSB
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 261 ]
MDULO
CONTROLE
PLACA
SanUSB
1 B0
2 B1
3 B2
4 B3
5 B4
- -
+ +
Sugere-se os pinos acima, porm pode-se
utilizar qualquer pino de qualquer das 2
placas SanUSB! Pois todos os pinos so
entradas/sadas digitais.
Mas ateno com os pinos c6 e c7 (Rx e
Tx), pois so destinados comunicao
serial / Bluetooth.
LIGAO MDULO CONTROLE TECLAS DIRECIONAIS - E PLACA SanUSB
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 262 ]
30.3 LEDs / SEMFORO
MDULO LED PLACA
SanUSB
PINO B6
- -
Sugere-se o pino acima, porm pode-
se utilizar qualquer pino de qualquer
das 2 placas SanUSB! Pois todos os
pinos so entradas/sadas digitais.
Mas ateno com os pinos c6 e c7 (Rx
e Tx), pois so destinados
comunicao serial / Bluetooth.
MDULO
SEMFORO
PLACA
SanUSB
PIN1
LED VERDE
B5
PIN2
LED AMARELO
B6
PIN3
LED VERMELHO
B7
- -
Pinos descritos na sequncia do
mdulo.
Sugere-se os pinos acima, porm
pode-se utilizar qualquer pino de
qualquer das 2 placas SanUSB! Pois
todos os pinos so entradas/sadas
digitais.
Mas ateno com os pinos c6 e c7 (Rx
e Tx), pois so destinados
comunicao serial / Bluetooth.
O cdigo utilizado pode ser o mesmo para o mdulo
de 1 LED, a nica diferena que sero necessrios
3 pinos da placa SanUSB.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 263 ]
LIGAO MDULO SEMFORO E PLACA SanUSB
30.4 BUZZER
MDULO
BUZZER
PLACA
SanUSB
+ +
PINO B7
Sugere-se o pino acima, porm pode-
se utilizar qualquer pino de qualquer
das 2 placas SanUSB! Pois todos os
pinos so entradas/sadas digitais.
Mas ateno com os pinos c6 e c7 (Rx
e Tx), pois so destinados
comunicao serial / Bluetooth.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 264 ]
30.5 DISPLAY 7 SEG
MDULO 7SEG PLACA SanUSB
Parte superior
f1 B5
g1 B6
a1 B0
b1 B1
f2 B5
a2 B0
b2 B1
COMUM 1 A0
COMUM2 A1
Parte inferior
e1 B4
d1 B3
c1 B2
p1 (ponto 1) B7 (opcional)
e2 B4
d2 B3
g2 B6
c2 B2
p2 (ponto 2) B7 (opcional)
Interligar os pinos:
a1-a2, b1-b2, c1-c2,
d1-d2, e1-e2, f1-f2, g1-g2.
Sugere-se o pino acima, porm pode-se utilizar
qualquer pino de qualquer das 2 placas SanUSB!
Pois todos os pinos so entradas/sadas digitais.
Mas ateno com os pinos c6 e c7 (Rx e Tx), pois
so destinados comunicao serial / Bluetooth.
Link para Download dos cdigos em Linguagem C para MPLAB X e CCS / e FOTOS:
https://dl.dropboxusercontent.com/u/41097376/SanUSB/C%C3%B3digos_M%C3%93DULOS_SanUSB.rar
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais
[ 265 ]
30 REFERNCIAS BIBLIOGRFICAS
Grupo SanUSB (2013). Arquivos do Grupo SanUSB. Retirado em 05/01/13, no World Wide Web:
http://br.groups.yahoo.com/group/GrupoSanUSB/.
Juc, S. et al. (2013). Projeto e implementao de dispositivo de controle de alta temperatura
aplicado a microgeradores termoeltricos. Anais do Congresso Brasileiro de Automtica (CBA
2012). Retirado em 05/01/13, no World Wide Web:
http://www.maracanau.ifce.edu.br/~sandrojuca/MicroGTE1.pdf/.
Jornal O Povo (2011). Da escola pblica para o mundo. Retirado em 05/01/11, no World Wide
Web: http://publica.opovo.com.br/page,493,109.html?i=2086691.
Juc, S. et al.(2011). A low cost concept for data acquisition systems applied to decentralized
renewable energy plants. Retirado em 05/01/11, no World Wide Web:
http://www.mdpi.com/1424-8220/11/1/743 .
Juc, S. et al.(2011). Gravao de microcontroladores PIC via USB pelo terminal do Linux. Retirado
em 05/03/11, no World Wide Web: http://www.vivaolinux.com.br/artigo/Gravacao-de-
microcontroladores-PIC-via-USB-pelo-terminal-do-Linux/.
Grupo SanUSB (2011). Participao do Grupo SanUSB em Eventos. Retirado em 05/01/11, no
World Wide Web: http://sanusb-laese.wix.com/robotica#!premios/.
Jornal O Povo (2010). De Maracana para Eslovquia. Retirado em 05/01/11, no World Wide Web:
http://publica.hom.opovo.com.br/page,489,109.html?i=2051467.
Dirio do Nordeste (2010). Rob cearense. Retirado em 05/01/11, no World Wide Web:
http://diariodonordeste.globo.com/materia.asp?codigo=861891.
TV Dirio (2010). Feira do Empreendedorismo SEBRAE. Retirado em 05/01/11, no World Wide
Web: http://www.youtube.com/watch?v=8Y7gOPd_zN4.
TV Cidade (2009). Projetos na Mostra Nacional de Robtica 2012. Retirado em 05/01/12, no World
Wide Web: http://www.youtube.com/watch?v=lG_O8OsW_sY.
Juc, S. et al.(2009). SanUSB: software educacional para o ensino da tecnologia de
microcontroladores. Retirado em 05/01/11, no World Wide Web:
http://www.cienciasecognicao.org/pdf/v14_3/m254.pdf .
Dirio do Nordeste (2007). Alunos estimulados a construir robs. Retirado em 05/01/11, no World
Wide Web: http://diariodonordeste.globo.com/materia.asp?codigo=491710.