Komunikation zwischen 2 Arduino Unos - WiFi UDP

Hallo

Ich habe mehrere Arduinos im Einsatz, die ich teilweise an verschiedenen Stationen positioniert habe und auf einem mobilen Roboter. Ziel ist es, dass der Arduino an der Station dem mobilen Roboter bekannt gibt wenn die Station fertig ist.
Bei zwei Stationen funktioniert, dass hervorragend. Aber bei der dritten habe ich ein Problem. Bei dieser muss der mobile Roboter bekannt geben das er da ist, damit die Station starten kann. Der Arduino an der Station empfängt das UDP-Paket und schaltet darauf hin einen digitalen Ausgang. Wenn die Station fertig ist, setzt die übergeordnete SPS ihren Ausgang. Der Arduino registriert dies und sendet dem mobilen Roboter wieder ein UDP-Paket. Soweit zur Theorie.
Mein Problem ist nun, dass diese Kommunikation nicht zu Stande kommt. Der Arduino am Roboter sendet zwar das Paket, der an der Station reagiert aber nicht. Das selbe gilt umgekehrt. Die Station sendet, der mobile Roboter empfängt aber nichts.
Ich hab den Code schon überprüft, indem ich mich mit meine Laptop in das Netzwerk eingeklinkt habe und per Wireshark die Kommunikation aufgezeichnet habe. Und tatsächlich, es wird zwar an meinen PC gesendet, aber nicht an den anderen Arduino, soweit ich sehe. Sende ich aber von meinem PC ein UDP-Paket an einen der Arduinos kommt dieses an und er reagiert so wie gewollt.
Weil ich langsam nicht mehr weiter weiß, poste ich hier einmal den Code für die beiden Arduinos. Die Verkabelung hab ich mehrfach überprüft und mit dem PC funktioniert es ja auch, ich weiß einfach nicht mehr weiter.

Hier einmal der Code für den Arduino am mobilen Roboter:

/*
#include <SPI.h>
#include <WiFi.h>
#include <WiFiUdp.h>

int status = WL_IDLE_STATUS;
char ssid[] = "linksys"; //  your network SSID (name)
int keyIndex = 0;            // your network key Index number (needed only for WEP)


IPAddress ip_Robot(10,0,0,3);//static IPAddress Arduino Robot
IPAddress ip_Station(10,0,0,5);//static IPAddress Arduino Station
IPAddress ip_PC(10,0,0,10);//static IPAddress PC

unsigned int localPort = 2390;      // local port to listen on
unsigned int stationPort = 2391;

char packetBuffer[255]; //buffer to hold incoming packet
char SendBuffer[] = " Start";

const int buttonPin = 2;
const int startPin = 9;

WiFiUDP Udp;

void setup() {

  pinMode(buttonPin, OUTPUT);
  pinMode(startPin, INPUT);

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    while (true);
  }

  WiFi.config(ip_Robotino);

  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    status = WiFi.begin(ssid);
    delay(10000);
  }
  Udp.begin(localPort);
}

void loop() {
  int packetSize = Udp.parsePacket();
  
  if (packetSize)
  {
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len] = 0;

    if (len == 5)
    {
      digitalWrite(buttonPin, HIGH);
      delay(5000);
      digitalWrite(buttonPin, LOW);
    }

  }

  int state = digitalRead(startPin);
    
  if(state == HIGH)
  {
    Udp.beginPacket(ip_Station,stationPort);
    Udp.write(SendBuffer);
    Udp.endPacket();
    Udp.beginPacket(ip_PC,stationPort);
    Udp.write(SendBuffer);
    Udp.endPacket();
    delay(1000);
  }
}

Hier der Code für die Station:

#include <SPI.h>
#include <WiFi.h>
#include <WiFiUdp.h>

int status = WL_IDLE_STATUS;
char ssid[] = "linksys"; //  your network SSID (name)
int keyIndex = 0;            // your network key Index number (needed only for WEP)

IPAddress ip_Robo(10,0,0,3);//static IPAddress Arduino Robot
IPAddress ip_PC(10,0,0,10);//static IPAddress PC
IPAddress ip_Station(10,0,0,5);//static IPAddress Arduino Station

unsigned int localPort = 2391;      // local port to listen on
unsigned int robotPort = 2390;      // local port to listen on

char packetBuffer[255]; //buffer to hold incoming packet
char SendBuffer[] = " Start";

const int startPin = 2;//pinnumber for Station start
const int finishPin = 8;//pinnumber for Station finished

WiFiUDP Udp;

void setup() {

  pinMode(startPin, OUTPUT);
  pinMode(finishPin, INPUT);

  if (WiFi.status() == WL_NO_SHIELD) {
    while (true);
  }

  WiFi.config(ip_Station);

  while ( status != WL_CONNECTED) {
    status = WiFi.begin(ssid);
    delay(10000);
  }
  Udp.begin(localPort);
}

void loop() {

  int packetSize = Udp.parsePacket();
  
  if (packetSize)
  {
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len] = 0;

    if (len == 5)
    {
      digitalWrite(startPin, HIGH);
      delay(5000);
      digitalWrite(startPin, LOW);
    }
  }

  int state = digitalRead(finishPin);

  if(state == HIGH)
  {
      Udp.beginPacket(ip_Robot,robotPort);
      Udp.write(SendBuffer);
      Udp.endPacket();
      Udp.beginPacket(ip_PC,robotPort);
      Udp.write(SendBuffer);
      Udp.endPacket();
      delay(1000);
  }
}

Das Problem habe ich auch manchmal. Je nachdem auf welchem AP der Arduino angemeldet ist, gehen die UDP Pakete verloren. Vielleicht gehen die noch an den alten AP und dort ins nirwana.

Ich habe es noch nicht genau nachvollziehen können, unter welchen Umständen das passiert. Nach reconnect oder Reset des Arduino oder des Ap oder Switches ging es dann. Es lag bei mir nicht am Sketch.

@ElEspanol: Ich hab's jetzt einmal sicherheitshalber mit verschiedenen IP-Adressen bei beiden Arduinos versucht. Meinst du es bringt etwas wenn ich einmal den Router neu starte und bei beiden Arduinos den Reset-Button drücke, bzw. einen anderen Sketch aufspiele, und dann alles neu probiere?

Ein Test ist es allemal wert.

Wie ist denn die Netzinfrastruktur?

Wir haben einen Cisco Router, der uns Netzwerk bereit stellt. In dem Netzwerk haben wir vier Arduinos hängen, die alle wie beschrieben betrieben werden. Ansonsten hängt in de Netzwerk nichts.
Das Netzwerk selbst ist ein unverschlüsseltes WiFi-Netzwerk.

Was ich aber nicht verstehe ist, warum der Austausch direkt zwischen den Arduinos nicht funktioniert, wenn ich aber ein Signal von meinem Laptop sende, die Pakete bei den Arduinos ankommen.

Mit solchen delays im Code ist das schon mal nichts.

Musst du bei dem Wifi Shield keine mac adressen angeben?

Haben deine Arduino Stationen alle verschiedene IPs?

oder haben alle den gleichen Sketch mit der 10.0.0.5 ?

Von den Mac-Adressen weiß ich nichts. Ich hab auch darüber nichts gefunden, dass man die dem WiFi-Shield übergeben muss.

Alle Stationen haben verschiedene IPs. Der Roboter ist 10.0.0.3, die Stationen haben 10.0.0.1, 10.0.02 und 10.0.0.5. Ich hab extra aufgepasst, dass ich die selbe IP-Adresse nicht zweimal vergebe, damit es nicht zu Konflikten kommt. Ich verwende auch nicht den selben Sketch zweimal, um genau das zu vermeiden.

Ist zwar nur eine weit hergeholte Idee, aber prüfe mal im AP, ob die Stationen alle gleichzeitig angemeldet sind und alle verschiedene Mac Adressen haben. Könnte mir vorstellen, dass Klone aus Kostengründen mit derselben produziert werden.

Bezüglich der Mac-Adressen bin ich mir ziemlich sicher, dass es daran nicht liegt. Wenn ich mir die Datagramme, die ich auf einem Laptop bekomme, in Wireshark anschaue kommen die von den beiden IP-Adressen, die ich vergeben hab, und von zwei verschiedenen Mac-Adressen. Die Mac-Adresse zu ändern geht ja meines Wissens gar nicht. Ich kann sie zwar auslesen, aber ändern lassen darf sich diese Adresse nicht.
Gibt es vielleicht eine Möglichkeit mit einem Arduino den anderen anzupingen. Wenn ich das mit meinem Laptop mache finde ich beide. Jetzt wäre es interessant ob ich den einen Arduino mit dem zweiten anpingen kann. Sollte nicht einmal so ein einfacher Ping durchkommen, würde das ja auf ein grundlegendes Problem hindeuten.

Tausch mal die Hardware untereinander aus, um zu sehen, ob das Problem bei der Hardware bleibt.

Es hängen ALLE am gleichen Accesspoint? Mach mal mehrfach einen IPscan mit einem entsprechenden Programm, ob immer alle antworten. Z.B. Angry IP Scanner - Download - CHIP

Ja alles hängt auf dem selben Router.
Das mit den IP's werde ich mir mal anschauen. Die Hardware werde ich auch mal tauschen, irgendwo sollte ich ja noch ein paar Shields finden.