Go Down

Topic: ricevere e mandare dati contemporaneamente  (Read 115 times) previous topic - next topic

rosanna97

Sep 16, 2020, 06:28 pm Last Edit: Sep 16, 2020, 06:35 pm by rosanna97
salve a tutti,vi presento il mio problema. In pratica sto lavorando ad un progetto nel quale mediante cavo USB collego arduino e invio real-time dei dati acquisiti dal sensore contemporaneamente a matlab. Mediante un piccolo programma sono riuscita ad estrapolare un conteggio dei picchi delle misure che mi vengono inviate ( dato il periodo con cui ricevo i dati da arduino questo algoritmo aggiorna una variabile di conteggio per poi azzerarsi ogni minuto e ripartire,in quanto mi interessa il dato proprio relativo al numero di picchi in un minuto) . Mi interesserebbe riuscire a visualizzare su un display lcd collegato ad arduino questo numero prima che si riazzeri. Poichè io so che dalla porta seriale fisica (COM3) posso solo inviare o solo ricevere, questa è già occupata a mandarmi i dati real-time, così avevo pensato di usare un modulo bluetooth che contemporaneamente recepisce questo dato e me lo scrive sull'lcd(lavorando così contemporaneamente mentre ricevo i dati dal sensore).Secondo voi è possibile una cosa del genere ? perchè non riesco a far funzionare bene la cosa... :smiley-confuse:
qualcuno potrebbe darmi una mano ? ve ne sarei molto grata.

gpb01

#1
Sep 16, 2020, 06:35 pm Last Edit: Sep 16, 2020, 06:36 pm by gpb01
... Poichè io so che dalla porta seriale fisica (COM3) posso solo inviare o solo ricevere, questa è già occupata a mandarmi i dati real-time ...
... e questa dove l'hai letta? :o

La seriale di Arduino è gestita ad interrupt e, se da una parte sta trasmettendo dati, dall'altra può tranquillamente riceverne e memorizzarli.

Guglielmo
Search is Your friend ... or I am Your enemy !

Maurotec

Se usi la seriale hardware questa è full-duplex sia su atmega che esp quindi c'è già un vantaggio da potere sfruttare. Ora parli di dati inviati da board verso pc in realtime, c'è da vedere se il vincolo temporale richiesto è sufficientemente ampio da potersi permettere il lusso di spedire uno o più byte da pc verso board, questo è il primo punto. Poi la visualizzazione su display ha un costo computazionale specie con HD44780.

Stesse considerazione nel caso di secondo canale di comunicazione bluetooth, con in più l'impegno di memoria e risorse rispetto alla sola seriale.

Senza saperne di più non posso dire altro.

PS:Anticipato da Guglielmo.

Ciao.

rosanna97

#3
Sep 16, 2020, 06:48 pm Last Edit: Sep 16, 2020, 06:52 pm by rosanna97
mi scuso, ma sono nuova in questo campo e pensavo di non poter gestire le due cose contemporaneamente su una singola porta. Posso quindi comunque mentre ricevo i dati e li sto plottando inviare il dato ad arduino e visualizzarlo sul display senza sovrapposizione di dati ?
per essere più dettagliata ho un sensore sr04 che ogni 100ms mi invia la distanza misurata su matlab e con un algoritmo ho creato un grafico real time. inoltre così come arrivato ho creato un algoritmo che mi conta il numero di picchi al minuto (avendo un periodo di campionamento di 100ms ho dichiarato una variabile di contaggio pari a 600 che dopo si resetta in modo da avere il numero in un minuto) questo dato ho necessità di invarlo sull'lcd. è possibile?

Maurotec

Ok, da quello che scrivi hai un vincolo temporale da rispettate di 100ms all'interno del quale devi leggere il dato che invii da PC verso la board e poi lo visualizzi. Questo vincolo è ampio sia per cpu ATmega che per ESP.

Quindi si non ci vedo problemi.

La seriale hardware ha un doppio buffer e fisicamente hai due fili TX su cui viaggiano i byte spediti da board verso PC, stessa cosa per RX ma il byte viene spedito da PC verso board.

Ciao.

maubarzi

Ma perchè il calcolo dei picchi non lo fai direttamente su arduino?
Perchè mandare i dati al pc per poi riavere indietro un valore estratto da un calcolo banale che puoi tranquillamente fare direttamente su arduino?
Calcoli e ogni tot aggiorni il display.
Oltretutto, potresti anche fare un conteggio sugli ultimi N valori gestendo un array circolare, cioè che scrive e quando ha finito la capienza ricomincia dall'inizio sovrascrivendo i valori precedenti.
Dopo il primo giro hai sempre gli ultimi N valori letti e potresti aggiornare il display anche più spesso.

Maurizio
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

rosanna97

tuttavia non capisco perché continua a darmi problemi...per visualizzare il dato ho semplicemente scritto nel loop di arduino lcd.write(Serial.read()) ..mentre in matlab nel ciclo di visualizzazione passo-passo dei dati fwrite(s,numeropicchi,'int') ; (dove s è la seriale).. sapete dirmi se c'è qualcosa di sbagliato in questo ? perché sullo schermo di arduino mi compare un quadratino bianco e non il numero... :(

gpb01

#7
Sep 16, 2020, 07:35 pm Last Edit: Sep 16, 2020, 11:36 pm by gpb01
... perché magari sarà il caso che ti studi la classe Serial ed il funzionamento di tutti i suoi metodi ... ::)

La Serial.read() legge UN solo byte e, comunque, prima occorre verificarne la disponibilità con la Serial.available() !

Sul forum ci sono centinaia di thread che parlano di come ricevere dati da seriale ...
... e ne trovi parecchi anche tra gli esempi del IDE ... ::)

Guglielmo

P.S.: ... e verifica anche in che "formato" viene trasmesso il tuo dato ... codificato in ASCII? ... binario puro? ... quanti caratteri/bytes? ecc. ecc
Search is Your friend ... or I am Your enemy !

Go Up