Jiří Korbel, Ondřej Kovář, Tomáš Krč: Elektronický vrátný

Z MAM wiki

Přejít na: navigace, hledání

Obsah

[editovat] Zadání

Načtení kódu RFID čipu z RS232 čtečky, vyhodnocení podle tabulky a případné sepnutí výstupu (indikace např. LED). (Prezentace + [[1]]Jan Kolomaznik)

[editovat] Popis funkce a zapojení

Radio Frequency Identification, tedy identifikace na rádiové frekvenci (RFID), je navržena pro identifikaci předmětů (např. v knihovnách, obchodech či skladech), odemykání uzamčených prostor, identifikaci zvířat i lidí, ale třeba také pro bezkontaktní platby. RFID čipy obsahují 96bitové unikátní číslo EPC, které může být přiděleno každému jednotlivému konkrétnímu čipu. To poskytuje dostatečný prostor pro celosvětovou jedinečnost každého čipu.

Popis zapojení:

RFID modul Wiegand napájený 5V přečte kód daného čipu a sériovým kanálem standardu RS-232 jej posílá v TTL úrovních (+5 a -5 V) na USART rozhraní procesoru ATmega88.

Soubor:Rfid.jpg

Modul Wiegand posílá pouze 10 osmibitových čísel z EPC (z celkových 12) s celkem specifickým kódováním (Viz. datasheet).

Zapojení také počítá se dvěma LED diodami. První (LED1) je součástí modulu Wiegand a slouží pouze jako indikace přečtení přiloženého čipu, pro samotné vyhodnocení by nebyla ani potřebná. Zajímavější je druhá dioda (LED2), která slouží jako indikace povolení přistupu. Rozsvítí se tedy na předem určenou dobu, pokud je načtený čip v databázi povolených ID. Zároveň se sepne tranzistor pro ovládání dalšího zařízení, např. dveří.

[editovat] Schéma zapojení

Schéma zapojení RFID modulu Wiegand

[editovat] Zdrojový kód

// Zapojeni: 
// - rele na PC4
// - LED na PC5
// - vstup RS-232 na PD0
// - vystup RS-232 na PD1 (nepouzity)
// Terminal - Baud rate = 9600 bit/s, asynchronni, 8bit slova

#include <avr/io.h>
#include <stdint.h>              // Potreba pro uint8_t
#include <avr/interrupt.h>       // Potreba pro preruseni
#include <util/delay.h>          // Potreba pro fci _delay_ms
#include <string.h>              // Potreba pro fci strcmp


// Nasledujici parametry pouze predpokladam z Datasheetu:
#define FOSC 1000000             // Pracovni frekvence procesoru [Hz]
#define SR 9600                  // Symbolova rychlost (Baud Rate) [bit/s]
#define USARTBRR FOSC/16/SR -1   // USART Baud Rate Register


// Volitelne parametry:
int doba = 2000;        // Doba, po kterou rele sepne (doba otevreni dveri) [ms]

// 10byte zvolene cislo RFID cipu autorizovaneho na otevreni dveri
uint8_t znameRFID[] = {'1','2','3','4','5','6','C','D','E','F'};

uint8_t RFID[10];
int pomocna;

int main() {

   // Definice vystupu na PINC0, PINC1
   DDRC |= (1 << 4); 
   DDRC |= (1 << 5);

   // inicializace USART
   UBRR0H = (USARTBRR >> 8);   // Rozdeleni symbolove rychlosti do dvou 8bit registru
   UBRR0L = USARTBRR;   

   UCSR0A |= (1 << U2X0);                      // Asynchronni prenos
   UCSR0B |= (1 << RXEN0) | (1 << TXEN0);      // Povolit prijimac i vysilac
   UCSR0B |= (1 << RXCIE0);                    // Povolit preruseni na prijimaci
   UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00);    // Velikost prijateho slova = 8 bit
                                               // Ekvivalentni zapis -> UCSR0C |= (3 << UCSZ00);
   sei();       // Povoleni preruseni

   while(1){    // Hlavni smycka, cekani na preruseni   
   }    
}


// Samotna procedura preruseni
ISR (USART_RX_vect) {

   cli(); // Zabraneni dalsimu preruseni

   for (int i = 0; i < 10; i++) {    // 10, protoze Wiegand posila 10 8bit slov
       pomocna=UDR0;
       
       // Dekodovani prijatych 8 bitu, resp. rozdeleni podle toho, 
       // zda v prvnich 4 bitech prisla trojka nebo ctyrka:
       if ((pomocna & 0b11110000)>= 64) {

           switch (pomocna & 0b00001111) {
               case 1:
               RFID[i]=0b00001010;  // A
               break;

               case 2:
               RFID[i]=0b00001011;  // B
               break;

               case 3:
               RFID[i]=0b00001100;  // C
               break;

               case 4:
               RFID[i]=0b00001101;  // D
               break;

               case 5:
               RFID[i]=0b00001110;  // E
               break;

               case 6:
               RFID[i]=0b00001111;  // F
               break;
           }
       }
       else {
           RFID[i]=(pomocna & 0b00001111);  // Cisla 0-9
       }

   // Vyslani pismene (kvuli dokonceni interruptu, jinak na nic)
   UDR0=RFID[i];                 
   }

   // Porovnani znameho a obdrzeneho RFID slova
   if (memcmp(znameRFID,RFID,sizeof(RFID))==0) {

       PORTC |= (1 << 4); // Sepnuti rele
       PORTC |= (1 << 5); // Sepnuti LED

       _delay_ms(doba);  // Cekani po zadanou dobu v otevrenem stavu

       PORTC &= ~(1 << 4); // Vypnuti rele
       PORTC &= ~(1 << 5); // Vypnuti LED

       sei(); // Povoleni dalsiho preruseni
   }
}
Osobní nástroje