PN532 und Serielle Kommunikation

Hallo an alle Forummitglieder,
ich versuche momentan mit zwei Arduino Nanos eine Straßensteuerung mit Rückmeldesystem für ein Car System zu programmieren für meine Modellbahn. Dabei habe ich mir überlegt NFC als Rückmeldesystem zu nutzen und die Fahrzeuge anhand der UID zu unterscheiden, dafür nutze ich zwei Pn532 Module mit der Elchhouse library im SPI Modus.

Damit versuche ich gerade speziell einen Feuerwehreinsatz zu realisieren bei dem nur die Feuerwehrfahrzeuge mit einer bestimmten UID an einem Servo abgezweigt werden, nachdem vorher ein Zufallswert von 1 generiert wurde (dieser soll später jede Minute neu generiert werden, da der Einsatz eine Minute dauert). Wenn gerade kein Zufallswert von 1 vorliegt sollen alle Fahrzeuge einschließlich der Feuerwehrwagen nicht abgezweigt werden.

Den groben Aufbau habe ich angehängt.

Für den Sender der Daten ,Arduino 1, benutze ich diesen Code:

#include <SPI.h>
  #include <PN532_SPI.h>
  #include "PN532.h"

  PN532_SPI pn532spi(SPI, 10);
  PN532 nfc(pn532spi);
    unsigned long Fahrzeug_UID = 4294960315;
unsigned long Fahrzeug_UID2 = 4294951346;
unsigned long Fahrzeug_UID3 = 0;
unsigned long Fahrzeug_UID4 = 0;


void setup(void) {
  Serial.begin(115200);
  //Serial.println("Hello!");

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    //Serial.print("Didn't find PN53x board");
    while (1); // halt
  }
  // Got ok data, print it out!
  //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);
  
  // configure board to read RFID tags
  nfc.SAMConfig();
  
  //Serial.println("Waiting for an ISO14443A Card ...");
}


void loop(void) {
  uint8_t success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
    
  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  // 'uid' will be populated with the UID, and uidLength will indicate
  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  
  if (success) {
    // Display some basic information about the card
    /*Serial.println("Found an ISO14443A card");
    Serial.print("  UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    Serial.print("  UID Value: ");*/
   //nfc.PrintHex(uid, uidLength);
  //  Serial.println("");
     unsigned long UID_unsigned;
  UID_unsigned =   uid[0] << 24;
  UID_unsigned +=  uid[1] << 16;
  UID_unsigned +=  uid[2] <<  8;
  UID_unsigned +=  uid[3];
 // Serial.println("UID Unsigned int"); 
 // Serial.println(UID_unsigned);
    if ((UID_unsigned)==(Fahrzeug_UID)){
          Serial.print('A');
        }
        if ((UID_unsigned)==(Fahrzeug_UID2)){  
          Serial.print('B');
        }
        if ((UID_unsigned)==(Fahrzeug_UID3)){
          Serial.print('C');
        }
        if ((UID_unsigned)==(Fahrzeug_UID4)){
          Serial.print('D');
          
        }
        delay (800);
    
   
  }
}

Und für den Empfänger diesen (Arduino 2, die auskommentierten Unterprogramme habe ich schon erfolgreich getestet):

#include <SPI.h>
  #include <PN532_SPI.h>
  #include "PN532.h"
  #include <Servo.h>

  PN532_SPI pn532spi(SPI, 10);
  PN532 nfc(pn532spi);
    unsigned long Fahrzeug_UID = 4294960315;
unsigned long Fahrzeug_UID2 = 4294951346;
unsigned long Fahrzeug_UID3 = 0;
unsigned long Fahrzeug_UID4 = 0;
char Uidtop;
 

long long int interval1 = 0 ;
long long int interval2 = 0 ;
long long int interval3 = 0 ;
long long int interval4 = 0 ;
long long int interval5 = 0 ;
long long int interval6 = 0 ;
int incomingByte;
long long int startzeit2 = 0 ;
int busvorhanden = 0 ;
Servo servo_pin_3;
long long int startzeit3 = 0 ;
int zuordner = 0 ;
int zufall = 0 ;
long long int startzeit1 = 0 ;
Servo servo_pin_2;
long long int startzeit4 = 0 ;
int Einsatzzufall = 0 ;
long long int startzeit5 = 0 ;
int Feuerwehrweiche = 0 ;
Servo servo_pin_4;
long long int startzeit6 = 0 ;

//int Kreuzung();
//int Bus();
int Feuerwehreinsatz();

void setup(void) {
  Serial.begin(115200);
//  Serial.println("Hello!");
 servo_pin_3.attach(3);
  randomSeed(analogRead(A0) + analogRead(A1) + analogRead(A2));
  servo_pin_2.attach(2);
  servo_pin_4.attach(4);
   interval1 = 2000 ;

  interval2 = 20 ;

  interval3 = 3000 ;

  interval4 = 6000 ;

  interval5 = 20 ;

  interval6 = 2000 ;

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
  // Serial.println("Didn't find PN53x board");
    while (1); // halt
  }
  // Got ok data, print it out!
 // 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);
  
//   configure board to read RFID tags
  nfc.SAMConfig();
  
 // Serial.println("Waiting for an ISO14443A Card ...");
}


void loop(void) {
  uint8_t success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
    
  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  // 'uid' will be populated with the UID, and uidLength will indicate
  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
// Serial.println("Incoming Byte: "+incomingByte); 
  if (success) {
    // Display some basic information about the card
 //  Serial.println("Found an ISO14443A card");
 //   Serial.print("  UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
 //   Serial.print("  UID Value: ");
 //  nfc.PrintHex(uid, uidLength);
  //  Serial.println("");
     unsigned long UID_unsigned;
  UID_unsigned =   uid[0] << 24;
  UID_unsigned +=  uid[1] << 16;
  UID_unsigned +=  uid[2] <<  8;
  UID_unsigned +=  uid[3];
 // Serial.println("UID Unsigned int"); 
// Serial.println(UID_unsigned);
    if ((UID_unsigned)==(Fahrzeug_UID)){
          Uidtop='A';
        //  Serial.println("A received top");
          delay(1000);
        }
        if ((UID_unsigned)==(Fahrzeug_UID2)){
          Uidtop='B';   
        //  Serial.println("B received top");
        }
        if ((UID_unsigned)==(Fahrzeug_UID3)){
          Uidtop='C';
        //  Serial.println("C received top");
        }
        if ((UID_unsigned)==(Fahrzeug_UID4)){
          Uidtop='D';
        //  Serial.println("D received top");
          
        }

        }
      //  Serial.println("received Uid top" + Uidtop);
if ( Serial.available() > 0)
  {
    incomingByte = Serial.read();
   Feuerwehreinsatz();
   //Kreuzung();
   //Bus();
  }
}

int Kreuzung()
{
  zufall =   random( 6 ) ;
  if (( ( ( millis() - startzeit1 ) ) >= ( interval1 ) ))
  {
    startzeit1 = millis() ;
    if (( ( zufall ) <= ( 2 ) ))
    {
      servo_pin_2.write( 112 );
    }
    else
    {
      servo_pin_2.write( 86 );
    }
  }
  return 0;
}
int Feuerwehreinsatz()
{
  if (( ( ( millis() - startzeit4 ) ) >= ( interval4 ) ))
  {
    startzeit4 = millis() ;
    Einsatzzufall =   random( 4 ) ;
  }
  if (( ( ( millis() - startzeit5 ) ) >= ( interval5 ) ))
  {
    startzeit5 = millis() ;
    while ( ( ( Einsatzzufall ) == ( 1 ) ) )
    {
      if (( 'C'  ==  incomingByte ) || ( 'B'  ==  incomingByte ))
      {
        Feuerwehrweiche = 1 ;
      }
      else
      {
        servo_pin_4.write( 90 );
      }
    }

  }
  if (( ( ( millis() - startzeit6 ) ) >= ( interval6 ) ))
  {
    startzeit6 = millis() ;
    if (( ( Feuerwehrweiche ) == ( 1 ) ))
    {
      servo_pin_4.write( 120 );
      Feuerwehrweiche = 0 ;
    }
  }
  return 0;
}
int Bus()
{
  if (( ( ( millis() - startzeit2 ) ) >= ( interval2 ) ))
  {
    startzeit2 = millis() ;
    if (( ( ( 'A' ) == ( Uidtop ) ) || ( ( 'D' ) == ( Uidtop ) ) ))
    {
      busvorhanden = 1 ;
    }
    else
    {
      servo_pin_3.write( 95 );
    }
  }
  if (( ( ( ( millis() - startzeit3 ) ) >= ( interval3 ) ) && ( ( busvorhanden ) == ( 1 ) ) ))
  {
    startzeit3 = millis() ;
    busvorhanden = 0 ;
    if (( ( 'A' ) == ( Uidtop ) ))
    {
      servo_pin_3.write( 55 );
    }
    else
    {
      servo_pin_3.write( 70 );
    }
  }
  return 0;
}

Das Problem liegt jetzt daran, dass der Feuerwehreinsatz nicht zustande kommt. Der Fehler könnte hierbei möglicherweise bei der Datenübermittlung, obwohl ich diese schon mit einem einfacheren Sketch getestet habe oder beim Code für den Arduino 2 liegen, dass der Fehler beim Sender Sketch liegt, konnte ich bereits durch das Testen von diesem ausschließen.

Auch wenn das Problem sehr speziell ist, hoffe ich, dass mir jemand weiterhelfen kann.

Grüße Zemizz

Kleines Update:

Ich habe nun, nachdem ich mit dem ursprünglichen Aufbau nicht weitergekommen bin, testweise den Servo für die Feuerwehrwagen direkt an den Arduino 1 angeschlossen, mit diesem Aufbau funktioniert die Feuerwehrsteuerung erstmals auch. Doch dabei habe ich ein neues Problem bemerkt: Wenn der Arduino über den Computer mit Spannung versorgt wird funktioniert die Feuerwehrsteuerung, aber wenn ich den Arduino an eine 9V Batterie anschließe über GND und VIN funktioniert das Programm nicht mehr.

Mein momentanes Programm:

#include <SPI.h>
  #include <PN532_SPI.h>
  #include "PN532.h"
  #include <Servo.h>

  PN532_SPI pn532spi(SPI, 10);
  PN532 nfc(pn532spi);
    unsigned long Fahrzeug_UID = 4294960315;
unsigned long Fahrzeug_UID2 = 4294951346;
unsigned long Fahrzeug_UID3 = 4294942658;
unsigned long Fahrzeug_UID4 = 0;
char Uidbottom;
 

long long int interval4 = 0 ;
long long int interval5 = 0 ;
long long int interval6 = 0 ;

int zufall = 0 ;
long long int startzeit4 = 0 ;
int Einsatzzufall = 0 ;
long long int startzeit5 = 0 ;
int Feuerwehrweiche = 0 ;
Servo servo_pin_4;
long long int startzeit6 = 0 ;


void Feuerwehreinsatz();

void setup(void) {
  Serial.begin(115200);
  //Serial.println("Hello!");
  randomSeed(analogRead(A0) + analogRead(A1) + analogRead(A2));
  servo_pin_4.attach(4);
  
  interval4 = 6000 ;

  interval5 = 20 ;

  interval6 = 2000 ;

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
  // Serial.println("Didn't find PN53x board");
     while (1); // halt
  }
  // Got ok data, print it out!
 // 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);
  
//   configure board to read RFID tags
  nfc.SAMConfig();
  
 // Serial.println("Waiting for an ISO14443A Card ...");
}


void loop(void) {
  uint8_t success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
    
  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  // 'uid' will be populated with the UID, and uidLength will indicate
  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
 
  if (success) {
    // Display some basic information about the card
   //Serial.println("Found an ISO14443A card");
   //Serial.print("  UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    //Serial.print("  UID Value: ");
   //nfc.PrintHex(uid, uidLength);
   // Serial.println("");
     unsigned long UID_unsigned;
  UID_unsigned =   uid[0] << 24;
  UID_unsigned +=  uid[1] << 16;
  UID_unsigned +=  uid[2] <<  8;
  UID_unsigned +=  uid[3];
  //Serial.println("UID Unsigned int"); 
// Serial.println(UID_unsigned);
    if ((UID_unsigned)==(Fahrzeug_UID)){
          Uidbottom='A';
        //  Serial.println("A received top");
       
        }
        if ((UID_unsigned)==(Fahrzeug_UID2)){
          Uidbottom='B';   
        //  Serial.println("B received top");
        }
        if ((UID_unsigned)==(Fahrzeug_UID3)){
          Uidbottom='C';
        //  Serial.println("C received top");
        }
        if ((UID_unsigned)==(Fahrzeug_UID4)){
          Uidbottom='D';
        //  Serial.println("D received top");
          //Serial.println(Uidbottom);
        }

        }


    Feuerwehreinsatz();
   
}


void Feuerwehreinsatz()
{
if (( ( ( millis() - startzeit4 ) ) >= ( interval4 ) ))
  {
    startzeit4 = millis() ;
    Einsatzzufall =   random( 4 ) ;
  }
  if (( ( ( millis() - startzeit5 ) ) >= ( interval5 ) ))
  {
    startzeit5 = millis() ;
    if ( ( ( Einsatzzufall ) == ( 1 ) ) )
    {
     if (( ( ( Uidbottom ) == ( 'C' ) ) || ( ( Uidbottom ) == ( 'B' ) ) ))
  {
    servo_pin_4.write( 110 );
    
  }
  else
  {
    servo_pin_4.write( 90 );
  }
    }
    else{
       servo_pin_4.write( 90 );
    }
  }
 
  return 0;
  
}

Grüße Zemizz

Eine 9 Volt Batterie liefert zu wenig Strom für die Servos.
Das geht nur an einem Netzteil oder eingeschränkt an USB.

Danke für die Antwort.

Mit erhöhter Spannung am Netzteil konnte ich dieses eine Problem lösen.

Grüße Zemizz