RFID Reader + 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. Діаграма роботи протоколу:
Структура даних:
Підключаємо 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 Pі з ладу. Я не перевіряв. Тому я використав просту схему для узгодження рівню сигналів. Схема підключення:Приклад для считування на 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.Підключаємо 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. Що це таке?
Недавні записи
- DShot receiver on STM32
- CRSF to PWM
- U-FOC PC Monitor для Chrome browser
- Фільтрація Back-EMF. Безсенсорні BLDC мотори
- Text to speech. Українська мова
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
Tags
git wifi encoder solar atmega ssd1331 sensors nvic piezo rfid smd python usb rtc motor timer bmp280 mpu-9250 barometer ethernet html books sms flask ssd1306 adc battery max1674 lcd soldering avr bldc stm32 mongodb 3d-printer remap eeprom dc-dc displays java-script nodemcu programmator gps watchdog gpio raspberry-pi websocket flash rs-232 css hih-4000 foc brushless esp8266 uart meteo bme280 mpu-6050 examples i2c servo capture bluetooth led web options bkp pwm usart exti st-link tim docker ngnix dma pmsm dht11 eb-500 mpx4115a
Архіви




