ESP-01

Ciao a tutti, mi servirebbe una mano/consiglio per poter interfacciare visual basic ad arduino in modo da controllare quest'ultimo da remoto con l'ethernet shield.
Ho gia' fatto qualche prova via seriale ed e' andato tutto bene, ora devo poter controllare diverse azioni (un motore, un led o...) con dei pulsanti sul forms. Il problema piu' grande e' che non so proprio da dove partire... :cry: accetto volentieri tutti i consigli.
Grazie per l'aiuto.

Io userei i sockets TCP.

Di visual basic?

Mi spiego meglio.Io sto cercando di creare in qualche modo un interfaccia grafica per inviare comandi ad arduino, il quale dovra' poi svolgere determinate azioni, e rivere dati da quest'ultimo. Il metodo piu' semplice per creare una una pagina di comando che mi e' venuto in mente e' appunto quello di utilizzare il forms di visual basic.
Ora che ci sto smanettando un po' ho notato che non so come far comunicare arduino/ethernet shield con il programma in VB (non via seriale). Ho cercato anche qua e la su internet per ho trovato solo esempi via seriale... Se qualcuno ha qualche altra idea per creare un interfaccia di controllo per arduino (senza andare troppo nel complicato) accetto tutti i consigli. :sweat_smile:

I sockets TCP li usavo una vita fa con visual basic per pilotarci i centralini bosch.., li usavo anche per tutti i 'dialoghi' tra C++ e Java, è tecnologia ultracollaudata. In VB o C# ti servirà il namespace System.Net.qualcosa e System.Threading, lato Arduino hai la libreria Ethernet che avrà la possibilità di gestire sockets.

In alternativa a VB potresti usare Firmata che non conosco ma sicuramente possiede le capacità di gestire Arduino in rete.

Sei in rete... TCP oppure UDP. Potresti anche usare HTTP ma lo trovo oversized per il tuo caso specifico.

Qui: http://www.lucadentella.it/2013/01/31/da-arduino-a-c-via-socket/
un esempio C# che usa il net, quindi non dovrebbe essere difficile usare il vb.net al posto.
Per la parte Arduino, è codice del 2013, e la ethernet shield è la enc28J60, e forse usa una libreria "vecchia" per quella shield, la ethercard.h

La libreria ethernet permette di usare UDP:

In questo esempio colloquio UDP tra Arduino e processing su PC.
Qui UDP vb.net: http://www.codeguru.com/columns/vb/communication-using-udp-and-visual-basic.html

Grazie mille a tutti per le risposte, ora mi informo su tutto e dopo mi rifaro' sentire :slight_smile:

Ciao, mi sono informato riguardo UDP e TCP pero' ho ancora alcuni dubbi. Se dovessi provare a creare un programma da visual basic che invia comandi ad ardunio con il metodo UDP, quest'utlimo dovrei configurarlo come server in ascolto e vb come client che invia giusto?

Secondo me dipende se usi TCP o UDP
Per TCP mi pare devi decidere chi è client e chi è server.

Se usi UDP non mi pare. Ho appena scritto un programma Arduino per ESP32 wifi che usa udp, manda e riceve da una app android (UdpSenderReceiver si chiama).
Non mi pare devi dire chi è client e chi è server. Nella lib WiFi e quindi anche nella ethernet la classe Udp non lo richiede, hai la classe Client e la classe Server per TCP e quindi li si devi decidere se in Arduino hai server o client.

codice Arduino per una ESP32 lora, che poi è ethernet in wifi, se da cellulare invio on, accendo un led, off lo spengo, arduino invece invia un contatore, letto dal cellulare solo se imposti la app in listener (attesa di un msg):

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

const char * networkName = "MIARETE";
const char * networkPswd = "MIAPASSWORD";
const char * udpAddress = "192.168.1.39";               // ip del cellulare
const int udpPort = 3333;
boolean connected = false;
WiFiUDP udp;
char buffer[200];
IPAddress locale;
const byte K_LED=22;

void setup()
{ delay(1000);
 Serial.begin(9600);
 connectToWiFi(networkName, networkPswd);
}

void loop()
{  //only send data when connected
 if(connected)
 { //Send a packet
   udp.beginPacket(udpAddress,udpPort);
   udp.printf("Seconds since boot: %u", millis()/1000);
   udp.endPacket();
   udp.parsePacket();
   if(udp.available())
   { Serial.println("available");
     memset(buffer,0,200);
     udp.read(buffer, 200); 
     Serial.println(buffer);
     if( strcmp(buffer,"on")==0) digitalWrite(K_LED,HIGH);
     if( strcmp(buffer,"off")==0) digitalWrite(K_LED,LOW);
   }
 }
 //Wait for 1 second
 delay(1000);
}

void connectToWiFi(const char * ssid, const char * pwd)
{ Serial.println("Connecting to WiFi network: " + String(ssid));
 WiFi.disconnect(true);            // delete old config
 WiFi.onEvent(WiFiEvent);          //register event handler
 WiFi.begin(ssid, pwd);            //Initiate connection
 Serial.println("Waiting for WIFI connection...");
}

//wifi event handler
void WiFiEvent(WiFiEvent_t event){
   switch(event) {
     case SYSTEM_EVENT_STA_GOT_IP:
         //When connected set 
         Serial.print("WiFi connected! IP address: ");
         Serial.println(WiFi.localIP());  
         //initializes the UDP state
         //This initializes the transfer buffer
         udp.begin(WiFi.localIP(),udpPort);
         connected = true;
         locale=WiFi.localIP();
         break;
     case SYSTEM_EVENT_STA_DISCONNECTED:
         Serial.println("WiFi lost connection");
         connected = false;
         break;
   }
}

ok va bene ho piu' o meno capito. Questo sketch mi sara' utile grazie mille :slight_smile:

Bene. Per la parte Udp vb.net prova a cercare su codeguru

nid69ita:
Non mi pare devi dire chi è client e chi è server.

Esatto, confermo, UDP è connectionless, quindi non c'è client o server.
Un sistema manda un pacchetto UDP ad un altro, punto. Non sa se la controparte esiste e se è accesa o se in ascolto, manda e basta. Chi deve ricevere "ascolta" e se riceve un pacchetto lo interpreta. Invece TCP richiede una connessione, quindi c'è un client (colui che inizia una connessione) ed un server (colui che sta in attesa di connessioni).
La differenza la puoi immaginare cos': UDP è come una bottiglia con un messaggio, gettata in un fiume sperando che a valle ci sia il destinatario, mentre TCP è come una telefonata (li client "chiama" il destinatario/server e può sapere se c'è e se risponde).

UDP si usa se non hai la necessità di avere la certezza che il destinatario sia attivo e/o se questi debba darti una qualche risposta in "tempo reale" (tralasciamo i problemi di sicurezza).
Poi ci sono anche varie altre soluzioni, ad esempio posso mandare un pacchetto UDP broadcast ossia non indirizzato ad un IP in particolare ma lo riceveranno tutti gli apparati connessi alla stessa subnet: se il destinatario si "riconosce"mi manda a sua volta una risposta UDP dalla quale posso sapere il suo IP e da quel momento agire, o iniziando a mandare pacchetti UDP indirizzati solo a lui, magari attivando una connessione TCP visto che ora conosco il suo IP. E' quello che si fa per fare un "discovery". Tra l'altro è il meccanismo che ho usato per il mio ripetitore di telecomando WiFi: un "client" riceve l'impulso IR dal telecomando in una stanza e manda via UDP broadcast il pulsante da inviare, il "server" lo legge ed agisce. Non ho bisogno di conferma della ricezione (non è importante, me ne accorgo se qualcosa non va :wink: ) e neanche di sapere e configurare l'IP del "server"...

Beh per ora penso sia abbastanza, fammi sapere se ti è stato utile sapere queste cose... :wink:

Ciao docdoc cio che mi hai scritto e’ stato utilissimo e ora so la differenza sostanziale tra UDP e TCP, infatti per le mie esigenze e’ meglio TCP dato che ho bisogno che il “messaggio” arrivi a destinazione.

Per evitare di aprire un altro Topic pongo un’altra domanda.
Se collego sullo stesso arduino mega la motor shield R3 e la ethernet shield HR911105A, queste ultime hanno dei pin che vanno in conflitto? Ho trovato i pin che sono utilizzati dalla motor shield ma non quelli della ethernet a parte il pin 4 per la scheda SD.

Lollo9906:
... Ho trovato i pin che sono utilizzati dalla motor shield ma non quelli della ethernet a parte il pin 4 per la scheda SD.

Strano ::), perché sono chiaramente indicati nel reference della scheda ... :smiling_imp:

Arduino communicates with both the W5500 and SD card using the SPI bus (through the ICSP header). This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used to select the W5500 and pin 4 for the SD card. These pins cannot be used for general I/O. On the Mega, the hardware SS pin, 53, is not used to select either the W5500 or the SD card, but it must be kept as an output or the SPI interface won't work.

Guglielmo

AH....ops :cold_sweat: ho guardato ovunque che li sta mattina sorry:'(
Purtroppo pero' da come ho appena letto i pin in conflitto sono piu' di uno.
A sto punto mi conviene comprare una wifi shield (magari ESP cosi non spendo un capitale) o fare magari un ponte H?

Dipende da cosa devi fare, potresti usare anche il solo ESP8266, parecchi esempi in rete anche in italiano.

Ciao, io ho l'esp8266 (https://www.google.it/search?q=esp8266&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjzsIjik97WAhXhLcAKHWx8D5QQ_AUICigB&biw=1920&bih=949#imgrc=gbT5MJfkn55x_M:) che pero' non riesco a far funzionare e non capisco per quale motivo. Ho provato pure a comprarne uno nuovo perche' pesavo fosse guasto ma nulla da fare. Adesso provo nuovamente ad utilizzarlo magari saro' piu' fortunato.
Puo' essere che questo modulo abbia bisogno di un circuito per variare la tensione di comunicazione con l'arduino?

Lollo9906:
Ciao, io ho l'esp8266 (https://www.google.it/search?q=esp8266&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjzsIjik97WAhXhLcAKHWx8D5QQ_AUICigB&biw=1920&bih=949#imgrc=gbT5MJfkn55x_M:) che pero' non riesco a far funzionare e non capisco per quale motivo. Ho provato pure a comprarne uno nuovo perche' pesavo fosse guasto ma nulla da fare. Adesso provo nuovamente ad utilizzarlo magari saro' piu' fortunato.
Puo' essere che questo modulo abbia bisogno di un circuito per variare la tensione di comunicazione con l'arduino?

Mi pare proprio di si, deve lavorare tutto a 3,3V. Su ebay trovi anche un modulino adattatore, che fa da tramite, esempio: link
Guarda anche in Megatopic, c'e' un thread immenso sui ESP

Probabilmente e' per quel motivo che non sono mai riuscito ad utilizzarlo, pero' ora che mi sono messo a cercare qualche informazione qua e la, ho trovato a questo indirizzo http://www.instructables.com/id/Getting-Started-With-the-ESP8266-ESP-01/ un tutorial in cui non menziona nulla riguardo la riduzione della tensione.
Provo a guardare il thread in Megatopic

Primo, non tutto quello che si dice in internet è oro colato.
Secondo, vedi comunque che anche nello schema pin collega la VCC ai 3,3V di Arduino, ma da quel pin 3,3 di Arduino NON vengono forniti molti mA quindi il modulo potrebbe non avere abbastanza corrente.
Terzo, se anche collegando la VCC a 3,3 si alimenta, avere i segnali (gli altri pin) a 5V tra Arduino e il modulo non è mai una bella idea. A volte alcuni moduli lo accettano. Sono moduli a 3,3V ma "5V tollerant" ma deve essere scritto da qualche parte.
Cioè non è che un dispositivo se ha VCC a 3,3V allora lo alimenti da 3,3V di Arduino e tutto funziona. Gli altri pin di Arduino rimangono a 5V mentre il dispositivo a 3,3V di solito ha i pin che lavorano e vogliono segnali a 3,3V.

P.S. sono programmatore e non elettronico, mie solo opinioni. Aspetta un parere da uno più esperto in elettronica.