2 Arduino nano linken met ethernet

Arduino shields
Berichten: 3
Geregistreerd: 04 Jan 2017, 16:57

2 Arduino nano linken met ethernet

Berichtdoor Dirk-Jan » 16 Mrt 2017, 10:26

Goedemorgen allemaal,

Voor een project ben ik bezig om 2 arduino's te laten communiceren door middel van ethernet. Ik gebruik 2 arduino nano met 2 ethernet shields en een cat5 kabel. Nu ben ik niet heel erg bekend met de programmeertaal rond het ethernet gebeuren. Het doel is om vanaf de server data te kunnen versturen en ontvangen.

Als server code heb ik het volgende:

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

byte mac [] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6};
byte ip [] = {10, 0, 0, 177};

EthernetServer server (60);

int analoginput1 = A0;
int val1 = 0;

void setup(){
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
}

void loop(){
EthernetClient client = server.available();
Serial.println("receiving data");
int c = client.read();
Serial.println(c);

delay(500);
Serial.println("sending data");
server.println("Hello Client");
delay(50);
}



Als client code heb ik het volgende:

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

byte mac [] = {0xA2, 0xB3, 0xC4, 0xD5, 0xE6, 0xF7};
byte ip [] = {10, 0, 0, 180};
byte server [] = {10, 0, 0, 177};

EthernetClient client;

int analoginput1 = A0;
int val1 = 0;

void setup(){
Serial.begin(9600);
Ethernet.begin(mac, ip);

delay(1000);

Serial.println ("connecting");

if (!client.connect(server, 60)){
Serial.println ("connection failed");
}

}

void loop(){

if (client.available()){
Serial.println ("message transmitting");
client.println (123);

delay (500);

Serial.println ("message receiving");
char c = client.read();
Serial.println(c);


}
if (!client.connected()){
Serial.println("disconecting");
client.stop();
}
delay(50);
}


De data die de server verstuurd komt aan bij de client. De data die de client stuurt wordt echter niet ontvangen.
Wanneer iets dergelijks als het volgende in de server code zet, werkt het helemaal niet. Wanneer ik 'if (client){' of iets dergelijks gebruik, werkt er niets.

EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);

Zou iemand mij misschien enige uitleg kunnen geven hierover.

Alvast bedankt.

Groet DJ

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: 2 Arduino nano linken met ethernet

Berichtdoor Koepel » 16 Mrt 2017, 13:09

Hallo en welkom.

Kun je een link geven naar waar je die Nano boards en Ethernet Shields hebt gekocht ?
Er zijn namelijk Ethernet Shields die op een Nano te bevestigen zijn, maar die hebben meestal een ENC28J60 ethernet chip.
Er zijn ook goedkope Ethernet Shields in omloop met de verkeerde weerstanden bij de Ethernet aansluiting.

Zit er een socket op het Ethernet Shield voor een SD kaartje ?
Dan is het misschien handig om die chip select hoog te maken.

Zijn je Arduino boards verbonden met een thuisnetwerk, dus met een router ?
Of wil je los van het thuisnetwerk een kabel van de ene direct naar de andere ? Ik weet niet of dat werkt, ik heb daar zelfs nog niet eerder over nagedacht :?
Heb je dan een manier om ze te testen of het Ethernet Shield goed is ?

De Arduino Ethernet library heeft vreemde dingen. Wanneer je client.write("123") doet, dan wordt dat als één pakket verstuurt. Maar wanneer je client.print("123") of client.println("123") doet, dan wordt voor elk byte een pakket verstuurt :!:

Of je code goed is heb ik nog niet bekeken. Volgens mij heb ik maar één normaal Ethernet shield, dus ik kan het niet proberen :(

Het UDP protocol is iets eenvoudiger. Je zou een tweede sketch kunnen maken om dat te testen. De ene kan gewoon UDP packets er uit gooien, en de andere kan het lezen of niet.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: 2 Arduino nano linken met ethernet

Berichtdoor nicoverduin » 16 Mrt 2017, 13:55

Ikzou websockets for arduino gaan googelen.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 3
Geregistreerd: 04 Jan 2017, 16:57

Re: 2 Arduino nano linken met ethernet

Berichtdoor Dirk-Jan » 21 Mrt 2017, 21:04

Hallo allemaal,

Bedankt voor de reacties. Het idee is inderdaad om ethernet te gebruiken zonder internet. Het doel is om door middel van een kabel over langere afstand data te versturen. De kabel gaat onderwater dus vandaar dat het niet draadloos kan.

Hierbij de link van de boards en de shields:
http://www.tinytronics.nl/shop/Arduino/ ... -USB-Kabel
http://www.tinytronics.nl/shop/Arduino/ ... ield-W5100

De tip om client.write("123") te gebruiken heb ik toegepast en dat is inderdaad wel handiger.

Verder heb ik het werkend gekregen. Alleen zal dit tegen een aantal protocollen ingaan ten aanzien van het schrijven van programma's. Dit is wat ik nu heb:

Heb dus de code voor client en server gecombineerd in 1 programma. Aan beide kanten is een potmeter aangesloten om te controleren of de waardes goed binnen komen.

De volgende stap is om verschillende data binnen te krijgen.

Bedankt zover!

Server code:

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

byte mac [] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6};
byte ip [] = {10, 0, 0, 177};
byte server1 [] = {10, 0, 0, 180};

EthernetServer server = EthernetServer (60);
EthernetClient client1;

int analoginput1 = A0;
int val1 = 0;

void setup(){
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);

Serial.begin(9600);

Ethernet.begin(mac, ip);
server.begin();
Serial.println(Ethernet.localIP());

if (client1.connect(server1, 60)){
Serial.println ("connected");
}
}

void loop(){
int val1 = analogRead (analoginput1);
int val2 = map(val1, 0, 1023, 0 , 250);

EthernetClient client = server.available();
Serial.println("sending data");
server.write(val2);

delay(1000);
if (client1.available()){
Serial.println ("message receiving");
int c = client1.read();
Serial.println(c);
}

if (!client1.connected()){
Serial.println("disconecting");
client1.stop();
}
delay(50);
}



Client code:

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

byte mac [] = {0xB1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6};
byte ip [] = {10, 0, 0, 180};
byte server1 [] = {10, 0, 0, 177};

EthernetServer server = EthernetServer (60);
EthernetClient client1;

int analoginput1 = A0;
int val1 = 0;
int c = 0;

void setup(){
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);

Serial.begin(9600);

Ethernet.begin(mac, ip);
server.begin();
Serial.println(Ethernet.localIP());

if (client1.connect(server1, 60)){
Serial.println ("connected");
}
}

void loop(){
EthernetClient client = server.available();
int val1 = analogRead (analoginput1);
int val2 = map(val1, 0, 1023, 0, 250);
Serial.println("sending data");
server.write(val2);
delay(1000);


if (client1.available()){
Serial.println ("message receiving");
int c = client1.read();
Serial.println (c);
}

if (!client1.connected()){
Serial.println("disconecting");
client1.stop();
}


delay(50);
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: 2 Arduino nano linken met ethernet

Berichtdoor Koepel » 21 Mrt 2017, 21:26

Heb je al gekeken naar "websockets", ik heb daar ook op gezocht en dat lijkt me heel handig.

Een client.read() leest maar één byte. Dus de bedoeling is om te blijven lezen totdat alles binnen is.
Dat zul je dus dat in een buffer moeten zetten, en als het afgerond is dan vanuit die buffer converteren naar integers en zo.

Hier staan een aantal links naar voorbeelden: https://www.arduino.cc/en/reference/ethernet
In die voorbeelden wordt bijna altijd een client.read() gedaan, zolang er client.available() is. Soms is het while client.connected() en dan if client.available() dan client.read().

Waarom heb je een Arduino Nano verbonden met een Ethernet Shield ? Dat shield is bedoeld om op een Arduino Uno (of Mega of Due) te prikken.
Die Nano lijkt een FTDI chip te hebben, dan kan flinke problemen geven. Zoek maar op: ftdi gate
Het lijkt me veel beter als je twee Arduino Uno boarden koopt, daar dat Ethernet Shield op prikt, en de Chip Select voor het SD kaartje uit zet (hoog maken).

Wanneer je code laat zien, kun je dan gebruikt maken van code-tags ? Dat kan de knop "Code" zijn of de drop-down-list "Select a Syntax" en dan "C++".

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: 2 Arduino nano linken met ethernet

Berichtdoor nicoverduin » 21 Mrt 2017, 22:20

Websockets zijn hardstikke handig.... daarom draait zo ongeveer elke server ter wereld met websockets.... applicatie servers, database servers, security servers, load balancers etc etc. Begin vorig jaar nog iets opgezet met een raspberry en 2 nodemcu's. Ik zou wel vrije poort nummers gebruiken. Er is op het web een lijst van standaard gereserveerde portnummers te vinden
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 3
Geregistreerd: 04 Jan 2017, 16:57

Re: 2 Arduino nano linken met ethernet

Berichtdoor Dirk-Jan » 22 Mrt 2017, 11:12

Daar heb ik mij nog niet in verdiept maar dat zal ik eens doen! Ondertussen heb ik geprobeerd om meerdere data te versturen en dat is inderdaad vrij makkelijk. Alleen vraag ik mij af of de manier waarop ik het doe wel handig is en geen problemen op gaat leveren.

Het werkt dus wel in ieder geval. Die voorbeelden heb ik inderdaad wel gezien.

Eerlijk gezegd heb ik in eerste instantie niet goed gezocht naar ethernet shields en heb de eerste de beste genomen. De arduino nano's had ik al en wil ik ook gebruiken voor het vervolg van mijn project. Op internet had ik gevonden dat het mogelijk moest zijn om deze te gebruiken wannneer de headers op 10, 11, 12 en 13 worden aangesloten en icps pin wordt aangesloten. En blijkbaar werkt het op de manier dus wel.

Bedankt zover en ik zal mij eens verdiepen in websockets!

Groet

Terug naar Shields

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten