Проект для платы Gertboard: контроль входа


Предыдущая | Следующая

Рассмотрим небольшой проект применения платы Gertboard в связке с Raspberry Pi — пропускной пункт со входом по брелокам или картам с RFID-меткой (рис. 6.41).

RFID-считыватель (рис. 6.42) установлен на входной двери и подсоединен к контроллеру ATmega платы Gertboard. Датчик считывания RFID-карт компании Seeed Technology Inc., работающий на частоте 125 кГц, имеет высокую чувствительность расстояния срабатывания — 7 см. Он выдает информацию о карте в двух форматах данных: Uart и Wiegand. Wiegand — простой проводной интерфейс связи между устройством чтения идентификатора (карточки) и контроллером, широко приме­няемый в системах контроля доступа. Он как раз и предназначен для передачи уникального кода карты в контроллер.

Программа для RFID-считывателя на ATmega

Схема подключения считывателя представлена на рис. 6.43.

RFID-считыватель определяет код поднесенного брелока или карты и отправляет по последовательному порту в Raspberry Pi. Содержимое скетча для получения ко­да из RFID-считывателя и отправки в Raspberry Pi по последовательному порту представлено в листинге 6.19.

Листинг 6.19. Скетч для получения кода из RFID-считывателя и отправки в Raspberry Pi

byte RFIDcardNum; 
byte evenBit = 0; 
byte oddBit = 0; 
byte isData0Low = 0;
byte isData1Low = 0; 
int recvBitCount = 0; 
byte isCardReadOver = 0; 
void setup() 

Serial.begin(9600); 
attachInterrupt(0, ISRreceiveData0, FALLING ); 
attachInterrupt(1, ISRreceiveData1, FALLING ); 

void loop() 

// чтение бита номера карты 
if(isData0Low||isData1Low){ 
if(1 == recvBitCount){//even bit 
evenBit = (1-isData0Low)&isData1Low; 

else if( recvBitCount >= 26){//odd bit 
oddBit = (1-isData0Low)&isData1Low; 
isCardReadOver = 1; 
delay(10); 

else{ 
//only if isData1Low = 1, card bit could be 1 
RFIDcardNum[2-(recvBitCount-2)/8] |= (isData1Low << (7-(recvBitCount-2)%8)); 

//reset data0 and data1 
isData0Low = 0; 
isData1Low = 0; 

// печать метки карты 
if(isCardReadOver){ 
if(checkParity()){ 
Serial.println(*((long *)RFIDcardNum)); 

resetData(); 


byte checkParity(){ 
int i = 0; 
int evenCount = 0; 
int oddCount = 0; 
for(i = 0; i < 8; i++){ 
if(RFIDcardNum&(0x80>>i)){ 
evenCount++; 


for(i = 0; i < 4; i++){ 
if(RFIDcardNum&(0x80>>i)){ 
evenCount++; 


for(i = 4; i < 8; i++){ 
if(RFIDcardNum&(0x80>>i)){ 
oddCount++; 


for(i = 0; i < 8; i++){ 
if(RFIDcardNum&(0x80>>i)){ 
oddCount++; 


if(evenCount%2 == evenBit && oddCount%2 != oddBit){ 
return 1; 

else{ 
return 0; 


void resetData(){ 
RFIDcardNum = 0; 
RFIDcardNum = 0; 
RFIDcardNum = 0; 
RFIDcardNum = 0; 
evenBit = 0; 
oddBit = 0; 
recvBitCount = 0; 
isData0Low = 0; 
isData1Low = 0; 
isCardReadOver = 0; 

// функция interrupt0 
void ISRreceiveData0(){ 
recvBitCount++; 
isData0Low = 1; 

// функция interrupt1 
void ISRreceiveData1(){ 
recvBitCount++; 
isData1Low = 1; 

Примечание

Код этого проекта вы найдете в папке glava_06\input_events сопровождающего книгу электронного архива (см. приложение).