Ciao a tutti! ![]()
Mi sto imbattendo in un problema che sono sicuro sia possibile risolverlo ma per ora non ne esco ![]()
Dico subito che sto utilizzando Arduino Nano con Atmega328P e gli esempi che ho condiviso funzionano perfettamente senza nessun problema anche se tale micro non è consigliabile per via delle poche risorse di memoria che ha, nel caso si vogliono fare progetti più complessi ma non è quello che voglio.
Quello che desidero fare:
Fare un sistema a rete cablata con protocollo TCP/IP dove ogni Arduino Nano connesso al suo ENC28J60 mi trasmetta e riceva dalla rete ethernet facendo da ponte via seriale USART.
1.Un dispositivo è un Arduino Nano con ENC28J60
2.Ogni dispositivo ha un indirizzo MAC e IP unico.
3.Ogni dispositivo sono tutti connessi ad uno switch di rete.
4.Ogni dispositivo fa da ponte tra la comunicazione seriale UART <> Rete.
5.Un solo dispositivo della rete è un server, gli altri tutti client.
Quello che non riesco a fare:
Semplicemente non riesco ad avere più di un client connessi al server per scambiarsi i dati utilizzando la libreria UIPEthernet (GitHub - UIPEthernet/UIPEthernet: UIPEthernet library for Arduino IDE,Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32, Nordic nRF51, Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API.).
Ovviamente, prima di provare a fare tale progetto, ho provato prima ad controllare se funzionavano le schede ENC28J60.
Le schede sono queste:
Ho provato a scrivere un codice di esempio per mandare un messaggio al PC tramite IP dal browser e funziona.
Poi ho provato ad creare un server ed un solo client per scambiare dati dalla rete tramite seriale.
Poi, per testare bene le velocità, ho connesso ad entrambi gli Arduino due pulsanti e due led.
Ingressi pulsanti:
GPIO: 3, 4
Uscite led:
GPIO: 5, 6
Il funzionamento è semplice:
Quando viene premuto il pulsante del GPIO 3 di un dispositivo si accende il led del GPIO 5 dell'altro dispositivo.
Se viene rilasciato il pulsante il led si spegne.
Entrambi i dispositivi comandano il led dell'altro dispositivo tramite il loro pulsante, praticamente bidirezionale.
La cosa bella è che funziona perfettamente e le velocità sono perfette per quello che devo fare!!
Allego il codice del Server e del Client della prova funzionante:
Server:
#include <SPI.h>
#include <UIPEthernet.h>
//Inputs
#define Pin_In_1 3
#define Pin_In_2 4
//Outputs
#define Pin_Out_1 5
#define Pin_Out_2 6
byte MAC_Address[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01};
IPAddress ip(192, 168, 1, 5);
EthernetServer server(80);
EthernetClient client;
bool Input, Last_Input;
void setup() {
delay(10);
Serial.begin(115200);
pinMode(Pin_In_1, INPUT);
pinMode(Pin_In_2, INPUT);
pinMode(Pin_Out_1, OUTPUT);
pinMode(Pin_Out_2, OUTPUT);
delay(50);
Ethernet.begin(MAC_Address, ip);
server.begin();
Serial.println("Server V7");
Serial.print("IP: ");
Serial.println(Ethernet.localIP());
}
void loop() {
//Connessione
//---------------------------------------------------------------------------
if (!client || !client.connected()) {
client = server.available();
}
//Input
//---------------------------------------------------------------------------
Input = digitalRead(Pin_In_1);
if (Input != Last_Input) {
if (Input == 1) {
client.print("C1ONx");
} else {
client.print("C1OFFx");
}
Last_Input = Input;
}
//Output
//---------------------------------------------------------------------------
if (client && client.connected()) {
while (client.available() > 0) {
String Data = client.readStringUntil('x');
if (Data == "L1ON") {
digitalWrite(Pin_Out_1, 1);
} else if (Data == "L1OFF") {
digitalWrite(Pin_Out_1, 0);
}
}
}
}
Client:
#include <SPI.h>
#include <UIPEthernet.h>
//Inputs
#define Pin_In_1 3
#define Pin_In_2 4
//Outputs
#define Pin_Out_1 5
#define Pin_Out_2 6
byte MAC_Address[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x02};
IPAddress ip(192, 168, 1, 6);
IPAddress serverIP(192, 168, 1, 5);
EthernetClient client;
bool Input, Last_Input;
void setup() {
delay(10);
Serial.begin(115200);
pinMode(Pin_In_1, INPUT);
pinMode(Pin_In_2, INPUT);
pinMode(Pin_Out_1, OUTPUT);
pinMode(Pin_Out_2, OUTPUT);
delay(50);
Ethernet.begin(MAC_Address, ip);
Serial.println("Client A");
Serial.print("IP: ");
Serial.println(Ethernet.localIP());
}
void loop() {
delay(1);
//Connessione
//---------------------------------------------------------------------------
if (!client.connected()) {
Serial.println("Connessione al Server...");
if (client.connect(serverIP, 80)) {
Serial.println("Connesso!");
delay(100);
client.print("0x");
} else {
Serial.println("Fallito");
delay(1000);
return;
}
}
//Input
//---------------------------------------------------------------------------
Input = digitalRead(Pin_In_1);
if (Input != Last_Input) {
if (Input == 1) {
//client.write('1');
client.print("L1ONx");
} else {
//client.write('0');
client.print("L1OFFx");
}
Last_Input = Input;
}
//Output
//---------------------------------------------------------------------------
while (client.available() > 0) {
String data = client.readStringUntil('x');
if (data == "C1ON") {
digitalWrite(Pin_Out_1, 1);
} else if (data == "C1OFF") {
digitalWrite(Pin_Out_1, 0);
}
}
}
Dopo questa prova ho provato sul lato server a creare dei client in array ma succede che quando un client si connette l'altro non funziona.
Non ho delle solide competenze su come funziona bene la libreria UIPEthernet e il chip ENC28J60 per non parlare del protocollo TCP/IP ![]()
Avevo letto che tale libreria dovrebbe supportare 4 client connessi contemporaneamente.
Ho dato una letta all'esempio "AdvancedChatServer" ma è scritto in una maniera che proprio non capisco ![]()
Ho scoperto anche che il software che ho scritto per il lato server comunica con il client senza specificare il suo indirizzo IP...
Vorrei capire se con la prova funzionante che ho fatto posso espandere il sistema a più client... ovviamente entro i limiti della libreria e memoria degli ATMEGA328P.
PS: ho provato tale programma server e client anche con gli STM32F103C8T6 (Scheda Blue Pill) e funziona molto bene.
Questo è il programma che ho scritto con array di client sul lato server che non funziona...
cioè funziona ma si connette sempre ad un solo client ![]()
L'ho provato sia con Arduino Nano (senza superare la criticità della memoria) e anche sulla scheda STM32...
#include <SPI.h>
#include <UIPEthernet.h>
//Inputs
#define Pin_In_1 3
#define Pin_In_2 4
//Outputs
#define Pin_Out_1 5
#define Pin_Out_2 6
byte MAC_Address[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01};
IPAddress ip(192, 168, 1, 5);
EthernetServer server(80);
//Clients
#define Num_Clients 4
EthernetClient client[Num_Clients];
bool Input, Last_Input;
void setup() {
delay(10);
Serial.begin(115200);
pinMode(Pin_In_1, INPUT);
pinMode(Pin_In_2, INPUT);
pinMode(Pin_Out_1, OUTPUT);
pinMode(Pin_Out_2, OUTPUT);
delay(50);
Ethernet.begin(MAC_Address, ip);
server.begin();
Serial.println("Server STM32 V6");
Serial.print("IP: ");
Serial.println(Ethernet.localIP());
}
void loop() {
//Connessione
//---------------------------------------------------------------------------
for (byte i = 0; i < Num_Clients; i++) {
if (!client[i] || !client[i].connected()) {
EthernetClient newClient = server.available();
if (newClient) {
client[i] = newClient;
Serial.print("New connection > ");
Serial.println(i);
}
}
}
//Input
//---------------------------------------------------------------------------
Input = digitalRead(Pin_In_1);
if (Input != Last_Input) {
for (byte i = 0; i < Num_Clients; i++) {
//if (client[i] && client[i].connected()) {
if (Input == 1) {
client[i].print("ON1x");
} else {
client[i].print("OFF1x");
}
//}
}
Last_Input = Input;
}
//Output
//---------------------------------------------------------------------------
for (byte i = 0; i < Num_Clients; i++) {
if (client[i] && client[i].connected()) {
while (client[i].available() > 0) {
String Data = client[i].readStringUntil('x');
if (Data == "L1ON") {
digitalWrite(Pin_Out_1, 1);
} else if (Data == "L1OFF") {
digitalWrite(Pin_Out_1, 0);
} else if (Data == "L2ON") {
digitalWrite(Pin_Out_2, 1);
} else if (Data == "L2OFF") {
digitalWrite(Pin_Out_2, 0);
}
}
}
}
}
Qualsiasi aiuto è apprezzato!!!
![]()
Grazie in anticipo!!!!


