Trasmissione di 3 numeri interi tra nodeMCU e Arduino Nano

Buonasera a tutti,

ho necessità di trasferire 3 numeri interi (che si aggiornano ogni 5 secondi nella scheda nodeMCU) a un Arduino NANO.

Avevo pensato ad un analogWrite nel nodeMCU, ma avrei bisogno di 3 fili + massa per la comunicazione più il "decriptaggio" delle informazioni sull'Arduino nano utilizzando la funzione pulseIn() per interpretare correttamente l'onda quadra in entrata al NANO, tuttavia vorrei chiedervi quale potrebbe essere la soulzione più semplice ed efficace, il protocollo I2C potrebbe fare al mio caso?

Dovrei solo inviare 3 int da NODEMcu e leggerli nel NANO.

grazie per il prezioso aiuto

Ma un volgare collegamento "seriale" (RX, TX e GND) no? ... credo sia la cosa più semplice ... ::slight_smile:

Guglielmo

gpb01:
Ma un volgare collegamento "seriale" (RX, TX e GND) no? ... credo sia la cosa più semplice ... ::slight_smile:

Guglielmo

ottimo! da quello che ho capito allora a me servirebbe solo un filo? (devo solo trasmettere i dati dal nodeMCU e leggerli nel NANO).
Inoltre: come velocità di trasmissione sono costretto ad utilizzare 115200 Baud, potrebbe crearmi dei porblemi?

grazie ancora

Un solo filo non basta, hai comunque il filo di trasmissione ed il GND che, ovviamente, deve essere in comune.

Perché sei obbligato ad usare i 115'000 Kbps ? ? ? ... fai una trasmissione ogni 5 secondi ... anche a 300 baud si fa :smiley:

Guglielmo

gpb01:
Un solo filo non basta, hai comunque il filo di trasmissione ed il GND che, ovviamente, deve essere in comune.

Perché sei obbligato ad usare i 115'000 Kbps ? ? ? ... fai una trasmissione ogni 5 secondi ... anche a 300 baud si fa :smiley:

Guglielmo

Perché la seriale del NodeMCU è confugurata su 115200 per la wifi, posso comunque leggere i dati sul Nano ad un velocità differente?

Ma non puoi usare la stessa seriale del WiFi ... devi ovviamente usare un'altra seriale dedicata alla cosa.

Credo che la libreria SoftwareSerial esista anche per NodeMCU ... quindi, SoftwareSerial da una parte e dall'altra e vai a 9600 che non da problemi.

Guglielmo

Softwareserial per nodemcu esiste di certo e va bene

Ma io regolerei i livelli in particolare con un partitore tra TX del nano e RX del MCU

Credo che un partitore 2,2 kilohom con 3,3 kilohom sia adatto

Veramente ha spiegato che il trasferimento è solo da NodeMCU verso Arduino Nano (TX NodeMCU ---> RX Arduino Nano) quindi .... il partitore non serve proprio, anzi, c'è da sperare che i livelli di uscita della NodeMCU siano veramente 3.3V altrimenti Arduino Nano ha anche difficoltà ad interpretare il livello HIGH.

Guglielmo

P.S.: Comunque, dovesse servire, cloni di Arduino Nano, si trovano anche con alimentazione 3.3V e clock 8MHz :wink:

gpb01:
Veramente ha spiegato che il trasferimento è solo da NodeMCU verso Arduino Nano (TX NodeMCU ---> RX Arduino Nano) quindi .... il partitore non serve proprio, anzi, c'è da sperare che i livelli di uscita della NodeMCU siano veramente 3.3V altrimenti Arduino Nano ha anche difficoltà ad interpretare il livello HIGH.

Guglielmo

P.S.: Comunque, dovesse servire, cloni di Arduino Nano, si trovano anche con alimentazione 3.3V e clock 8MHz :wink:

Grazie Guglielmo, effettivamente anche io non ho capito il senso del partitore, nel caso di problemi Hardware anche io ho paura che l'uscita a 3.3v possa essere a rischio interpretazione per il nano.
Userò quindi la libreria SoftwareSerial con velocità di trasmisisone a 9600,
ultima domanda che ti chiedo: dal momento che devo trasferire 3 interi e nel NANO devo sapere di quali interi si trattano, come faccio ad "etichettarli" nel nodeMCU per poi "riconoscerli" nel nano?
sono interi di un valore massimo di 127 quindi li ho dichiarati come tipo byte.

in sostanza devo inviare 3 byte etichettati da nodemcu a nano, magari anche con un controllo di parità per verificare la corretta ricezione dei dati.

Per quanto riguarda i livelli, leggi QUESTO mio vecchio post ... da 3V in su, Arduino Nano, alimentato a 5V, dovrebbe stabilmente leggere HIGH, però ... ::slight_smile:

Relativamente ai dati, ma li trasmetti sempre tutti e tre? O ti può capitare di trasmetterne anche uno solo, poi a distanza di tempo magari ancora lo stesso, poi un'altro e così via, mischiati? Perché le due strade da seguire sono diverse :wink:

Guglielmo

gpb01:
Per quanto riguarda i livelli, leggi QUESTO mio vecchio post ... da 3V in su, Arduino Nano, alimentato a 5V, dovrebbe stabilmente leggere HIGH, però ... ::slight_smile:

Relativamente ai dati, ma li trasmetti sempre tutti e tre? O ti può capitare di trasmetterne anche uno solo, poi a distanza di tempo magari ancora lo stesso, poi un'altro e così via, mischiati? Perché le due strade da seguire sono diverse :wink:

Guglielmo

I dati possono essere trasmessi in momenti diversi, quando ho il primo intero gli altri 2 sono noti (impostati a zero) e viceversa

gpb01:
Per quanto riguarda i livelli, leggi QUESTO mio vecchio post ... da 3V in su, Arduino Nano, alimentato a 5V, dovrebbe stabilmente leggere HIGH, però ... ::slight_smile:

Relativamente ai dati, ma li trasmetti sempre tutti e tre? O ti può capitare di trasmetterne anche uno solo, poi a distanza di tempo magari ancora lo stesso, poi un'altro e così via, mischiati? Perché le due strade da seguire sono diverse :wink:

Guglielmo

per quanto riguarda la lettura degli 8 bit per il mio numero, leggendo il datasheet, non mi sembra che dovrei avere problemi, nemmeno se il NANO è alimentato a 5v

Symbol Parameter Condition Min. Max.

VIH Input High Voltage VCC = 2.4V - 5.5V 0.6VCC VCC + 0.5

Mah ... allora potresti ogni volta trasferire due bytes ... nel primo byte metti un numero che identifica il dato e nel secondo byte metti il dato vero e proprio. Se poi vuoi aumentare la sicurezza di bytes ne trasmetti tre, l'identificativo, il dato, il checksum (che, per così poco, può benissimo essere un XOR dei valori preceventi) :wink:

Guglielmo

adm91:
per quanto riguarda la lettura degli 8 bit per il mio numero, leggendo il datasheet ...

Non è esattamente così e, nel post che ti ho linkato, c'erano le formule esatte.

Guglielmo

gpb01:
Mah ... allora potresti ogni volta trasferire due bytes ... nel primo byte metti un numero che identifica il dato e nel secondo byte metti il dato vero e proprio. Se poi vuoi aumentare la sicurezza di bytes ne trasmetti tre, l'identificativo, il dato, il checksum (che, per così poco, può benissimo essere un XOR dei valori preceventi) :wink:

Concordo, il problema è più semplice di quanto l'OP abbia temuto, secondo me gli basta fare qualche test, come dico io, "a secco" (ossia sketch che fanno per ora SOLO quello), poi quando funziona li "inscatola" in apposite funzioni (es. "sendByte(byte valore)" e "readByte(byte valore)"), e si porta queste nel suo codice.

Visto che progetta in pratica un "protocollino" e che il dato non va oltre 127, io farei per maggior sicurezza un pacchetto fatto così:

0xFF (start byte, che non si potrà mai confondere con i dati)
(byte che identifica la variabile, es. 0x01 per la prima, 0x02 per la seconda, ecc.)
(il valore da trasmettere)
(xor del valore ossia "val^0x7F" per evitare di avere il bit alto settato)
0xFE (end byte)

(certo, il controllo senza un handshake permetterebbe al ricevente solamente di identificare dati errati, non di correggerli).

Tra l'altro potrebbe anche "impacchettare" più di un valore da trasmettere ripetendo i tre byte centrali, fino a trovare lo stop 0xFE:

0xFF 0xFE (end byte)

gpb01:
Ma non puoi usare la stessa seriale del WiFi ... devi ovviamente usare un'altra seriale dedicata alla cosa.

Una mia curiosità, per mia ignoranza: mi spieghi meglio questa cosa, ossia per le NodeMCU non si può usare la seriale per comunicare ossia non si possono usare i pin RX e TX?

docdoc:
Una mia curiosità, per mia ignoranza: mi spieghi meglio questa cosa, ossia per le NodeMCU non si può usare la seriale per comunicare ossia non si possono usare i pin RX e TX?

Non l'ho detto io ... è lui che ha detto (post #4) che la seriale è utilizzata fissa a 115K per comunicare con il WiFi ...
... io la NodeMCU manco la conosco :smiley: :smiley: :smiley:

Guglielmo

gpb01:
Non l'ho detto io ... è lui che ha detto (post #4) che la seriale è utilizzata fissa a 115K per comunicare con il WiFi ...
... io la NodeMCU manco la conosco :smiley: :smiley: :smiley:

Hm anche io non ho mai usato una NodeMCU ma solo le WeMos D1, ma ora mi perplimo ancora di più, credo che mi serva qualche spiegazione dall'OP:

adm91:
Perché la seriale del NodeMCU è confugurata su 115200 per la wifi,

Fammi capire bene, a me non pare che la seriale della NodeMCU non si possa usare quando usi il WiFi, sono due cose diverse (a meno che tu non stia usando la seriale per gestire la NodeMCU comandandola da un Arduino ad esempio). Per toglierti il dubbio comunque, visto che 9600 baud ti bastano, usa la SoftwareSerial8266 e vedi se funziona su altri pin.

posso comunque leggere i dati sul Nano ad un velocità differente?

Non so se intendi questo, ma no, entrambi gli apparati che comunicano via seriale devono sempre "parlare" alla stessa velocità.

docdoc:
Fammi capire bene, a me non pare che la seriale della NodeMCU non si possa usare quando usi il WiFi, sono due cose diverse ...

Concordo.
In ogni caso, essendo ESP8266, dovrebbe avere almeno due seriali, se non tre!
Ne ho una, ma non l'ho mai testata!

Federico

In effetti sembrerebbe avere più di una seriale hardware ... ::slight_smile:


Guglielmo

Però, in contrasto con gli schemi che si trovano, leggo anche:

There’s only one full UART on the NodeMCU. The second UART is transmit only. The pin labelling is confusing, but is designed to make sense if you use the serial.swap function.

In normal circumstances (without the swap), I think that Serial is pins GPIO1 and 3 and Serial1 (to only) is pins GPIO2 and Ground.
When you’re using this setup, you shouldn have a computer plugged into the USB socket otherwise the serial port gets confused.

You could also try using software serial to give a full second serial port, but personally I’ve not had reliable results going down that route.

Don’t forget that you have to declare Serial and Serial1 seperatly and define both baud rates (which can be different).

Lascio quindi la parola a chi la usa normalmente ... ::slight_smile:

Guglielmo