RFID считыватель + ATMEGA + Raspberry Pi


26.08.2014

У меня в распоряжении появились три различных RFID ридера:

  • настольный с интерфейсом USB (125 КГц). Поддерживает EM4001, EM4100, EM4200, TK4100;
  • ZNR-A26ID - для монтажа на стену с интерфейсом WG26 (125 КГц);
  • RFID-RC522 - отдельная плата на базе микросхемы MFRC522 с интерфейсом SPI (13,56 МГц);

RFID-USB FRID-WG26 RFID-RC522

Последний интересен тем, что позволяет читать и писать на карточку.

Настольный RFID reader с интерфейсом USB

Подключаем ридер с USB интерфейсом к компьютеру с Windows. Windows видит новое оборудование и сама устанавливает драйвер. RFID USB-ридер воспринимается Windows как HID-устройство. То есть, как аналог клавиатуры. Открываем Notepad, подносим карточку к ридеру. Когда карточка считывается, ридер пищит, мигает зеленым светом, а в окне Notepad или любого поля для ввода появляется номер карты. Ридер полностью симулирует ввод номера карты с клавиатуры. Больше ничего он не умеет. Ничего сложного, ничего интересного.

RFID reader для монтажа на стену с интерфейсом WG26

Такой ридер является стандартным прибором для настенного монтажа и контроля доступа в помещение. Он герметичен, наружу выходит 6 проводов:
Красный (Red) - VCC +8..15V
Черный (Black) - GND
Зеленый (Green) - Data0
Белый (White :)) - Data1
Серый (Gray) - BEEP
Пурпурный (Purple) - неизвестно, видимо LED.

Питание ридера 8..15В <100mA, но сигналы Data0, Data1 уровня 5 В. Передача данных выполняется по протоколу протокол WG26

Протокол WG26

Це двопровідний протокол, у якому "0" передаються по одній лінії Data0, а "1" по другій - Data1. Рівень сигналів Data0, Data1 близький до 5В. Падіння сигналу до 0 на одній з ліній означає передачу одного біта. Якщо 0 на Data0 - це 0, якщо 0 на Data1 - це 1. Взагалі, передається 26 біт, тому протокол і називається WG26. Аналогічно працює протокол WG32. Діаграма роботи протоколу:

Это двухпроводной протокол, в котором "0" передаются по одной линии Data0, а "1" по второй - Data1. Уровень сигналов Data0, Data1 близок к 5В. Падение сигнала до 0 на одной из линий означает передачу одного бита. Если 0 на линии Data0 - это 0, если 0 на Data1 - это 1. Всего, передается 26 бит, поэтому протокол и называется WG26. Аналогично работает протокол WG32. Диаграмма работы протокола:

wg26 timing

Структура данных:

wg26 data

Подключаем RFID reader с интерфейсом WG26 к микроконтроллеру ATMEGA

Подключаем Data0 к INT0, Data1 к INT1. Для считывания будем использовать прерывания по спаду. Данные о считывания отправляются по UART. схема:

frid reader wg26 scheme

Программа для микроконтроллера:


#include <stdio.h>
#include <avr/interrupt.h>
#include "uart.h"
 
#define RXUBRR (F_CPU/16/9600)-1
 
#define BUFFER_SIZE 11
char buffer[BUFFER_SIZE];
unsigned long int card_code = 0;
char bit_count=0;
 
void convert_to_decimal(char* dst, unsigned long src)
{
    int i;
    for (i = 0; i < 10; i ++)
    {
        dst[9 - i] = '0' + (int)(src % 10);
        src /= 10;
    }     
 
    dst[10] = 0;
}
 
ISR(INT0_vect) {
    card_code = card_code << 1;
    bit_count++;
}
 
ISR(INT1_vect) {
    card_code = card_code << 1;
    card_code = card_code | 0x01;
    bit_count++;
}
 
int main( void )
{
  uart_init(RXUBRR);
 
  MCUCR |= (1<<ISC01); // INT0 (falling edge)
  MCUCR |= (1<<ISC11); // INT1 (falling edge)
  GICR = ((1<<INT0)|(1<<INT1)); // Enable INT0, INT1
 
  sei();
  uart_puts("Started\r\n");
 
  while(1) {
    if (bit_count == 26) {
        card_code = card_code >> 1;
        card_code = card_code & 0x00ffffff;
 
        uart_puts("Card number: ");
 
        convert_to_decimal(buffer, card_code);
        uart_puts(buffer);
 
        uart_puts("\r\n");
 
        card_code=0;
        bit_count=0;
    }
  }
}

Скачать текст программы

Подключаем RFID reader с интерфейсом WG26 к Raspberry PI

Raspberry Pi не может работать с уровнем входных сигналов 5В. Говорят, что это может вывести Raspberry Pi из строя. Я не проверял.  Я использовал простую схему для согласования уровней сигналов. Схема подключения FRID reader WG26 + Raspberry Pi: FRID reader WG26 + Raspberry Pi

Пример для считывания на Python:


import RPi.GPIO as GPIO

_DATA0PIN = 23
_DATA1PIN = 24

GPIO.setmode(GPIO.BCM)
GPIO.setup(_DATA0PIN , GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(_DATA1PIN , GPIO.IN, pull_up_down=GPIO.PUD_UP)

cardnumber = 0
bit_count = 0
for x in range(0, 26):
        data0 = GPIO.input(_DATA0PIN )
        data1 = GPIO.input(_DATA1PIN )
        while ( (data0 == 1) and (data1 == 1) ):
                data0 = GPIO.input(_DATA0PIN )
                data1 = GPIO.input(_DATA1PIN )

        cardnumber = cardnumber << 1

        if data1 == 1:
                cardnumber = cardnumber | 0x01
        bit_count = bit_count + 1

        while ( (data0 == 0) or (data1 == 0) ):
                data0 = GPIO.input(_DATA0PIN )
                data1 = GPIO.input(_DATA1PIN )

cardnumber = cardnumber >> 1
cardnumber = cardnumber &  0x00ffffff
print cardnumber

В этих примерах не используются MSB и LSB биты. Если у Вас будет такая необходимость, Вы можете доработать этот код.

Плата RFID reader на базе микросхемы MFRC522 с интерфейсом SPI

Цей зчитувач досить популярний і цікавий тим, що використовує найбільш популярну робочу частоту 13,56 МГц. До того ж має дуже широкий функціонал, який дозволяє реалізувати різні задачі у яких задіяні можливості запису та зчитування інформації з картки. Якщо уважно почитати документацію до мікросхеми MFRC522, на якій базується ця плата, стане ясно, що можливості мікросхеми дуже широкі. Скачати документацію до мікросхеми MFRC522.

Этот считыватель достаточно популярен и интересен тем, что использует наиболее популярную рабочую частоту 13,56 МГц. К тому же имеет очень широкий функционал, который позволяет реализовать различные задачи в которых задействованы возможности записи и считывания информации с карты. Если внимательно почитать документацию к микросхеме MFRC522, на которой базируется эта плата, станет ясно, что возможности микросхемы очень широкие и позволяют расширить спектр использования технологии RFID за пределы привычных границ. Скачать документацию к микросхеме MFRC522.

Подключаем RFID reader MFRC522 к микроконтроллеру ATMEGA

frid reader rc522 schme
RFID-RC522 Atmega8
SDA PC0
SCK SCK
MOSI MOSI
MISO MISO
IRQ NONE
GND GND
RST PC1
3.3V 3.3V
Я не смог найти готовую библиотеку для GCC, поэтому взял библиотеку для Arduino и переписал. Если найдете ошибки, извините. Программа для МК:


#include <stdio.h>
#include <util/delay.h>
#include "uart.h"
 
#include "MFRC522.h"
 
#define RXUBRR (F_CPU/16/9600)-1
 
#define BUFFER_SIZE 2
char buffer[BUFFER_SIZE];
 
int main( void )
{
    uchar card_num[5];
    uchar i;
 
    sei();
 
    uart_init(RXUBRR);
    MFRC522_Init();
 
    uart_puts("RC522 started\r\n");
 
    while(1) {
        _delay_ms(500);
        if ( MFRC522_Request( PICC_REQIDL, card_num ) == MI_OK ) {
            if ( MFRC522_Anticoll( card_num ) == MI_OK ) {
                uart_puts("Card number:\r\n");
                for (i = 0; i < 5; i++ ) {
                    sprintf(buffer, "%x ", card_num[i]);
                    uart_puts(buffer);
                }
                uart_puts("\r\n");
            }
        }
    }
}

Скачать пример с библиотекой

Подключаем RFID reader MFRC522 к Rasperry PI

Схема підключення така:
Name Pin # Pin name
SDA 24 GPIO8
SCK 23 GPIO11
MOSI 19 GPIO10
MISO 21 GPIO9
IRQ None None
GND Any Any Ground
RST 22 GPIO25
3.3V 1 3V3
Роспиновка Raspberry Pi:

RaspberryPi_v2_pins

Проверяем файл /etc/modprobe.d/raspi-blacklist.conf

Строки, в имеющие отношение к spi, должны быть закомментированы. Пример файла: /etc/modprobe.d/raspi-blacklist.conf:

#blacklist spi-bcm2708
blacklist i2c-bcm2708

Обновляем систему:


apt-get update

Устанавливаем python-dev:


apt-get install python-dev
git clone https://github.com/lthiery/SPI-Py
cd SPI-Py
sudo python setup.py install
cd ..

Устанавливаем MFRC522-python:


git clone https://github.com/mxgxw/MFRC522-python

Запускаем пример:


cd MFRC522-python
python Read.py

Подносим карточку и радуемся работе устройства! Там же Вы найдете скрипт Write.py, демонстрирующий запись и считывание данных с карты. Успехов!

Читайте начало: RFID. Что это такое?

Коментарі:

Додати коментар

* - обов'язкові поля

Архіви