Считывание одновременно RFID-МЕТКИ с помощью нескольких RFID-считывателей [MFRC522]
у меня есть проект, который использует два RFID-считывателя, проект для подсчета меток с конвейерной ленты, в этом случае считыватель будет размещен в середине конвейерной ленты, а считыватель обращен друг к другу.
Поэтому у меня есть вопрос, могут ли два RFID-считывателя одновременно считывать одну или несколько меток? Я пробовал раньше, но когда я попытался отсканировать, два считывателя не ответили, но если я отсканирую один тег и один считыватель, он будет работать правильно.
Например: у меня есть readers 0 и readers 1, а также две переменные count0 и count1, помните, что читатели стоят лицом друг к другу, поэтому я помещаю один тег в середину reader0 и reader1, если читатель 0 сканирует тег, count0 увеличится до 1, а если читатель 1 сканирует тег одновременно, то он не будет считаться, потому что считыватель 0 отсканировал этот тег.
но в моем случае читатели (0 и 1) не ответили, если я поместил тег в середину читателей.
я использую этот учебник для своего проекта https://youtu.be/HmGmFknAIqc
и для этого проекта данные count0 и count1 я отправляю в nodemcu с помощью SoftwareSerial(5,6).
Я новичок в использовании Arduino, и я все еще узнаю об этом (я не слишком много понимаю).
Вот мой код arduino
/**
* --------------------------------------------------------------------------------------------------------------------
* Example sketch/program showing how to read data from more than one PICC to serial.
* --------------------------------------------------------------------------------------------------------------------
* This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
*
* Example sketch/program showing how to read data from more than one PICC (that is: a RFID Tag or Card) using a
* MFRC522 based RFID Reader on the Arduino SPI interface.
*
* Warning: This may not work! Multiple devices at one SPI are difficult and cause many trouble!! Engineering skill
* and knowledge are required!
*
* @license Released into the public domain.
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS 1 SDA(SS) ** custom, take a unused pin, only HIGH/LOW required **
* SPI SS 2 SDA(SS) ** custom, take a unused pin, only HIGH/LOW required **
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
*
*/
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h> //library penampil LCD
#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_1_PIN 10 // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 2
#define SS_2_PIN 8 // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 1
#define NR_OF_READERS 2
LiquidCrystal_I2C lcd(0x27,20,4); //0x3f dapat dicari dengan i2c scanner
SoftwareSerial s(5,6);
//SoftwareSerial s1(2,3);
byte ssPins[] = {SS_1_PIN, SS_2_PIN};
MFRC522 mfrc522[NR_OF_READERS]; // Create MFRC522 instance.
int i = 1;
byte code[10];
String uidString;
int count0 = 0;
int count1 = 0;
/**
* Initialize.
*/
void setup() {
s.begin(9600);
// s1.begin(9600);
Serial.begin(9600); // Initialize serial communications with the PC
while (!Serial);
SPI.begin(); // Init SPI bus
for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card
Serial.print(F("Reader "));
Serial.print(reader);
Serial.print(F(": "));
mfrc522[reader].PCD_DumpVersionToSerial();
}
// lcd.init();
// lcd.init();
// lcd.backlight(); //menghidupkan lampu latar LCD
// lcd.setCursor (3,0);
// lcd.print("Final Project");
// delay (1000);
// lcd.clear();
}
/**
* Main loop.
*/
void loop() {
// lcd.setCursor (0,0);
// lcd.print("SCAN RFID");
for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
// Look for new cards
if(reader == 0){
reader0(reader);
}else if(reader == 1){
reader1(reader);
}
}
}
/** SCAN RFID TAG READER0 */
void reader0(int reader){
if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
Serial.println();
Serial.print(F("Reader "));
Serial.print(reader);
// Show some details of the PICC (that is: the tag/card)
Serial.println();
Serial.print(F("Card UID = "));
dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
Serial.println();
// Serial.print(F("PICC type: "));
// MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);
// Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));
count0++;
lcd.setCursor (0,0);
Serial.print("Counter ");
Serial.print(reader);
Serial.print(" = ");
Serial.print(count0);
Serial.println();
s.write(count0);
}
mfrc522[reader].PICC_HaltA();
mfrc522[reader].PCD_StopCrypto1();
}
/** SCAN RFID TAG READER1 */
void reader1(int reader){
if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
Serial.println();
Serial.print(F("Reader "));
Serial.print(reader);
Serial.println();
// Show some details of the PICC (that is: the tag/card)
Serial.print(F("Card UID = "));
dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
Serial.println();
// Serial.print(F("PICC type: "));
// MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);
// Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));
count1++;
lcd.setCursor (0,0);
Serial.print("Counter ");
Serial.print(reader);
Serial.print(" = ");
Serial.print(count1);
Serial.println();
s.write(count1);
}
mfrc522[reader].PICC_HaltA();
// Stop encryption on PCD
mfrc522[reader].PCD_StopCrypto1();
}
/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
в любом случае извините за мой плохой английский:D
@drididi, 👍1
4 ответа
Это потому, что вы можете прослушивать только один интерфейс SoftwareSerial одновременно. На другом интерфейсе вы ничего не получите.
Библиотека SoftwareSerial
использует прерывания для просмотра контактов. Эти прерывания не могут быть легко разделены между различными интерфейсами, поэтому библиотека SoftwareSerial
не поддерживает их.
Вы можете сделать 2 вещи:
Вы можете отказаться от кода для отчетности перед последовательным монитором (так что никакого отладочного кода и никакого взаимодействия с последовательным монитором на ПК не будет) и использовать только ЖК-дисплей для отображения информации. Затем вы можете использовать бесплатный аппаратный последовательный порт для связи с одним из RFID-считывателей. Другие могут быть службами через единый
интерфейс SoftwareSerial.
Вы можете отказаться от Uno и купить Arduino Mega, который имеет 4 аппаратных последовательных порта. Затем вы можете подключить оба RFID-считывателя к аппаратным последовательным интерфейсам, используя первый последовательный интерфейс для связи с ПК и все еще имея один оставшийся интерфейс. Это был бы мой предпочтительный способ.
mfrc522 уже не так распространен, но если вы хотите использовать их, а не rdm6300 (более дорогое устройство, но более дешевые теги), то вы можете
Mfrc522 использует интерфейс spi, что означает, что каждому ведомому устройству нужен свой собственный порт выбора ведомого устройства от arduino, чтобы arduino мог выбрать, с кем он разговаривает в этот момент.
Вы должны прочитать это о нескольких устройствах SPI
, потому что SPI - это синхронная связь, я бы рекомендовал один mcu на считыватель (nanos или pro-minis дешевы), и они могут передавать результаты в центральный arduino
Взгляните на эту ссылку, она может вам помочь. Он использует четыре RFID считывателя одновременно
Я только начинаю проект с использованием RFID-меток для отслеживания автомобилей и двигателей на модельной железной дороге. Хотя я еще не очень далеко продвинулся, моей первой мыслью было использовать мультиплексор, чтобы выбрать, от какого считывателя я получаю данные в любой момент времени. Это не будет одновременно, но я смогу читать дюжину или больше в секунду, что, вероятно, достаточно.
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- MFRC522: прошивка неизвестна
- MFRC522 не сканируется карта
- RFID-RC522 не работает, горит красный светодиод
- Arduino Uno - Как записать персональные данные в NTAG213 с помощью RFID-RC522
- Отправка данных из ESP8266 в PHP
Извините, вы имели в виду SoftwareSerial, который я там использовал? я использую SoftwareSerial для отправки данных в nodemcu, а затем nodemcu отправит в thingspeak, код не был пересмотрен, я использую только SoftwareSerial (5,6), и пока я не использовал LCD. Я новичок в Arduino, я не слишком много понимаю, @drididi
я использую этот учебник https://youtu.be/HmGmFknAIqc, @drididi