Hilfe zur pn532 NFC & tcrt5000 Arduino Auto Programmierung

Hallo , ich bin relativ neu in der Programmierung und brauche hilfe.
ich habe ein arduino auto zusammengebastelt , habe ein Mega, 5 TCRT5000 Linenfolge sensoren, 2 dc motoren über l298n und ein pn532 Nfc modul.

alles einzeln getestet , funktioniert. allerdings ist meine hauptaufgabe jetzt dass er normal fährt bzw der linienfolgt und dabei kontinuierlich nfc tags die unter der linie geklebt wurden einscannt, damit er ein betimmtes befehl ausführt. ich kann leider kein code erzeugen der das Schaft.
meistens kommt da ein code der nur fährt sobald ein nfc tag eingescannt wird unabhäging von den liniensensoren.
könnt ihr mir dabei helfen. zur vereinfachung habe ich nur einen sensor benutzt.

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_PN532.h>

// NFC-Modul definieren
#define PN532_IRQ   (2)
#define PN532_RESET (3)  
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);

// Motortreiber-Pins
#define enA 5
#define in1 6
#define in2 7
#define in3 8
#define in4 9
#define enB 10

// Sensor-Pin
#define sensor 32

// Piezo-Lautsprecher-Pin
#define piezo 22

// Variablen für die Zeitsteuerung
unsigned long lastNfcScanTime = 0;
const unsigned long nfcScanInterval = 500; // NFC Scan alle 500 ms

void setup() {
  // Pins als Ausgang definieren
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(piezo, OUTPUT);

  // Sensor-Pin als Eingang definieren
  pinMode(sensor, INPUT);

  // NFC-Modul initialisieren
  Serial.begin(115200);
  nfc.begin();
  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }
  // Firmware Version ausgeben
  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
  // In den normalen Modus konfigurieren
  nfc.SAMConfig();
}

void loop() {
  // Sensor lesen
  int sensorValue = digitalRead(sensor);

  // Fahren, wenn der Sensor die Linie erkennt
  if (sensorValue == HIGH) {
    vorwaerts();
  } else {
    anhalten();
    delay(3000); // 3 Sekunden warten
  }

  // NFC-Tag erkennen (alle 500 ms einmal prüfen)
  if (millis() - lastNfcScanTime >= nfcScanInterval) {
    lastNfcScanTime = millis();

    uint8_t success;
    uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer für die UID
    uint8_t uidLength;                        // UID-Länge
    success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
    if (success) {
      Serial.println("NFC-Tag gefunden!");
      tone(piezo, 1000, 100); // Ton ausgeben
      anhalten();
      delay(3000); // 3 Sekunden warten
    }
  }
}

// Motorfunktionen
void vorwaerts() {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, 200); // Geschwindigkeit anpassen
  analogWrite(enB, 200); // Geschwindigkeit anpassen
}

void anhalten() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enA, 0);
  analogWrite(enB, 0);
}

Ihr Code wartet, bis die Zeile nach "sensor" HIGH ist, um die Räder zu bewegen. Wenn die Linie, die auf den "Sensor" folgt, nicht mehr HIGH (weg von der Leitung) ist, stoppen die Motoren. In der Regel werden drei Sensoren und eine Logiktabelle verwendet, die zeigt, in welche Richtung das Auto zurück auf die Linie gelenkt werden soll.

Sensor L Z R Aktion
State  0 0 0 Halt - Sensoren nicht über der Linie oder am Endpunkt
       1 1 0 Rechts - Rechtssensor nicht über Linie
       0 1 1 Links - Linkssensor nicht über Linie
       1 1 1 Vorwärts - Sensoren über Linie

Hier ist eine Simulation des Fahrens von zwei Motoren in acht Standardrichtungen.

Hallo, danke für die Antwort allerdings ist das nicht das Problem, ich habe absichtlich auf ein Sensor reduziert zur Testzwecken.

Das eigentliche Problem ist das das Auto gar nicht fährt bei Linien Erkennung, sondern nur fährt wenn ein nfc Tag eingelesen wird. Er berücksichtigt gar nicht den Liniensensor , die Motoren drehen sich einfach so wie sie eingestellt sind. Irgendwie kann ich die beiden Systeme nicht separieren dass er normal die Tracking Funktion nutzt und dabei unabhängig nfc Tags scannt.

verzichte auf delay()

Da fehlt einiges im Code.

  1. Definiere den Typ der TAG.
  2. Schreibe einen Zahl / Befehl in einen Block
  3. Lese den Block aus und reagiere darauf.

Zu 1.

 // NTAG2x3 cards have 39*4 bytes of user pages (156 user bytes),
      // starting at page 4 ... larger cards just add pages to the end of
      // this range:

      // See: http://www.nxp.com/documents/short_data_sheet/NTAG203_SDS.pdf

      // TAG Type       PAGES   USER START    USER STOP
      // --------       -----   ----------    ---------
      // NTAG 203       42      4             39
      // NTAG 213       45      4             39
      // NTAG 215       135     4             129
      // NTAG 216       231     4             225

Auszug aus "ntag2xx_read.ino" ein Beispiel aus der Adafruit-Libs.

Zum Programmieren des Chips kannst du zu Not dein MODERNES Handy benutzen. Es gibt kostenlose Apps.

Dein Code sagt nur das er möglicherweise irgendwas gefunden hat, sagt aber nicht was er damit anfangen soll.

Tipp:
Du schreibst in den 1 erlaubten Block denn Text STOP . Dann liest du den Chip aus, und wenn das Ergebnis "STOP" ist dann gibst du Befehle "Anhalten".

Und wenn du in denn 2 Block einen Zahl reinschreibst, dann kannst du sogar eine Stopstelle mit Zeitangabe so machen.

Bei deinen Ausgabe passiert NIX, selbst wenn er die Karte Findest.

Hier mal ein Code-Teil wie ich das gemacht habe,

//----------------
  void sub_Karte_lesen(){
    uint8_t success;
    uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
    uint8_t uidLength;    
    uint8_t data[32];  
    akt_platte = "";
    success = nfc.ntag2xx_ReadPage(4, data);
    if (success) {
      for (int i = 0; i < 4; i++) {
        if (data[i] != 0x00) {
          akt_platte = akt_platte + (char)data[i];
        }
      }
    }
    success = nfc.ntag2xx_ReadPage(5, data);
    if (success) {
      Serial.println(akt_platte);  
      for (int i = 0; i < 4; i++) {
        if (data[i] != 0x00) {
          akt_platte = akt_platte + (char)data[i];
          Serial.println(akt_platte);  
        }
      }
    }
    sub_zeichne_platte (akt_platte);
  }

Gruß

Pucki

Wenn deine Kommentare stimmen, hält er an, wenn nfc "success" meldet.
Oder wenn der Sensor LOW erkennt.

Wenn der Kommentar nicht mit deiner Beobachtung übereinstimmt, solltest du das noch weiter vereinfachen und prüfen.

Und wenn er anhält, macht er erstmal lange (3000 ms) nichts mehr.

Und danach auch nix.
Er hat nämlich auch ein Timing-Problem.
Nach den 3000 ms dauert es vermutlich max. 5 ms bis er wieder success ist, und das Spiel geht von vorne los. Grund: Er kommt nicht schnell genug aus den Empfangsbereich.

Das ganze kann er nur mit einer prg-Steuervariable unterbinden.

Gruß

Pucki

vielen dank für die hilfen aber ich komme irgednwie nicht weiter.
ich habe jetzt den untenstehenden code , ich will einfach dass das auto normal fährt bei HIGH signal und bei LOW stehenbleibt. gleichzeitig , unabhängig vom fahren soll er einfach nur die NFC tags scannen.

aber das komische hier beim code ist dass der erstmal fährt und bei LOW weiter fährt bis gleichzeitig ein TAG eingelesen wird , dann bleibt er stehen. und erst dann weiterfährt wenn ich ein ein HIGH signal habe und gleichzeitig ein nfc tag gescannt wird.

bitte um hilfe.

 #include <Wire.h>
#include <SPI.h>
#include <Adafruit_PN532.h>

// NFC-Modul definieren
#define PN532_IRQ   (2)
#define PN532_RESET (3)  
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);

// Motortreiber-Pins
#define enA 5
#define in1 6
#define in2 7
#define in3 8
#define in4 9
#define enB 10

// Sensor-Pin
#define sensor 32

// Piezo-Lautsprecher-Pin
#define piezo 22

// Variablen für die Zeitsteuerung
unsigned long lastNfcScanTime = 0;
const unsigned long nfcScanInterval = 500; // NFC Scan alle 500 ms

void setup() {
  // Pins als Ausgang definieren
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(piezo, OUTPUT);

  // Sensor-Pin als Eingang definieren
  pinMode(sensor, INPUT);

  // NFC-Modul initialisieren
  Serial.begin(115200);
  nfc.begin();
  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }
  // Firmware Version ausgeben
  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
  // In den normalen Modus konfigurieren
  nfc.SAMConfig();
}

void loop() {
  // Sensor lesen
  int sensorValue = digitalRead(sensor);

  // Fahren, wenn der Sensor die Linie erkennt
  if (sensorValue == HIGH) {
    vorwaerts();
  } else {
    anhalten();

  }

  // NFC-Tag erkennen (alle 500 ms einmal prüfen)
  if (millis() - lastNfcScanTime >= nfcScanInterval) {
    lastNfcScanTime = millis();

    uint8_t success;
    uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer für die UID
    uint8_t uidLength;                        // UID-Länge

    success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
    if (success) {
      Serial.print("NFC-Tag gefunden! UID: ");
      for (uint8_t i = 0; i < uidLength; i++) {
        Serial.print(uid[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
      tone(piezo, 1000, 100); // Ton ausgeben
    }
  }
}

// Motorfunktionen
void vorwaerts() {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, 130); // Geschwindigkeit anpassen
  analogWrite(enB, 130); // Geschwindigkeit anpassen
}

void anhalten() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enA, 0);
  analogWrite(enB, 0);
} 

Du hast grundsätzlich vergessen beim Auslösen des TAG sensorValue == LOW
zu setzen.

SO z.b..

if (success) {
      Serial.print("NFC-Tag gefunden! UID: ");
      for (uint8_t i = 0; i < uidLength; i++) {
        Serial.print(uid[i], HEX);
        Serial.print(" ");

        anhalten();  // Karre stoppt 
       delay(3000); // 3 Sekunden warten die Zeit die die Karre stehen soll. Kann durch TAG eingelesen und geändert werden.
       vorwaerts()  // weiterfahren
       delay(3000); // x Sekunden warten (x =so lange bis die Karre aus den Empfangsbereich raus ist) musst du testen.

      }
      Serial.println();
      tone(piezo, 1000, 100); // Ton ausgeben
    }

Was hat der Text mit deinem Beispielcode zu tun, @pucki007 ?

Ja, komisch: Wie du wünschst, hat der nfc-Teil nichts mit dem Motor zu tun. Woran erkennst du, dass der Sensor LOW sieht, aber die Funktion anhalten() nicht aufgerufen wird?

Nimm mal tone() raus, das kann je nach Arduino mit analogWrite() kollidieren.

Ich schrieb "Grundsätzlich".

Was bedeutet, entweder er benutzt mein Beispielcode oder er muss die Variable setzen, damit andere Reaktionen erfolgen können.

Mein Code gibt ja nur eine Varitation vor. Mit der Variable kann er sich aber total austoben.

ps. : Wenn er die Varible von BOOLEAN auf integer umstellt, kann er sogar eine sehr große Menge von Varianten machen.

Er kann sie aber auch komplett weglassen. Und einfach in der " ```success`` Abfrage die Reaktion machen.
Ich würde da einfach den 2 Block des Chip auslesen und dann eine IF - Then abfrage machen darauf. Ähnlich mein eigenen Code weiter oben.

Auf diese Weise kann man ein ganzes Areal bauen. :wink:

Ich habe etwas ähnliches mal mit einen Barcode-Leser beim Modellbau gesehen, auf einer Messe.. Da wurde Waggon für Waggon abgekoppelt, der Barcode (war unter den Fahrzeug) gelesen und darauf hin die Weichen gestellt. So hat die Software dann automatisch neue Züge zusammengestellt. War aber vor der RFID-Zeit :wink:

Gruß

Pucki