RFID считыватель + ATMEGA + Raspberry Pi
У меня в распоряжении появились три различных RFID ридера:
- настольный с интерфейсом USB (125 КГц). Поддерживает EM4001, EM4100, EM4200, TK4100;
- ZNR-A26ID - для монтажа на стену с интерфейсом WG26 (125 КГц);
- RFID-RC522 - отдельная плата на базе микросхемы MFRC522 с интерфейсом SPI (13,56 МГц);
Последний интересен тем, что позволяет читать и писать на карточку.
Настольный 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. Диаграмма работы протокола:
Структура данных:
Подключаем RFID reader с интерфейсом WG26 к микроконтроллеру ATMEGA
Подключаем Data0 к INT0, Data1 к INT1. Для считывания будем использовать прерывания по спаду. Данные о считывания отправляются по UART. схема:Программа для микроконтроллера:
#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:
Пример для считывания на 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

RFID-RC522 | Atmega8 |
SDA | PC0 |
SCK | SCK |
MOSI | MOSI |
MISO | MISO |
IRQ | NONE |
GND | GND |
RST | PC1 |
3.3V | 3.3V |
#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 |
Проверяем файл /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. Что это такое?
Додати коментар

Недавні записи
- Адаптивний ПІД регулятор
- Конструктор регуляторів моторів. Структура.
- Конструктор регуляторів моторів. Анонс.
- Golang + Vue + PostgreSQL #2
- Golang + Vue + SQLite #1
- FOC Position Control. Векторне управління - Стабілізація положення
- Flask & Vue. Завантаження файлів. Приклад № 2.10
- Рекуперація. FOC і цікаві досліди
- Flask & Vue. OAuth. Приклад№ 2.9
- Flask & Vue. Використання систем збірки проекту. Webpack. Приклад№ 2.8
Tags
git st-link bme280 battery stm32 nvic dc-dc html flask raspberry-pi uart meteo watchdog motor foc i2c mpu-9250 flash smd docker usb soldering rtc pwm brushless atmega timer ngnix ssd1331 options avr bluetooth web esp8266 programmator barometer examples exti sensors encoder usart books eb-500 bldc eeprom servo rs-232 rfid solar pmsm websocket remap max1674 displays hih-4000 css java-script mpu-6050 3d-printer capture gpio bmp280 bkp adc lcd wifi gps dma sms dht11 ethernet mpx4115a python mongodb ssd1306 nodemcu tim piezo led
Архіви
