MFRC522 RFID Reader hängt sich auf

Hey Leute,

mein Team arbeitet an einem Line-Follower mit RFID Reader MFRC522.

Nach ein paar Malen erfolgreichen Lesens erkennt der Reader keine RFID-Tags mehr. Wann genau das eintritt, konnten wir durch Tests nicht herausfinden. Der Fehler tritt sporadisch auf.

Wenn wir nach Auftritt des Fehlers den Ardunio resetten, liest der RFID er gar keine Karten mehr. Mittlerweile haben wir herausgefunden, dass wenn wir einen Sketch mit

void setup() {
...
mfrc522.PCD_Reset();
..
}

hochladen und darauf wieder den unten angegeben Original-Sketch hochladen, der Reader wieder eine Weile funktioniert.

#include <Arduino.h>
#include <iostream>
#include <Timer.h>
#include <MemoryFree.h>
#include <bitset>
#include "Pins.hpp"
namespace std {
  ohserialstream cout(Serial);
}

Timer timer;
static timeElement timerElement[2];
volatile uint8_t *portToMask[3] = {&PCMSK0, &PCMSK1, &PCMSK2};

DebugMessages debugMessages;
PinSteuerung pinSteuerung;
#ifdef WITH_EXPANDER

#include "Expander.hpp"

Expander* expander;
#endif
#ifdef WITH_MOTOR
Steuerung *steuerung;
#endif
#ifdef WITH_RFID

#include <MFRC522.h>

MFRC522 *rfidSensor;

void readRFID();

#endif

void readColorSensors(void *pArg);

volatile bool readNewRFID = false;

void setup() {
  DEF_A(Serial.begin(9600);)
  DEF_A(while (!Serial);)

  initPins(); //Pins registrieren

  #ifdef WITH_RFID
  rfidSensor = new MFRC522(PIN(RFID_SDA)->getPin(), PIN(RFID_RST)->getPin());
  SPIClass::begin(); //Wird für den RFID Sensor benötigt
  rfidSensor->PCD_Init();
  byte readReg = rfidSensor->PCD_ReadRegister(rfidSensor->VersionReg);
  Serial.println(readReg, HEX);
  byte regVal = 0xA0; //rx irq
  rfidSensor->PCD_WriteRegister(rfidSensor->ComIEnReg, regVal);
  readNewRFID = false;
  PIN(RFID_IRQ)->attachInterrupt(testCallback, FALLING);

  #endif

  #ifdef WITH_TIMER
  #ifdef WITH_COLOR_SENSOR || WITH_RFID
  timer.configTimers(1);
  #endif

  #ifdef WITH_RFID
  //Initialisiere den Timer für den RFID Sensor
  timerElement[1].setCallBack(readRFID);
  timerElement[1].setPeriod(MS_TO_PERIODE(20)); //Alle 20 millisekunden
  timer.startTimer(&timerElement[1]);
  #endif
  DEF("Timer Erfolgreich hinzugefügt")
  #endif

  Serial.println("Beginn");
}


#ifdef WITH_RFID
/**
 * 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);
  }
}

void activateRec();

void clearInt();
#endif

void loop() {
  DEF_STR("L")
  DEF_A(debugMessages.print();)
  DEF_STR("Free:" << freeMemory())
  //TODO haupt code
  #ifdef WITH_RFID
  if(readNewRFID){
    Serial.print(F("Interrupt. "));
    rfidSensor->PICC_ReadCardSerial(); //read the tag data
    // Show some details of the PICC (that is: the tag/card)
    Serial.print(F("Card UID:"));
    dump_byte_array(rfidSensor->uid.uidByte, rfidSensor->uid.size);
    Serial.println();

    clearInt();
    rfidSensor->PICC_HaltA();
    readNewRFID = false;
  }
  activateRec();
  #endif
}

#ifdef WITH_RFID

/*
 * The function sending to the MFRC522 the needed commands to activate the reception
 */
void activateRec() {
  rfidSensor->PCD_WriteRegister(rfidSensor->FIFODataReg, rfidSensor->PICC_CMD_REQA);
  rfidSensor->PCD_WriteRegister(rfidSensor->CommandReg, rfidSensor->PCD_Transceive);
  rfidSensor->PCD_WriteRegister(rfidSensor->BitFramingReg, 0x87);
}

/*
 * The function to clear the pending interrupt bits after interrupt serving routine
 */
void clearInt() {
  rfidSensor->PCD_WriteRegister(rfidSensor->ComIrqReg, 0x7F);
}

#endif;

Power Supply, PINS und Jumper wurden mehrmals kontrolliert. Hat jemand eine Idee?

P.S.: Der Code ist von einem Teammitglied. Ich blicke da selbst nicht so ganz durch.

Warum hängt ihr da nicht ein paar serial.print rein, damit ihr den Sketch debuggen könnt und evtl. sehen könnt wo dieser hakt.

Hi

Nun denn - was sagt der Freund dazu?
Weil: Auch ich blicke durch diese Code-Ansammlung nicht wirklich durch - wofür ein Line-Follower RF-ID benötigt, ist mir dabei ja noch egal.
Eigentlich dürfte der Code so ziemlich Nichts machen, da mir kein #define aufgefallen wäre, Welches die nachfolgenden #ifdef auslösen könnte.

Also entweder nicht der ganze Code, oder 'Das soll so' aber dann verstehe ich nicht, wieso Das zumindest erst Mal funktionieren kann.

MfG

SPIClass::begin(); //Wird für den RFID Sensor benötigt

ist falsch, das ist eine Instanz-Methode:

SPI.begin();

Der Code ist unvollständig, die restlichen Bestandteile müssen wir auch sehen. Poste Links zu allen verwendeten Bibliotheken! Meine Vermutung geht im Moment Richtung Ignoranz von Interrupt-Kontexten.

shi2Pher:
Power Supply, PINS und Jumper wurden mehrmals kontrolliert. Hat jemand eine Idee?

Jumper?

Welche Level-Shifter verwendest du?

Sorry wegen dem unvollständigen Code. Das sind über 100 Files...

PMs mit dem Code sind raus. Sollten Lösungen eintreffen, werde ich diese hier hochladen.

@pylon SPI ist ein Objekt in der SPIClass, Teammitglied sagt, das funktioniert.

@Whandall Die billigen Jumper Kabel verwenden wir. Wir haben 17-15 Volt Input auf nem Ardunio Mega. Von dort nehmen wir 3,3 V für das RFID Modul. Schwankungen während Drehung der Motoren haben wir noch nicht überprüft. Im Stillstand sind es konstant 3,3 V.

17 - 15 Volt sind für den Arduino zu viel, da wird der Onboard-Regler ziemlich heiß und kann evtl. auch kaputt gehen.
Ihr solltet da max. 7,5 - 9 Volt anschließen.

Wir benutzen den Arduino Mega, der hat laut Datenblatt ein Input Limit von max. 20V.

Dann wirf mal einen Blick ins Datenblatt, was der MFRC522 an Strom zieht, multipliziere das mit (17-5) V und dann überlege Dir mal, wie der Spannungsregler die Verlustwärme loswerden soll.
Da ist der Eigenbedarf des MEGA noch nicht mal mit eingerechnet.

Gruß Tommy

shi2Pher:
Wir benutzen den Arduino Mega, der hat laut Datenblatt ein Input Limit von max. 20V.

Ist mir schon klar.
Dann darf aber kein anderer Verbraucher angeschlossen sein.
Die Verlustleistung ist mit den Verbrauchern zu hoch für den verbauten Spannungsregler.
Der kann die Wärme nicht abführen.

Und ebenso wird die Spannung hinter dem Regler einbrechen, sodass kein stabiler Betrieb möglich ist.

shi2Pher:
Sorry wegen dem unvollständigen Code. Das sind über 100 Files...

Und du meinst das Ernst.....dein Sketch besteht aus 100 Dateien ?

Ja, das Projekt beinhaltet insgesamt 101 Dateien. Es ist ein Linefollower mit RFID und QTR Features. Teammate sagt, das muss sein (weil modulare Programmierung oder so). Wenn es nach mir gegangen wäre, hätte ich einen Sketch + Libs benutzt aber was solls.

An der Spannung kann was dran sein. Wie bekommen wir von der 17-15 Volt Reihenschaltung (4x18650 akku) konstant 9V bzw. dynamisch so 9-7V(sollte reichen?)? Einfach Widerstände nehmen?

HotSystems:
Dann darf aber kein anderer Verbraucher angeschlossen sein.

Werde ausprobieren, QTR und RFID von der H-Brücke zu versorgen und/oder die Input Spannung zu reduzieren.

shi2Pher:
An der Spannung kann was dran sein. Wie bekommen wir von der 17-15 Volt Reihenschaltung (4x18650 akku) konstant 9V bzw. dynamisch so 9-7V(sollte reichen?)? Einfach Widerstände nehmen?

Nein, keine Widerstände, sondern einen Stepdown-Regler kannst du verwenden.

Der fehlenden Antwort auf "Welche Level-Shifter verwendest du?" entnehme ich dass du keine verwendest.

Hältst du es für eine gute Idee 3.3V Devices mit 5V Signalen zu malträtieren?

Whandall:
Der fehlenden Antwort auf "Welche Level-Shifter verwendest du?" entnehme ich dass du keine verwendest.

Hältst du es für eine gute Idee 3.3V Devices mit 5V Signalen zu malträtieren?

Natürlich nicht. Zusätzliche Levelshifter haben wir bisher nicht verbaut. Der Ardunio Mega hat einen 3,3V Pin, den benutzen wir für den RFID.

Warum tust du es dann?

shi2Pher:
Natürlich nicht. Zusätzliche Levelshifter haben wir bisher nicht verbaut. Der Ardunio Mega hat einen 3,3V Pin, den benutzen wir für den RFID.

Der Unterschied zwischen der Versorgungsspannung und den Signalpegeln scheint Dir nicht bekannt zu sein.
Dafür bist Du Dir bei Deinen falschen Aussagen aber sehr sicher. Das wird nicht lange funktionieren.

Gruß Tommy

Ein Unterschied zwischen Versorgungsspannung und Signalpegeln ist mir nicht bekannt. Ich bin auch ein absoluter Noob in Sachen Etechnik.

Bin bisher davon ausgegangen, dass der Mega am Board mit 5V arbeitet und der 3,3V Pin zum RFID geht, GND vom RFID zum Mega und die anderen 6 Pins einfach am Mega angeschlossen werden. Ist das falsch?