$put_perv_real = "/home/www/dvakompa-ru/dopol/"; ?>
Рассмотрим небольшой проект применения платы 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 сопровождающего книгу электронного архива (см. приложение).