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. Що це таке?
Недавні записи
- Комп'ютерний зір (Машинний зір)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
- DC-DC для IGBT драйверів ізольований 2 W +15 -8 вольт
- U-FOC - Векторне керування безколекторними моторами
- FOC - своя реалізація векторного керування. Підбиваю підсумки 2022 року
- Конструктор регуляторів моторів. Підбиваю підсумки 2022 року.
Tags
ngnix flash flask i2c servo dma gpio avr solar bme280 docker eeprom sms java-script barometer rtc dht11 ssd1306 bldc motor raspberry-pi ssd1331 mpu-9250 dc-dc rfid foc st-link usb remap pwm capture soldering nodemcu lcd eb-500 esp8266 mpu-6050 nvic usart books mpx4115a timer adc bluetooth tim programmator meteo sensors led python websocket hih-4000 html pmsm mongodb bmp280 gps encoder displays smd stm32 css git examples rs-232 ethernet brushless 3d-printer watchdog max1674 exti atmega options battery uart wifi bkp piezo web
Архіви