Go Down

Topic: MFRC522 RFID Reader hängt sich auf (Read 494 times) previous topic - next topic

shi2Pher

Jun 22, 2018, 05:16 pm Last Edit: Jun 22, 2018, 05:17 pm by shi2Pher
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

Code: [Select]
void setup() {
...
mfrc522.PCD_Reset();
..
}



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

Code: [Select]
#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.

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

#2
Jun 22, 2018, 05:27 pm Last Edit: Jun 22, 2018, 05:28 pm by postmaster-ino
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

pylon

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

ist falsch, das ist eine Instanz-Methode:

Code: [Select]
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.

Whandall

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

Welche Level-Shifter verwendest du?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

shi2Pher

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.


HotSystems

#6
Jun 23, 2018, 12:44 pm Last Edit: Jun 23, 2018, 12:46 pm by HotSystems
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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

shi2Pher

#7
Jun 23, 2018, 05:29 pm Last Edit: Jun 23, 2018, 05:29 pm by shi2Pher
Wir benutzen den Arduino Mega, der hat laut Datenblatt ein Input Limit von max. 20V.

Tommy56

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

HotSystems

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

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

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

shi2Pher

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.

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?

shi2Pher

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.

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up