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

Z MAM wiki

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

Obsah

Zadání

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

Popis funkce a zapojení

RFID modul napájený 5V přečte kód daného čipu a sériovém kanále jej posílá v TTL úrovních ve formátu uvedeném na "http://www.seeedstudio.com/wiki/125Khz_RFID_module_-_Wiegand"

Popis zapojení:
LED1 slouži pouze jako indikace přečtení přiloženého čipu, pro samotné vyhodnocení by nebyla ani potřebná. Zajímavější je LED2, která slouží jako indikace povolení přistupu, načtený čip je v databázi povolených ID. Zároveň se sepne tranzistor pro ovládání dalšího zařízení.

Schéma zapojení

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