IO Communicatie tussen Arduino's onderling over Ethernet

Hallo,

Voor een projectje bij mij thuis ben aan het proberen 2 Arduino's onderling met elkaar te laten communiseren via ethernet (dus modum/router).
Het is de bedoeling dat de ene Arduino een output bij de andere Arduino kan aansturen.
Arduino 1 krijgt bijv. een Input binnen en stuurd dat vervolgens naar Arduino 2 die een relais aanstuurd.
Ik werk op school en thuis al wel 1,5 jaar met Arduino maar dit lukt mij nog niet :~

tech. spec.:

  • thuis een Wiznet Ethernetshield + Arduino Uno rev3 en Arduino Ethernet.
  • Webservers en dergelijke standaard ethernetprogramma's zijn al wel gelukt om draaiende te krijgen.
  • heb thuis ook een ChipKit MAX32 + ChipKit Networkshield waar dat programma op moet maar dat is de volgende (kleine) uitdaging 8)

Mijn vragen:

  • Weet iemand hoe deze communicatie heet ?
  • Kan iemand mij uitleggen hoe ik dit moet aanpakken/beginnen ?
  • Voorbeelden / voorbeeldcode ?

Met vriendelijke groet,

Matthijs

Je hebt bijvoorbeeld een webserver op de Arduino draaien.
Daar klik je een button aan, die via ethernet op een tweede Arduino wordt aangestuurd.

Dan moet de eerste Arduino een webserver hebben draaien, en ook als client iets kunnen sturen naar de tweede Arduino. De eerste Arduino luistert dus naar GET, en stuurt zelf een GET (met wat parameters) naar de tweede Arduino.
Volgens mij krijg je dan zoiets: http://arduino.cc/forum/index.php?topic=108269.0

Kan gewoon via utp protocol. Ik probeer dit weekend een voorbeeld te posten.
Kijk al eens naar mijn Castduino project op www.jo3ri.be onder arduino, projecten, castduino.
Wat jij wil zit daar ook in verwerkt: arduino's die met elkaar spreken over lan.

JO3RI:
Kan gewoon via utp protocol. Ik probeer dit weekend een voorbeeld te posten.
Kijk al eens naar mijn Castduino project op www.jo3ri.be onder arduino, projecten, castduino.
Wat jij wil zit daar ook in verwerkt: arduino's die met elkaar spreken over lan.

Wauw, erg mooi project. gaaf om te zien wat er allemaal mogelijk is met een Arduino !!
Ik heb jouw programma uiteraard ook geprobeerd, werkt erg mooi.
Maar jou programma is erg uitgebreid en lastig voor mij om te lezen.
sommige stukjes snap ik, sommige stukjes uit je programma ook niet.

Als jij nog een voorbeeld wilt posten zou ik leuk vinden !

Van jou Castduino project ga ik zeker dingen overnemen, zitten erg leuke dingen zoals de lay-out en setup pagina !!

Hoi,

oké het weeekend was te druk (of te ontspannend)

Ik post even een stukje van de code die kan gebruiken, om te communiceren over het netwerk met udp.

De master (die verstuurd)

Udp.beginPacket(slaveIp, 8888);
Udp.write(bufferomtezenden);
Udp.endPacket();
packetBuffer[0] = 0;
// now we keep listening for the acknowledge byte
while (packetBuffer[0] != 0x04){
  int packetSize = Udp.parsePacket();
  if(packetSize){
    Udp.read(packetBuffer, 1);
  } 
}

en de slave (de ontvanger):

int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    // Now that we know the master's IP thanks to receving an
    // UDP packet, we are going to set the senders IP as our
    // master IP.
    IPAddress remote = Udp.remoteIP();
    for (byte i=0;i<4;i++){
      masterip[i] =  remote[i];
    }
    // read the packet into our bufffer and get the senders IP addr and port number
    Udp.read(buffer, 92);
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    // send the acknowledge byte
    Udp.write(0x04);
    Udp.endPacket();
  }
  delay(10);

Zorg dat je zelf opzoek werk doet over hoe je udp gebruikt (met Arduino), want dat is wat je nodig hebt.

Je zorgt voor een buffer, die vul je op en verstuur je naar een poort en IP. Daar ontvang je die en zet deze weer in een buffer bij ontvangst. Deze buffer kan je dan weer uitlezen en koppelen aan een opdracht.

zorg dat je code verschillende onderdelen heeft die na elkaar worden uitgevoerd:

master:
void loop {
doe iets();
doe iets anders();
als het moet, verstuur dan een udp pakket();
doe nog iets ander ();

slave:

void loop{
die iets();
luister of er iets toekomt op udp();
doe iets met de ontvangen gegevens();
doe nog iets anders();
}

Hallo,

De afgelopen tijd heb ik het (redelijk) druk gehad.
ondanks dat ben ik toch een aantal avonden met mijn arduinos aan het prutsen geweest.

heb wat standaard voorbeelden genomen die ik zelf heb geprobeerd uit te werken.
het is mij echter helaas nog niet gelukt om dit werkend te krijgen.
ik denk dat het een en ander nog mist in mijn programma's, maar wat mist er/doe ik fout ?

de code voor het versturen van een pakketje (draait op Arduino Ethernet):

// Voor de Arduino Ethernet !!

#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x8D, 0xE6};
byte ip[]  = { 192, 168, 0, 11 };
byte gw[] = { 192, 168, 0, 1 };
byte subnet[] = { 255, 255, 255, 0 };

unsigned int localPort = 8888;      // local port to listen on

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

const int buttonPin = 2;
int buttonState = 0;

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  pinMode(buttonPin, INPUT);
  Serial.println("verbinding met Arduino Ethernet");
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    Serial.println("Pin 2 hoog");
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write("hello");
    Udp.endPacket();
    delay(1000);
  } else {
    Serial.println("Pin 2 laag");
    delay(1000);
  }
}

de code voor het ontvangen van een pakketje (draait op Arduino Uno + Ethernet shield):

// voor de Arduino Uno + Ethernet !!

#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>
 
// Enter a MAC address and IP address for your controller below.
 // The IP address will be dependent on your local network:
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[]  = { 192, 168, 0, 10 };
byte gw[] = { 192, 168, 0, 1 };
byte subnet[] = { 255, 255, 255, 0 };
 
unsigned int localPort = 8888;      // local port to listen on
 
// An EthernetUDP instance to let us send and receive packets over UDP
 EthernetUDP Udp;
 
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
 
void setup() {
   Serial.begin(9600);
   Serial.println("verbinding met Arduino Uno + shield");
   Ethernet.begin(mac,ip);
   Udp.begin(localPort);
 
}
 
void loop() {
 
  int packetSize = Udp.parsePacket();
   if(packetSize)
   {
     Serial.print("Received packet of size ");
     Serial.println(packetSize);
     Serial.print("From ");
     IPAddress remote = Udp.remoteIP();
     for (int i =0; i < 4; i++)
     {
       Serial.print(remote[i], DEC);
       if (i < 3)
       {
         Serial.print(".");
       }
     }
     Serial.print(", port ");
     Serial.println(Udp.remotePort());
 
    // read the packet into packetBufffer
     Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
     Serial.println("Contents:");
     Serial.println(packetBuffer);
 }
 }

Wat gaat er fout bij bovenstaande programma's ?
Probeer het nu met een "hello" berichtje, later wil ik zoals ik in mijn
eerste bericht vermeld er IO mee aansturen.

"broncode" arduinosite: http://arduino.cc/en/Reference/EthernetUDPWrite en http://arduino.cc/en/Reference/EthernetUDPRead

Met vriendelijke groet,

Matthijs