Считывание одновременно 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

, 👍1


4 ответа


0

Это потому, что вы можете прослушивать только один интерфейс SoftwareSerial одновременно. На другом интерфейсе вы ничего не получите.

Библиотека SoftwareSerial использует прерывания для просмотра контактов. Эти прерывания не могут быть легко разделены между различными интерфейсами, поэтому библиотека SoftwareSerial не поддерживает их.

Вы можете сделать 2 вещи:

  • Вы можете отказаться от кода для отчетности перед последовательным монитором (так что никакого отладочного кода и никакого взаимодействия с последовательным монитором на ПК не будет) и использовать только ЖК-дисплей для отображения информации. Затем вы можете использовать бесплатный аппаратный последовательный порт для связи с одним из RFID-считывателей. Другие могут быть службами через единый интерфейс SoftwareSerial.

  • Вы можете отказаться от Uno и купить Arduino Mega, который имеет 4 аппаратных последовательных порта. Затем вы можете подключить оба RFID-считывателя к аппаратным последовательным интерфейсам, используя первый последовательный интерфейс для связи с ПК и все еще имея один оставшийся интерфейс. Это был бы мой предпочтительный способ.

,

Извините, вы имели в виду SoftwareSerial, который я там использовал? я использую SoftwareSerial для отправки данных в nodemcu, а затем nodemcu отправит в thingspeak, код не был пересмотрен, я использую только SoftwareSerial (5,6), и пока я не использовал LCD. Я новичок в Arduino, я не слишком много понимаю, @drididi

я использую этот учебник https://youtu.be/HmGmFknAIqc, @drididi


-1

mfrc522 уже не так распространен, но если вы хотите использовать их, а не rdm6300 (более дорогое устройство, но более дешевые теги), то вы можете
Mfrc522 использует интерфейс spi, что означает, что каждому ведомому устройству нужен свой собственный порт выбора ведомого устройства от arduino, чтобы arduino мог выбрать, с кем он разговаривает в этот момент. Вы должны прочитать это о нескольких устройствах SPI , потому что SPI - это синхронная связь, я бы рекомендовал один mcu на считыватель (nanos или pro-minis дешевы), и они могут передавать результаты в центральный arduino

,

1

Взгляните на эту ссылку, она может вам помочь. Он использует четыре RFID считывателя одновременно

,

1

Я только начинаю проект с использованием RFID-меток для отслеживания автомобилей и двигателей на модельной железной дороге. Хотя я еще не очень далеко продвинулся, моей первой мыслью было использовать мультиплексор, чтобы выбрать, от какого считывателя я получаю данные в любой момент времени. Это не будет одновременно, но я смогу читать дюжину или больше в секунду, что, вероятно, достаточно.

,