Escolar Documentos
Profissional Documentos
Cultura Documentos
CURITIBA
2009
SERGIO A. CHEUTCHUK
TIAGO CELUPPI
CURITIBA
2009
SERGIO A. CHEUTCHUK
TIAGO CELUPPI
AGRADECIMENTOS
Dedico este trabalho a minha esposa Elena, meus filhos Joo Gabriel e Guilherme e
aos meus pais Mariano e Maria (in memorian). Sei que a diviso do tempo entre
Universidade e vocs, no foi justa nos ltimos anos, mas de corao obrigado pela
pacincia e apoio. Sem vocs no teria conseguido mais esta Vitria.
Sergio Antonio Cheutchuk
Dedico este trabalho a minha esposa Fernanda, a meus pais Vanderlei e Maria
Alice(in memorian). Que me apoiaram em todos os momentos para que conclusse
este projeto.
Tiago Celuppi
RESUMO
O trabalho consiste no desenvolvimento de um Sistema de rastreabilidade de
processo, resultado de um estudo de caso numa linha de refrigeradores e aplicao
de tecnologias inovadoras do mercado como: RFID (identificao atravs de radio
freqncia), comunicao wirelles usando padro ZigBee IEEE 802.15.4, software
de aquisio de dados em Django e Python (Linux) com banco de dados SQLite.
Estas tecnologias so aplicadas para o desenvolvimento de um dispositivo usando
um microcontrolador PIC 18F452 da Microchip. Este dispositivo realiza uma
interface homem mquina com o usurio operador da estao de trabalho do
processo em anlise e com o servidor que o gerenciador do Sistema de
Rastreabilidade.
O Sistema visa garantir que todos os produtos fabricados nas
linhas de montagem tenham sido aprovados nos pontos de inspeo e testes
durante o processo de montagem, sendo que os dados adquiridos durante o
processo de montagem do produto, tais como resultados dos testes so
armazenados em um banco de dados para consultas posteriores.
Palavras chaves: Rastreabilidade, RFID, Wireless e ZigBee
LISTA DE ILUSTRAES
Figura 1: Diagrama em Blocos do Sistema de Rastreabilidade.................................16
Figura 2: Esquemtica do Sistema Bsico de RFID...................................................22
Figura 3: Posicionamento do Padro ZigBee.............................................................24
Figura 4: Camadas de protocolos ZigBee...................................................................26
Figura 5: Diagrama de bloco Geral.............................................................................28
Figura 6: Tag AcuProx ...............................................................................................31
Figura 7: Descrio dos pinos de conexo do PIC18F452.........................................34
Figura 8: Diagrama de caso de uso geral...................................................................38
Figura 9: Diagrama de caso de uso comunicao......................................................38
Figura 10: Diagrama de caso de uso comunicao....................................................39
Figura 11: Diagrama de caso de uso IHM..................................................................39
Figura 12: Diagrama de caso de uso consulta e incluso banco de dados...............40
Figura 13: Desenvolvimento em Laboratrio..............................................................41
Figura 14: Kit PIC Genios............................................................................................42
Figura 15: Tela 1 do LCD (Tela Inicial) ......................................................................43
Figura 16: Tela 2 do LCD (Digite a opo do menu) .................................................44
Figura 17: Tela 3 do LCD (Digite o cdigo do operador) ...........................................44
Figura 18: Tela 4 do LCD (Digite o cdigo da estao de trabalho) ..........................45
Figura 19: Tela 5 do LCD (Digite o cdigo do operador) ...........................................45
Figura 20: Testes usando o software RCom Serial ...................................................46
Figura 21: Sinais recebidos na interrupo RB0 do PIC 18F452 atraves do
osciloscopio.................................................................................................................47
Figura 22: Configurao dos Mdulos Xbee usando o Software X-CTU ..................48
Figura 23: placa CON-USBBEE .................................................................................49
Figura 24: Boto Reset e LEDs indicadores da placa CON-USBBEE.......................49
Figura 25: Circuito em protoboard em testes..............................................................50
Figura 26: Tela 6 do LCD (Visulalizacao dos dados sendo enviados ao Gerenciador
do Sistema de Rastreabilidade) .................................................................................51
Figura 27: Circuito final em placa definitiva................................................................52
.....................................................................................................................................52
LISTA DE TABELAS
Tabela 1: Tabela de conexes do leitor......................................................................33
Tabela 2: Tabela de conexes de sada serial RS232 padro ASCII.......................33
Tabela 3: Caracterstica do LCD................................................................................36
Tabela 4: especificaes dos custos..........................................................................57
Tabela 5: Tabela de Comunicao PC - PIC .............................................................60
Tabela 6: Tabela de Comunicao PC - PIC .............................................................60
LISTA DE ABREVIATURAS
ISO - International Organization for Standardization
RFID - radio frequency identification
RF - Radio frequency
WLAN - Wireless Local Area Network
WMAN -Wireless Metropolitan Area Network
WWAN - Wide Area Network
TAG - etiqueta RFID
WPAN - Wireless Personal Area Network
PAN - Personal Area Network
IEEE - Institute of Electrical and Eletronics Engineers
PC - Personal Computer
LCD - liquid crystal display
NBR - norma da Associao Brasileira de Normas Tcnicas
EPC - Electronic Product Code
SUMRIO
1 INTRODUO.......................................................................................................12
1.1 PROBLEMA.....................................................................................................14
1.2 JUSTIFICATIVA...............................................................................................14
1.3 OBJETIVOS ESPECFICOS...........................................................................15
2 FUNDAMENTAO TERICA..............................................................................17
2.1 RASTREABILIDADE.......................................................................................17
2.2 CARTAS DE CONTROLE DE PROCESSO...................................................18
2.3 SOFTWARE PARA RASTREABILIDADE.......................................................18
2.3.1 Nvel de programao e manuteno.......................................................18
2.3.2 Nvel de usurio........................................................................................19
2.4 TECNOLOGIA RFID........................................................................................20
2.4.1 RFID - Identificao por Radiofrequncia.................................................20
2.4.2 Utilizao...................................................................................................21
2.4.3 Processo de Comunicao.......................................................................21
2.4.4 Componentes da RFID.............................................................................21
2.4.5 Faixas de Frequncia................................................................................22
2.5 TECNOLOGIA ZIGBEE...................................................................................23
2.5.1 Wireless.....................................................................................................23
2.5.2 ZigBee.......................................................................................................24
2.5.3 Caractersticas do Padro ZigBee............................................................25
2.5.4 Camadas de Protocolos............................................................................25
2.5.5 Segurana.................................................................................................27
2.5.6 Tipos de Trfego.......................................................................................27
3 ESPECIFICAO TCNICA.................................................................................28
3.1 VISO GERAL DO PROJETO........................................................................28
3.1.1 Tag............................................................................................................29
3.1.2 Leitor de rdio freqncia.........................................................................29
3.1.3 Microcontrolador.......................................................................................29
3.1.4 Dispositivos de Entrada............................................................................29
3.1.5 Dispositivo de Sada.................................................................................29
INTRODUO
O sistema de rastreabilidade visa garantir que todos os produtos fabricados
1.1
PROBLEMA
1.2
JUSTIFICATIVA
1.3
OBJETIVOS ESPECFICOS
15
Fonte: Prpria
16
FUNDAMENTAO TERICA
2.1
RASTREABILIDADE
2.2
2.3
2.3.1
servidor;
2.3.2
Nvel de usurio
19
2.4
TECNOLOGIA RFID
2.4.1
2.4.2
Utilizao
2.4.3
Processo de Comunicao
2.4.4
Componentes da RFID
Fonte: http://www.hightechaid.com/tech/rfid/rfid_technology.htm
O dispositivo de leitura e responsvel pela emisso de um campo
eletromagntico que alimenta o transponder, que, por sua vez, responde ao
dispositivo de leitura com o contedo de sua memria. Os dados provenientes do
transponder so encaminhados para o computador, onde e realizado o
processamento de acordo com a aplicao em questo.
O transponder, tambm conhecido como tag, e um dispositivo que contm a
informao (seja ela, 1 bit ou n bit). O transponde funciona como uma carteira de
identidade, porm faz uso de dispositivos eletrnicos (memria, processador,
resistores, capacitores e indutores) para guardar uma informao ou gerar um sinal.
Atualmente, os transponder esto disponveis em diversos formatos, tais como
cartes, pastilhas e argolas, e em materiais como plstico, vidro, epoxi etc. Esto
classificados em duas categorias:
2.4.5
Faixas de Frequncia
2.5
TECNOLOGIA ZIGBEE
2.5.1
Wireless
23
2.5.2
ZigBee
Fonte:
http://www2.eletronica.org/artigos/eletronica-digital/as-redes-com-
zigbee
24
2.5.3
2.5.4
Camadas de Protocolos
25
Fonte:
http://www2.eletronica.org/artigos/eletronica-digital/as-redes-com-
zigbee
A camada fsica (PHY) foi projetada para acomodar as necessidades de
interfaces de baixo custo, permitindo nveis elevados de integrao. O uso da
tcnica de transmisso de Seqncia Direta (DSS) permite que os equipamentos
sejam muito simples, possibilitando implementaes mais baratas.
A camada do Media Access Control (MAC) foi projetada para permitir
topologias mltiplas com baixa complexidade, onde o gerenciamento de energia, por
exemplo, no requer modos de operao complexos. A camada MAC tambm
permite que um dispositivo com funcionalidade reduzida (RFD) opere na rede sem a
necessidade de grandes quantidades de memria disponveis, podendo controlar
tambm um grande nmero de dispositivos sem a necessidade de coloc-los "em
espera", como ocorre em algumas tecnologias sem fio.
A camada de rede foi projetada para possibilitar o crescimento da rede sem a
necessidade de equipamentos de transmisso de potncia mais elevada. A camada
de rede tambm pode operar quantidades grandes de ns de rede com latncias
relativamente baixas.
A camada NWK utiliza um algoritmo que permite implementaes da pilha de
26
2.5.5
Segurana
2.5.6
Tipos de Trfego
27
ESPECIFICAO TCNICA
3.1
Fonte: Prpria
28
3.1.1
Tag
O sistema composto por tags que esto fixadas nos refrigeradores sobre os
quais deseja efetuar a rastreabilidade. Estas tags fazem comunicao identificando
o objeto, enviando um sinal para o leitor.
3.1.2
3.1.3
Microcontrolador
3.1.4
Dispositivos de Entrada
3.1.5
Dispositivo de Sada
29
3.1.6
3.1.7
Banco de dados
3.2
3.2.1
Tag
30
31
bits 0 no pode ser utilizada nos bits de dados, para evitar que o receptor
considere o fim da transmisso. Logo aps o cabealho so representados os bits
que identificam o cliente sendo eles transmitidos de D00 a D03 em seguida
acrescentado um bit de paridade P0, logo em seguida enviado os restantes dos
bits que identificam os clientes e aps isto transmitido o segundo bit de paridade
P1. Para os dados de identificao so reservados 32 bits divididos em oito grupos
de quatro bits de dados e em seguida um bit de paridade.
A capacidade de combinao desta informao 232 resultado num total de
4,294,967,296 combinaes disponveis. Quatro colunas de bits de paridade
seguidos de um bit de parada com nvel lgico 0 encerram a transmisso da tag
para o leitor.
3.2.2
32
3.2.3
Microcontrolador
serial para comunicao com Servidor. Outro fator importante que a placa de
prototipao escolhida da Microgenios usa o PIC 18F452.
O microcontrolador atua como interface entre o software de aquisio de
dados e o leitor por radio freqncia.
AP-09 em formato RS232 / TTL aps converso por um circuito Max 232, atravs da
porta INT 0, no pino 33 ( interrrupo 0) e disponibiliza estas informaes para o
software de aquisio de dados que efetua uma busca no banco de dados para
verificar se o registro esta no ponto da linha de produo correto.
Ver detalhes no anexo 1, circuito.
Figura 7: Descrio dos pinos de conexo do PIC18F452
3.2.4
34
3.2.5
3.2.6
Banco de dados
3.3
3.3.1
3.3.2
Circuito do microcontrolador
3.3.3
A freqncia de operao das tags bem como a do leitor por rdio freqncia
foi determinada em 125 kHz, pois com esta freqncia distncia de leitura de
aproximadamente 20 centmetros. Para a aplicao proposta torna-se a melhor
opo em termos de custos/benefcios.
36
3.4
PROGRAMAO
3.4.1
Descrio Geral
3.5
Planejamento
37
3.5.1
Fonte: Prpria
3.5.1.2
Fonte: Prpria
3.5.1.3
Fonte: Prpria
3.5.1.4
Fonte: Prpria
3.5.1.5
39
Fonte: Prpria
40
IMPLEMENTAO
4.1
DESCRIO DA MONTAGEM
comunicao
serial,
testes
com
RFID
usando
interrupo
externa
FONTE: Prpria.
41
4.2
da
FONTE: Prpria.
42
4.2.2
FONTE: Prpria.
43
FONTE: Prpria.
FONTE: Prpria.
44
FONTE: Prpria.
Figura 19: Tela 5 do LCD (Digite o cdigo do operador)
FONTE: Prpria.
4.2.3
FONTE: Prpria.
Como a sada do leitor RFID em RS232, para testes na interrupo teve-se
que usar um circuito integrado Max 232 da Texas Instruments, para converso do
sinal RS232 para TTL 5V.
Nos testes com o PIC monitorou-se as interrupes por borda de descida
(de 1 para 0) no pino RB0. A cada leitura do estado da porta RB0 esse estado foi
armazenado num vetor e em uma varivel.
Quando esta interrupo ocorreu, houve um delay (ou atraso) de um tero de
tempo de bit de validao para aumentarmos a tolerncia de escorregamento de
amostragem do sinal, ou seja, usamos usamos um TBit de 102us pois a taxa de
transmisso do Leitor de 9600 bps ( Bits por segundo) .
A estrutura de Dados fornecidos pelo leitor RFID Serial ASCII, Baud 9600,
sem paridade( STX (02 HEX) DATA (10 HEX CHARACTERS) CR LF ETX (03
HEX)).
A figura 21 mostra na tela do osciloscopio a leitura da Tag atraves do Leitor
do RFID,
46
FONTE: Prpria.
4.2.4
Para testes dos mdulos Xbee-pro que tem uma comunicao RS232 TTL
5V, foi necessrio tambm um circuito integrado Max 232, para converso do sinal
TTL 5V para RS232 para comunicao com a porta serial RS232 do PIC 18F452.
Inicialmente usamos o software Rcom Serial para testes e para configurao
dos mdulos usamos o software X-CTU da MaxStream, figura 22.
Basicamente os mdulos XBee/XBee-Pro j vem de fabrica configurados para
serem usados mais facilmente, o mnimo que precisa ser feito para estabelecer um
link de comunicao alimentar os mdulos corretamente com uma tenso de 3.3V.
47
FONTE: Prpria.
Configuraes realizadas no software X-CTU da MaxStream:
Mdulo Terminal ( remoto )
Networking & Security
ID: 3332
DL: 1234
MY: 5678
NI: REMOTO
Mdulo Coordenador ( base )
Networking & Security
ID: 3332
DL: 5678
MY:1234
NI: BASE
48
FONTE: Prpria.
FONTE: RogerCom
Ao instalar no computador o driver USB para (Windows 98, ME, 2000,
49
XP,Vista, x64 e tambm para Linux e Mac) que acompanha a placa, o windows cria
uma porta COMx virtual quando a placa CON-USBBEE plugada. Assim, possvel
atravs de um programa (escrito em C/C++Builder, Delphi, VB, Java, C#, etc), se
comunicar com a placa como se fosse uma comunicao serial padro RS232.
Tambm possvel acessar a placa atravs de uma DLL, que oferece mais recursos
na programao.
4.2.5
FONTE: Prpria.
50
4.2.6
FONTE: Prpria.
51
FONTE: Prpria.
52
FONTE: Prpria.
Figura 29: Sistema de Rastreabilidade
FONTE: Prpria.
53
FONTE: Prpria.
4.3. CDIGO FONTE
4.3
4.3.2
54
4.3.3
Fonte: Prpria
Para armazenar e resgatar informaes do banco de dados, no necessrio
ir at ele e conhecer a linguagem dele .
Pode se usar uma ferramenta do Django chamada ORM, que interpreta o seu
cdigo, leva aquilo at o banco de dados, e depois devolve as informaes
desejadas.
A parte do cdigo onde voc configura quais so seus modelos de dados e
que tipo de informaes eles devem armazenar, um arquivo chamado models.py.
55
Fonte:
http://www.aprendendodjango.com/entendendo-como-o-django-
trabalha/
MVC a sigla que resume tudo isso:
Modelo (Model)
Viso (View)
Controle (Controller)
Modelo onde esto as definies dos dados, como eles devem ser
armazenados e tratados. l que voc diz quais campos uma tabela deve ter, seus
tipos e valores padro e se eles so obrigatrios ou no. Dentre outras coisas.
Viso so as funes que recebem requisies e retornam respostas, ao
usurio, a outro computador, a uma impressora ou qualquer outra coisa externa. Ou
seja, as views.
E Controle so todas as coisas que ficam no meio do caminho, como o
handler, os middlewares e o URL dispatcher. A maior parte dessas coisas feita
pelo prprio Django, e voc deve se preocupar pouco ou nada com isso.
56
4.3.4
CUSTOS DO PROJETO
4.5
COMPONENTES E MATERIAIS
Item
Preo Unitrio
Preo Total
Xbee-Pro
R$ 135,00
R$ 270,00
PIC18F452
R$ 34,00
R$ 34,00
Conversor
Xbee- R$ 120,00
R$ 120,00
Pro - USB
2
Max232
R$ 3,00
R$ 3,00
Leitor RFID
R$ 200,00
R$ 200,00
Display (16x2)
R$ 20,00
R$ 20,00
Bateria 9V
R$ 40,00
R$ 40,00
TAG(RFID)
R$ 6,97
R$ 6,97
16
Capacitor
R$ 0,08
R$ 1,28
Resistores
R$ 0,05
R$ 0,45
Oscilador
R$ 2,71
R$ 2,71
Diodo
R$ 0,59
R$ 2,95
7805
R$ 0,60
R$ 0,60
LM317L
R$ 0,47
R$ 0,47
Teclado Matricial
R$ 15,00
R$ 15,00
Valor Final
R$ 717,43
57
RESULTADOS
No decorrer do desenvolvimento do projeto, foi necessrio utilizar muitos
enviar os dados
5.2
58
5.3
Display e Teclado
5.4
Comunicao Wireless
5.5
ESTACAO 1
NAO TESTOU
ESTACAO 2
NAO TESTOU
ESTACAO 3
NAO TESTOU
ESTACAO 4
NAO TESTOU
ESTACAO 5
NAO TESTOU
ESTACAO 6
NAO TESTOU
ESTACAO 7
NAO TESTOU
ESTACAO 8
NAO TESTOU
RASTREABILIDADE
OK!
Fonte: Prpria
Descrio no PC
Login
NC - Falha 1
NC - Falha 2
60
NC - Falha 3
NC - Falha 4
NC - Falha 5
NC - Falha 6
NC - Falha 7
NC - Falha 8
Fonte: Prpria
62
REFERENCIAS
Disponivel
em:
63
Acesso
DE
USO.
Diagrama
de
cado
de
uso:
Disponvel
em:
64
Bitmask(PIN_B0)
Bitmask(PIN_B1)
Bitmask(PIN_B2)
Bitmask(PIN_B3)
Bitmask(PIN_B4)
Bitmask(PIN_B5)
Bitmask(PIN_D3)
Bitmask(PIN_D2)
Bitmask(PIN_D1)
Bitmask(PIN_D0)
break;
case 1 : set_tris_kbd_cols(ALL_COLS&~COL1);
kbd_cols=~COL1&ALL_COLS;
break;
case 2 : set_tris_kbd_cols(ALL_COLS&~COL2);
kbd_cols=~COL2&ALL_COLS;
break;
}
if(kbd_down) {
if((kbd_rows & (ALL_ROWS))==(ALL_ROWS)) {
kbd_down=FALSE;
kchar=last_key;
last_key='\0';
}
} else {
if((kbd_rows & (ALL_ROWS))!=(ALL_ROWS)) {
if((kbd_rows & ROW0)==0)
row=0;
else if((kbd_rows & ROW1)==0)
row=1;
else if((kbd_rows & ROW2)==0)
row=2;
else if((kbd_rows & ROW3)==0)
row=3;
last_key =KEYS[row][col];
kbd_down = TRUE;
} else {
++col;
if(col==3)
col=0;
}
}
kbd_call_count=0;
}
set_tris_kbd_rows(ALL_ROWS);
set_tris_kbd_cols(ALL_COLS);
return(kchar);
}
Segue abaixo o codigo fonte do arquivo mylcd.c
//
mylcd.c
//
// lcd_init() Deve ser chamado antes de outras funes.
//
// lcd_putc(c) Visualiza c na posio seguinte do display.
//
Caracteres especiais de controle:
//
\f Apagar display
//
\n Passar para segunda linha
//
\b Retroceder uma posio.
//
// lcd_gotoxy(x,y) seleciona uma nova posio de escrita no display.
//
//
// lcd_getc(x,y) Devolve o caracter na posio x y do display.
//
//////////////////////////////////////////////////////////////////////////////
// Definio dos pinos usados para o display
delay_cycles(1);
#endif
output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
//---------------------------void lcd_init(void)
{
int8 i;
output_low(LCD_RS);
#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif
output_low(LCD_E);
delay_ms(15);
for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}
lcd_send_nibble(0x02);
for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
// If the R/W signal is not used, then
// the busy bit can't be polled. One of
// the init commands takes longer than
// the hard-coded delay of 60 us, so in
// that case, lets just do a 5 ms delay
// after all four of them.
#ifndef USE_LCD_RW
delay_ms(5);
#endif
}
}
//---------------------------void lcd_gotoxy(int8 x, int8 y)
{
int8 address;
if(y != 1)
address = lcd_line_two;
else
address=0;
address += x-1;
lcd_send_byte(0, 0x80 | address);
}
//----------------------------void lcd_putc(char c)
{
switch(c)
{
case '\f':
lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n':
lcd_gotoxy(1,2);
break;
case '\b':
lcd_send_byte(0,0x10);
break;
default:
lcd_send_byte(1,c);
break;
}
}
//-----------------------------#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;
lcd_gotoxy(x,y);
// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));
output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);
return(value);
}
#endif
void lcd_setcursor_vb(short visible, short blink) {
lcd_send_byte(0, 0xC|(visible<<1)|blink);
}
Segue abaixo o cdigo fonte do arquivo MYIHM.C
MYIHM.C
/////////////////////////////////////////////////////////////////////////
////
MYIHM.C
////
////
////
////
////
/////////////////////////////////////////////////////////////////////////
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)//Habilita as funes RS232 com velocidade de
9600 baud
#include <mylcd.c>//Inclui funo de manipulao de LCD 16X2
#include <mykbd.c>//Inclui funo de manipulao de teclado matricial de 3X4
/* Declarao de bytes usados para comunicaao RS232 - obtidos no data sheet do PIC 18F452*/
#byte INTCON = 0xFF2 //Registrador INTCON
#define TBit 104 //Valor do Tempo de Bit (us) para 9600
#define MAXBUFFER 20 // Define o tamanho mximo dos buffers de transmisso e recepo
/* declarao de bytes usados para comunicaao RS232 - obtidos no data sheet do PIC 18F452*/
#byte PIR1 = 0xF9E
#byte PIE1 = 0xF9D
#BIT TXIF = PIR1.4
#BIT TXIE = PIE1.4
byte SerialIn[MAXBUFFER]; // buffer de recepo(RX)
byte SerialOut[MAXBUFFER]; // buffer de trasnmiso (TX)
byte ReadPtr=0; // ponteiro de leitura utilizado pela rotina de interrupo
byte ReadBufPtr=0; //ponteiro de leitura indicando o dado disponvel no buffer
byte WritePtr=0; // ponteiro de escrita utilizado pela rotina de interrupo
byte WriteBufPtr=0;// ponteiro de escrita indicando a posio livre no buffer de escrita
/*Funes*/
void ExibeT0(void);//exibe tela 0 LEITURA RFID
void ExibeT1(void);//exibe tela 1 OPERADOR
void ExibeT2(void);//exibe tela 2 ESTACAO
void ExibeT3(void);//exibe tela 3 EVENTO
void ExibeT4(void);//exibe tela 4 RESULTADOS
void ExibeT5(void);//exibe tela 5 LOGIN (OPERADOR, ESTACAO, EVENTO)
void ExibeT6(void);//exibe tela 6 REALIZE O TESTE
void ExibeT7(void);//exibe tela 7 ESTACAO 1 NAO TESTOU
void ExibeT8(void);//exibe tela 8 ESTACAO 2 NAO TESTOU
void ExibeT9(void);//exibe tela 9 ESTACAO 3 NAO TESTOU
void ExibeT10(void);//exibe tela 10 ESTACAO 4 NAO TESTOU
void ExibeT11(void);//exibe tela 11 ESTACAO 5 NAO TESTOU
void ExibeT12(void);//exibe tela 12 ESTACAO 6 NAO TESTOU
void ExibeT13(void);//exibe tela 13 ESTACAO 7 NAO TESTOU
void ExibeT14(void);//exibe tela 14 ESTACAO 8 NAO TESTOU
void ExibeT15(void);//exibe tela 15 RASTREABILIDADE OK
void ExibeT16(void);//exibe tela 16 AGUARDA RESPOSTA SERVIDOR
void UpdateTag(void);
//#int_ext
void RecPacT(void); //Recebe Pacote do RFID (interrupo RB0)
void MontaRFID(void);//Monta RFID ( 2 bytes)
/*Variveis Globais*/
char k=0;
char Operador=0;
char Estacao=0;
char Evento=0;
int Estado=0;
int i=0,j=0,Cont=0;
int8 Byte1[16]="000000000000000", pos=0;
int NewTag=0,upok=0;
char recebido;
char dado[20];
int EstadoCom=0;
/* PACOTE:|0|1|2|3|4|5|6|7|8|9|.|1|.|2|.|1|
| DADO RFID 10BITS |.|O|P|.|E|S|.|E|V|*/
char val3[20]="0123456789.1.2.3";// Teste constante fixa
char val4[20]="0000000000.0.0.0";// String para montagem e transmissao RFID
char val2[20]="0000000000.0.0.0";// String para montagem e tela RFID
char val0[20]="0000000000.0.0.0";// String para montagem e transmissao PACOTE VAZIO
/* rotina de tratamento da interrupo de leitura da porta serial chamada sempre que um dado foi
recebido */
#INT_RDA // diretiva compilador
void readSerial()
{
/* coloca o dado recebido no buffer RX */
SerialIn[ReadPtr++]=getc();
/* controle do ponteiro cclico */
if (ReadPtr == MAXBUFFER) ReadPtr=0;
}
/* rotina para retirar uma dado do buffer RX substitui getc*/
byte readBuffer()
{
byte data;
/* esperar por haver um dado no buffer RX */
if (ReadBufPtr == ReadPtr) return 0;
data = SerialIn[ReadBufPtr++];
/* controle cclico do ponteiro */
if (ReadBufPtr == MAXBUFFER) ReadBufPtr=0;
return data;
}
/* rotina de tratamento da interrupo de escrita da porta serial, chamada sempre que um dado foi
transmitido */
#INT_TBE // diretiva compilador
void writeSerial()
{
/* transmite quando exsite um dado no buffer TX */
if (WriteBufPtr != WritePtr)
{
putc(SerialOut[WritePtr++]);
/* controle do ponteiro cclico */
if (WritePtr == MAXBUFFER) WritePtr=0;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT2(void)
{
Estado=2;
delay_ms(1000);
lcd_putc("\fLOGIN ESTACAO\n");//Tela 2
lcd_putc("digite:\n");
lcd_gotoxy(8,2);
While(Estado==2)
{
k=kbd_getc();
if(k!=0)
lcd_putc(k);
Estacao=k;
if(Estacao!=0)
{
Estado=3;
ExibeT3();
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT3(void)
{
Estado=3;
delay_ms(1000);
lcd_putc("\fEVENTO\n");//Tela 3
lcd_putc("digite:\n");
lcd_gotoxy(8,2);
While(Estado==3)
{
k=kbd_getc();
if(k!=0)
lcd_putc(k);
Evento=k;
if(Evento!=0)
{
Estado=4;
ExibeT4();
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT4(void)
{
Estado=4;
lcd_putc("\fMontando Login:\n");
lcd_gotoxy(4,2);
lcd_putc(Operador);
lcd_gotoxy(8,2);
lcd_putc(Estacao);
lcd_gotoxy(12,2);
lcd_putc(Evento);
delay_ms(2000);
val4[11]=Operador;
val4[13]=Estacao;
val4[15]=Evento;
lcd_putc("\f");
lcd_putc("\fMontando dados:\n");
lcd_gotoxy(1,2);
printf(lcd_putc, "%s ", val4);
delay_ms(2000);
EstadoCom=1;
Estado=0;
ExibeT16();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT5(void)
{
Estado=5;
lcd_putc("\fRASTREABILIDADE\n");//Tela inicial
lcd_putc("Digite opcao:\n");
lcd_gotoxy(15,2);
Estado=0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void UpdateTag(void)
{
for(i=0;i<10;i++)
{
val4[i]=Byte1[i+1];
}
lcd_putc("\f");
printf(lcd_putc, "%s\n ",val4);
delay_ms(500);
NewTag=0;
ExibeT5();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void MontaRFID(void) //Monta os bytes do cdigo do RFID
{
for(j=0;j<8;j++)
{
// (MSB)Byte1(LSB) -----------------------------------------------------if(bit_test(BitRecTra[j].BitRecTra,0))
bit_set(Byte1[pos],j);
else
bit_clear(Byte1[pos],j);
}
pos++;
if (pos==14)
{
NewTag=1;
Byte1[pos]=0;
pos=0;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT6(void)
{
Estado=6;
lcd_putc("\fRASTREABILIDADE\n");//Realize os testes, Login ok, Rastreabilidade ok (Estacoes
anteriores ok)
lcd_putc("REALIZE TESTES:\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT7(void)
{
Estado=7;
lcd_putc("\fESTACAO 1\n");//Retornar a estao anterior, pois os resultados no estao ok ou nao
foram realizados
lcd_putc("NAO TESTOU!\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT8(void)
{
Estado=8;
lcd_putc("\fESTACAO 2\n");//Retornar a estao anterior, pois os resultados no esto ok ou no
foram realizados
lcd_putc("NAO TESTOU!\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT9(void)
{
Estado=9;
lcd_putc("\fESTACAO 3\n");//Retornar a estao anterior, pois os resultados no esto ok ou no
foram realizados
lcd_putc("NAO TESTOU!\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT10(void)
{
Estado=10;
lcd_putc("\fESTACAO 4\n");//Retornar a estao anterior, pois os resultados no esto ok ou no
foram realizados
lcd_putc("NAO TESTOU!\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT11(void)
{
Estado=11;
lcd_putc("\fESTACAO 5\n");//Retornar a estao anterior, pois os resultados no esto ok ou no
foram realizados
lcd_putc("NAO TESTOU!\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT12(void)
{
Estado=12;
lcd_putc("\fESTACAO 6\n");//Retornar a estao anterior, pois os resultados no esto ok ou no
foram realizados
lcd_putc("NAO TESTOU!\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT13(void)
{
Estado=13;
lcd_putc("\fESTACAO 7\n");//Retornar a estao anterior, pois os resultados no esto ok ou no
foram realizados
lcd_putc("NAO TESTOU!\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT14(void)
{
Estado=14;
lcd_putc("\fESTACAO 8\n");//Retornar a estao anterior, pois os resultados no esto ok ou no
foram realizados
lcd_putc("NAO TESTOU!\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT15(void)
{
Estado=15;
lcd_putc("\fRASTREABILIDADE\n");//Retornar a estao anterior, pois os resultados no esto ok
ou nao foram realizados
lcd_putc("OK!\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void ExibeT16(void)
{
Estado=15;
lcd_putc("\fAGUARDA RESPOSTA\n");//Aguarda Resposta do Servidor
lcd_putc("DO SERVIDOR\n");
lcd_gotoxy(15,2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
#int_ext
void RecPacT(void)
{
INTCON = 0x00; //Desabilita a interrupo (Global | Int_ext)
//----------------------------------------------------------------------delay_us(TBit);
delay_us(TBit/4);
if(!NewTag)
{
BitRecTra[0].BitRecTra = input(PIN_B0); //LSB do Byte
delay_us(TBit);
BitRecTra[1].BitRecTra = input(PIN_B0);
delay_us(TBit);
BitRecTra[2].BitRecTra = input(PIN_B0);
delay_us(TBit);
BitRecTra[3].BitRecTra = input(PIN_B0);
delay_us(TBit);
BitRecTra[4].BitRecTra = input(PIN_B0);
delay_us(TBit);
BitRecTra[5].BitRecTra = input(PIN_B0);
delay_us(TBit);
BitRecTra[6].BitRecTra = input(PIN_B0);
delay_us(TBit);
BitRecTra[7].BitRecTra = input(PIN_B0); //MSB Byte
// Fim da leitura do Pacote Recebido
MontaRFID();
}
INTCON = 0xD0; //Habilita a interrupo (Global | Int_ext)
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
char recebido;
char dado[20];
/*** Inicializao de interrupo externa ***/
SETUP_COUNTERS(rtcc_internal,rtcc_div_32);
ext_int_edge(H_TO_L);
INTCON = 0xD0; //Habilita a interrupo (Global | Int_ext)
/*** Inicializao de interrupo serial ***/
enable_interrupts(INT_RDA);//habilita interrupo de recepo
enable_interrupts(GLOBAL);//habilita interrupes
lcd_init();
kbd_init();
if(Estado!=5)
ExibeT0();
while (TRUE)
{
if(!input(PIN_B3))//Tecla de funo F1 ( Operador )
{
INTCON =0;
ExibeT1();
}
else
if(!input(PIN_B4))//Tecla de funo F2 ( Estao )
{
INTCON =0;
ExibeT2();
}
else
if(!input(PIN_B5))//Tecla de funo F3 ( Evento )
{
INTCON =0;
ExibeT3();
}
else
if(!input(PIN_B2))//Tecla de funo F0 ( Menu Iniciar )
{
INTCON =0;
ExibeT0();
}
INTCON = 0xD0; //Habilita a interrupo (Global | Int_ext)
if(NewTag)
UpdateTag();
/*** Rotina de leitura do buffer RX ***/
delay_ms(50);
recebido=readBuffer();
if(recebido=='t')//Caracter recebido na serial TOKEN
{
if(EstadoCom==0)
{
/*lcd_putc("\f");
lcd_putc("\fEnviando dados:\n");
lcd_gotoxy(1,2);
printf(lcd_putc, "%s ", val0);
delay_ms(4000);
*/
sprintf(dado,"%s",val0);
puts_int(dado);
//ExibeT0();
EstadoCom=0;
}
else
if(EstadoCom==1)
{
lcd_putc("\f");
lcd_putc("\fEnviando dados:\n");
lcd_gotoxy(1,2);
printf(lcd_putc, "%s ", val4);
delay_ms(4000);
sprintf(dado,"%s",val4);
puts_int(dado);
ExibeT16();
EstadoCom=0;
}
}
else
if(recebido=='0') ExibeT6();
else
if (recebido=='1') ExibeT7();
else
if (recebido=='2') ExibeT8();
else
if (recebido=='3')ExibeT9();
else
if (recebido=='4')ExibeT10();
else
if (recebido=='5') ExibeT11();
else
if (recebido=='6')ExibeT12();
else
if (recebido=='7') ExibeT13();
else
if (recebido=='8') ExibeT14();
else
if (recebido=='9')ExibeT15();
}
}
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
)
ROOT_URLCONF = 'rprfid.urls'
TEMPLATE_DIRS = (
'/home/tiago/Projetos/rprfid/templates'
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'rprfid.main',
)
No diretorio rprfid no arquivo urls.py, responsvel pela direcionamentos das url.
import settings
from django.conf.urls.defaults import *
from rprfid.main.views import index
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^$', index),
(r'^admin/(.*)', admin.site.root),
)
if settings.DEBUG:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$',
'django.views.static.serve',
{'document_root': '/home/tiago/Projetos/rprfid/static'}),
)
No diretorio rprfid no arquivo rprfid_daemon.py, a implementao das rotinas de leitura da porta
usb.
#!/usr/bin/env python
#-*- coding: utf-8 -*import os
import sys
import time
import serial
from optparse import OptionParser
try:
import settings
except ImportError:
sys.stderr.write('Arquivo settings.py no encontrado.\n')
sys.exit(1)
try:
from django.core.management import setup_environ
except ImportError:
sys.stderr.write('No foi possvel importar django.core.management.setup_environ, verifique sua
instalao do Django.\n')
sys.exit(1)
# Configura ambiente de execuo.
setup_environ(settings)
from rprfid.main.models import Registro, Operador, Estacao, Evento
def le_usb(usb):
# Abre conexo com a Serial
ser = serial.Serial("/dev/ttyUSB0", 9600)
matrizxbee=['5678','6789']
matrizteste=['ok','','','','','','','','']
s=0
while 1:
if (matrizxbee[s]=='5678'):
print("Testando xbee 5678")
# Verificao Xbee
ser.write('+++')
resultado1=ser.readline(eol='\r')
print(resultado1)
time.sleep(1)
ser.write('ATDL5678\r')
resultado2=ser.readline(eol='\r')
print(resultado2)
time.sleep(0.1)
#ser.write('ATWR\r')
#resultado3=ser.readline(eol='\r')
#print(resultado3)
time.sleep(1)
ser.write('ATCN\r')
resultado4=ser.readline(eol='\r')
print(resultado4)
#Fim verificao xbee
ser.write("t")
linha = ser.readline()
slinha = linha.split('.')
atual=int(slinha[2][0])
anterior=int(slinha[2][0])-1
#print linha
if linha!="":
if slinha[0]=="0000000000" and slinha[1][0]=="0" and slinha[2][0]=="0"
and slinha[3][0]=="0":
arquivo = open("/home/tiago/Projetos/rprfid/arq.txt", 'a')
arquivo.write("Estao no tem dados\n")
arquivo.close()
else:
# Incluso de registro inicial estao 1
if slinha[0]!="" and slinha[1][0]!="" and slinha[2][0]=="1" and
slinha[3][0]=="0":
ser.write("0")
else:
if slinha[0]!="" and slinha[1][0]!="" and slinha[2]
[0]=="1" and slinha[3][0]=="9":
#print("Estou aqui-2")
r = Registro(
codigo=slinha[0],
operador=Operador.objects.filter(codigo=slinha[1][0])[0],
estacao=Estacao.objects.filter(codigo=slinha[2][0])[0],
evento=Evento.objects.filter(codigo=slinha[3]
[0])[0],
)
r.save()
ser.write("9")
if slinha[0]!="" and slinha[1][0]!="" and slinha[2]
[0]=="1" and slinha[3][0]!="9":
#print("Estou aqui-1")
r = Registro(
codigo=slinha[0],
operador=Operador.objects.filter(codigo=slinha[1][0])[0],
estacao=Estacao.objects.filter(codigo=slinha[2][0])[0],
evento=Evento.objects.filter(codigo=slinha[3]
[0])[0],
)
r.save()
ser.write("9")
# Termino incluso de registro inicial estao 1
# Inicio incluso de registro inicial demais estaes
# Verificao da estao e evento Ok
if slinha[0]!="" and slinha[1][0]!="" and slinha[2][0]!="1" and
slinha[3][0]=="0":
#print("Estou aqui")
n=slinha[2][0]
if
Registro.objects.values().filter(codigo=slinha[0],
estacao=atual-1, evento=9):
for x in range(1,int(n)+1):
if
Registro.objects.values().filter(codigo=slinha[0], estacao=x):
matrizteste[x]='ok'
else:
matrizteste[x]='nok'
for i in range(1,int(n)):
if matrizteste[i]=="nok":
ser.write(str(i))
break
else:
ser.write("0")
matrizteste=['ok','','','','','','','','']
else:
ser.write(str(anterior))
else:
#print("Estou aqui 2")
if slinha[0]!="" and slinha[1][0]!="" and slinha[2][0]!="1"
and slinha[3][0]!="0":
n=slinha[2][0]
for x in range(1,int(n)+1):
if
Registro.objects.values().filter(codigo=slinha[0], estacao=x):
matrizteste[x]='ok'
else:
matrizteste[x]='nok'
for i in range(1,int(n)):
if matrizteste[i]=="nok":
ser.write(str(i))
break
if
Registro.objects.values().filter(codigo=slinha[0], estacao=atual-1, evento=9):
#print("Estou aqui3")
r = Registro(
codigo=slinha[0],
operador=Operador.objects.filter(codigo=slinha[1][0])[0],
estacao=Estacao.objects.filter(codigo=slinha[2][0])[0],
evento=Evento.objects.filter(codigo=slinha[3][0])[0],
)
r.save()
ser.write("9")
matrizteste=['ok','','','','','','','','']
else:
if
Registro.objects.values().filter(codigo=slinha[0], estacao=atual-1, evento=9):
#print("Estou aqui4")
r = Registro(
codigo=slinha[0],
operador=Operador.objects.filter(codigo=slinha[1][0])[0],
estacao=Estacao.objects.filter(codigo=slinha[2][0])[0],
evento=Evento.objects.filter(codigo=slinha[3][0])[0],
)
r.save()
matrizteste=['ok','','','','','','','','']
else:
ser.write(str(anterior))
s=1
if (matrizxbee[s]=='6789'):
print("Testando xbee 6789")
print("No disponivel")
s=0
#Fim verificao xbee
time.sleep(5)
def le_arquivo(arq):
arquivo = open(arq, 'r')
for linha in arquivo.readlines():
linha = linha.split('.')
print linha[0], linha[1], linha[2], linha[3]
r = Registro(
codigo=linha[0],
operador=Operador.objects.filter(codigo=linha[1])[0],
estacao=Estacao.objects.filter(codigo=linha[2])[0],
evento=Evento.objects.filter(codigo=linha[3].replace('\n',''))[0],
)
r.save()
if __name__ == "__main__":
oparser = OptionParser(usage=u'%prog [opcao]')
oparser.add_option('--usb', action="store_true",
help=u'Faz a leitura dos dados da porta USB.')
oparser.add_option('--arquivo', action="store_true",
help=u'Faz a leitura dos dados de um arquivo')
options, args = oparser.parse_args()
if not options.usb and not options.arquivo:
oparser.print_help()
if options.usb:
le_usb('/dev/ttyUSB0')
if options.arquivo:
le_arquivo('arquivox.txt')
No diretorio rprfid/main, tem o arquivo models.py onde tem a estrutura do banco de dados
# -*- coding: utf-8 -*from django.db import models
from django.contrib.auth.models import User
class Evento(models.Model):
codigo = models.CharField(max_length=50)
nome = models.CharField(max_length=50)
descricao = models.TextField()
def __unicode__(self):
return '%s %s' % (self.codigo, self.nome)
class Estacao(models.Model):
codigo = models.CharField(max_length=50)
nome = models.CharField(max_length=50)
descricao = models.TextField()
def __unicode__(self):
return self.nome
class Operador(models.Model):
usuario = models.ForeignKey(User)
codigo = models.CharField(max_length=64)
setor = models.CharField(max_length=64)
cargo = models.CharField(max_length=64)
def __unicode__(self):
return '%s %s' % (self.codigo, self.usuario)
class Registro(models.Model):
codigo = models.CharField(max_length=10)
operador = models.ForeignKey('Operador')
estacao = models.ForeignKey('Estacao')
evento = models.ForeignKey('Evento')
data = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.codigo
No diretorio rprfid/main, tem o arquivo views.py onde tem o direcionamento da pagina index.html
from django.template import RequestContext
from django.shortcuts import render_to_response
from rprfid.main.models import Evento, Estacao, Operador, Registro
def index(request):
return render_to_response(
'index.html',
{'registro': Registro.objects.all(),
},
context_instance=RequestContext(request)
)
No diretorio rprfid/templates, tem o arquivo index.html
{% extends "base_header_menu_footer.html" %}
{% load i18n %}
{% block content %}
<div id="display_box">
<div class="container">
<h2>{{ registro.count }} {% trans "Registro" %}</h2>
{% if registro.count %}
<table cellspacing="0">
<thead>
<tr><th>Produto</th><th>Operador</th><th>Estacao</th><th>Evento</th><th>Data</th></tr>
</thead>
<tbody>
{% for r in registro %}
<tr class="{% cycle 'row1' 'row2' %}">
<td>{{ r.codigo }}</a></td><td>{{ r.operador }}</td><td>{{ r.estacao }}</td><td>{{ r.evento }}</td><t
d>{{ r.data }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<div id="info">
<p>Nenhum registro encontrado</p>
</div>
{% endif %}
</div>
{% endblock %}