Grundstruktur für Signalübertragung mit Arduino über LAN

Hallo,

nach langer Suche habe ich mich doch entschieden hier meine Anfrage darzustellen. Vieles ähnliches gibt es schon jedoch verliert man schnell die Struktur da es doch immer individuelle Projekte sind.

Anfrage: Wie können zwei Arduinos konfiguriert werden, damit über ein lokales Netzwerk der Slave Arduino über einen Master Arduino steuerbar ist. Bsp. Eingang 1 High (Master) Ausgang 1 High (Slave) - oder beim Slave kommt ein Signal rein und beim Master erscheint eine Meldung über das LCD Modul.

Die Kabelgebundene Lösung wird hier bevorzugt.

Über einen Link oder Rat wäre ich sehr dankbar.

Grüße

Bret0401

Bei Ethernet nennt man das ganze nicht Master/Slave sondern Client/Server :wink:
Wobei der Client der "Master" ist, und der Server tut, wozu man ihn auffordert.
Da findest du viele Beispiele.

Wenn du willst, kannst du das ganze Webserver-Gedöns weglassen und direkte Socket-Kommunikation machen, sogar binär, der http - Overhead erlaubt aber, auch einen Browser manuell als Client zum Testen zu verwenden.

Ansonsten ist dies der Link : Ethernet - Arduino Reference. ( für ein Wiznet W5100 Shield )

Schau das telnet Beispiel an. Bei nur 1 Client am Server und wenn das Netz nur lokal ist, fallen viele Probleme weg...

Hallo,

Ist dies der richtige Weg?

ich lese und lese und hab wieder neue Fragen.
Ist es richtig, dass ich die Übertragung mit dem UPD Protokoll machen muss? Dies würde bedeuten, dass nur "String Arrays" übertragen werden?

Ich arbeite mich gerade ein, wie ich die "String Arrays" wieder als int auslesen kann und dann meine Ausgänge schalten kann.

Wenn jemand hier schon eine Anleitung hat oder ein anderes Tutorial wäre das super.

Grüße

Bret0401

Sorry, -- natürlich UDP - Protokoll :smiley:

Müssen nicht, aber es ist eine einfache Option.

Wie man Integer aus Strings extrahiert wird hier gezeigt:
http://forum.arduino.cc/index.php?topic=286740.msg2008167#msg2008167

Das kann man auch erweitern:
http://forum.arduino.cc/index.php?topic=293246.0

Also z.B. sowas schicken "A:123\nB:236\nC:4589"

Das kommt auf die Anwendung an was du besser ist. Erstes ist geeignet wenn man immer die selben Daten schickt. Das andere wenn sich die Anzahl und die Art der Daten ändert und man die einzelnen Integer identifizieren muss.

Du kannst Zahlen auch Binär Senden. Gerade bei UDP sollte man dann aber vielleicht eine Prüfsumme einbauen, da sich UDP nicht darum kümmert ob etwas wirklich empfangen wurde. Das sendet einfach ohne Kontrolle.

Geht auch ganz ohne Standard-Protokoll
http://forum.arduino.cc/index.php?topic=293541.0

Da war nur das Problem, dass ein write() ein ganzes TCP Paket verschickt.

Hallo,

also ich hab jetzt mal mit dem Beipiel "UDPSendReceive" aus der Bibliothek gespielt. Über Processing kann ich jetzt die LED am Empfänger einschalten sobald ich eine "5" sende. Ausschalten geht noch nicht - ist momentan auch egal.

Wie kann ich jetzt den Sender programmieren damit also ein zweiter Arduino das Processing ersetzt?

Eine Hilfe für eine Grundstruktur würde mir schon reichen.

hier mal der Sketch des Empängers:

#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008

// 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 };
IPAddress ip(192, 168, 178, 110);

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

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged"; // a string to send back

int val = 0;
int old_val = 0;
int state = 0;

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

void setup() {
// start the Ethernet and UDP:
Ethernet.begin(mac,ip);
Udp.begin(localPort);
Serial.begin(9600);
pinMode(5,OUTPUT);
}

void loop() {
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if(packetSize)
{

// read the packet into packetBufffer
Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
Serial.println(packetBuffer);

int k;
k = atoi(packetBuffer);

val = k;

if((val == 5)&&(old_val != 5)){
state = 1 - state;
delay(10);
}
old_val = val;

if(state == 1){
digitalWrite(5,HIGH);
}
else{
digitalWrite(5,LOW);
}

Serial.println( state);
// send a reply, to the IP address and port that sent us the packet we received
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ReplyBuffer);
Udp.endPacket();

}
delay(10);
}

Über jeden Tipp bin ich dankbar.

Grüße

Bret0401:
Wie kann ich jetzt den Sender programmieren damit also ein zweiter Arduino das Processing ersetzt?

Eine Hilfe für eine Grundstruktur würde mir schon reichen.

hier mal der Sketch des Empängers:

Was meinst Du wohl, was Dein angeblicher "Empfänger" an dieser Stelle des von Dir geposteten Codes macht:

    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();

Bekommst Du beim Ansehen des Codeschnipsels wirklich keine Idee, wie ein UDP-Paket gesendet wird?

Natürlich habe ich bemerkt, dass hier das Senden drin steckt. Leider habe ich noch nicht den Durchblick wie diese Zeilen im Sketch vorbereitet werden müssen.

Ich habe hier bezgl. einige Fragen:

  1. Bekommt der "Empfänger" des UdP Protokolls die IP des Senders im Packet mitgeliefert? Wie sonst soll das dann mit der remoteIP und dem remotePort funktinoieren?

  2. Wie muss ich beim Sender die Zeile lauten "Udp.beginPacket(???,???);" - Also wenn ich keine remoteIp und remotePort verwende? Sind das String Variablen oder int?

  3. Welche Angaben müssen vor void loop getrofen werden, damit das Udp Protokoll arbeitet?

Über einen kleinen Beispielsketch indem z.B. ein "A" gesendet wird wäre ich sehr dankbar.

Grüße und vielen Dank schon mal für die Posts

  1. ja

  2. siehe code, ungetest!

  3. die gleichen wie beim empfangen

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008

byte localmac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress localip(192, 168, 178, 110);
IPAdress remoteip(192, 168, 178, 120); // remote maschine

unsigned int localPort = 8888;
unsigned int remoteport = 8888; // remote maschine

char  ReplyBuffer[] = "A";

EthernetUDP Udp;

void setup() 
{
  Ethernet.begin(localmac, localip);
  Udp.begin(localPort);
}

void loop()
{
  Udp.beginPacket(remoteip, remoteport);
  Udp.write(ReplyBuffer);
  Udp.endPacket();   
  delay(5000);
}

#10 fehler korrigiert

FlyingEagle:
2. siehe code, ungetest!

IPAddress ip(192, 168, 178, 110);

...
IPAdress ip(192, 168, 178, 120); // remote maschine

Jetzt verwirre ihn doch nicht mit Rechtschreibungsfehlern und doppelten IP-Adressen in einem Sketch!

Der Thread-Starter ist doch auch ohne Compiler-Fehlermeldungen schon total von der Rolle und bekommt trotz eines funktionierenden Beispielprogramms, das UDP-Pakete sowohl empfangen als auch senden kann, es nicht auf die Reihe, ein viel einfacheres Programm zu machen, das nur UDP-Pakete sendet.

Ich schlage also mal eher das als Codebeispiel vor:

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008

EthernetUDP Udp;
IPAddress zielIPadresse(192, 168, 178, 110);
unsigned int zielPortnummer = 8888;
char zuSendenderText[]="HalloHallo!";

byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress meineIPAdresse(192, 168, 1, 177);

void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac,meineIPAdresse);
  Udp.begin(zielPortnummer);
  Serial.begin(9600);
}

void loop() {
  Udp.beginPacket(zielIPadresse, zielPortnummer);
  Udp.write(zuSendenderText);
  Udp.endPacket();
  Serial.print("Habe gerade gesendet: ");
  Serial.println(zuSendenderText);
  delay(10000);
}

hei hei hei, c&p error :confused:

Abba, er wollte nur ein A senden :smiling_imp:

Vielen Dank hat funktioniert.

Jetzt werd ich mal mit meinem "Sender - Empfänger" :slight_smile: ein wenig experimentieren.

Grüße

Bret0401