Grafico real time con Arduino

Buonasera!

E' da molto che cerco una soluzione per questo problema ma non ho trovato niente che faccia al caso mio.
Veniamo al dunque..
Vorrei creare un grafico che si aggiorni in tempo reale con valori trasmessi da arduino tramite al mio pc.

Per le prove ho usato questo semplicissimo sketch:

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.println(analogRead(A0);
  delay(10);
}

Ora come creare questo grafico? Avrei bisogno di qualcosa di abbastanza preciso e "real-time", non vorrei che i cambiamenti di tensione sull'adc venissero visualizzati dopo svariati secondi, ma bensì il più vicino possibile al momento in cui accadono.

Ho pensato di usare Matlab ma noto che il grafico è notevolmente in ritardo rispetto al "mondo reale".
Ho preso in considerazione anche python3 con la libreria mtplotlib ma non saprei bene da dove cominciare..

Ben venga qualsiasi tipo di suggerimento, soprattutto se orientato al mondo python:)

Potresti creare un buffer con il valore e i millisecondi (X,Y)
Quando il buffer è pieno mandi un seriale il contenuto.

Ancor meglio un buffer circolare.

Se l'importante é non perdere segnali potresti usare la mitica libreria LeOs2 e usare due task paralleli

Una legge i dati e li mette sul buffer.

L'altra svuota il buffer e li manda in seriale.

Per i grafici puoi usare quello che vuoi.

Non è un problema di Arduino, al massimo per velocizzare poi settare la seriale a 115200.
Se il grafico sul PC non aggiorna in tempo reale è un problema del PC o del programma sul PC.

Prova a utilizzare Processing (https://processing.org/).

const unsigned long Vcc = 5000UL;
unsigned long value = 0UL;

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  value = (Vcc * analogRead(A0)) / 1023;
  Serial.println(value); // stampa un valore tra 0 e 5000mV
  delay(10);
}

Così ti stampa un valore in millivolt compreso tra 0 e Vcc (5000).
Per calibrare la lettura devi leggere il valore tra Aref e GND e modificare la costante Vcc.

PaoloP:
Prova a utilizzare Processing (https://processing.org/).

Processing è una bella cosa, però non è di uso immediato, anche se l'IDE è lo stesso di Arduino e il modo di programmare molto simile, non a caso wiring è derivato da processing, rimane il fatto che il motore è java e se non conosci java non fai molta strada con processing, esattamente come non fai molta strada con Arduino se non conosci il C/C++. :slight_smile:
Il alternativa ci sono vari software per PC per plottare i dati in vari modi, quello che consiglio sempre è l'ottimo MegunoLink perché perfettamente integrato con Arduino e permette di creare facilmente GUI anche molto complesse, c'è la versione free che fa solo il plot.

Grazie mille per risposte rapidissime:)

chetto983:
Potresti creare un buffer con il valore e i millisecondi (X,Y)
Quando il buffer è pieno mandi un seriale il contenuto.
...

Ho notato che con lo strumento incluso nell' ide di Arduino per la creazione di "grafici", questi non sono afflitti dal ritardo che compiendo la stessa operazione con Matlab si presenta, credo che non dipenda dallo sketch ma da altro.

Ho sentito parlare di processing, magari proverò a farmi un' idea anche se con java non ci siamo propio...

Preferirei usare qualcosa che già conosco, tipo python, se possibile.
Ho provato, con gli stessi risultati del programma della Mathworks, ad usare quest'ultimo (matplotlib) ma i grafici sono molto distanti da qualcosa di "real-time".

Dove c'è Python c'è SukkoPera :D. Cosa intendi di preciso per "real-time"? Quale sarebbe un ritardo accettabile per te?

matplotlib è una libreria potentissima, forse non facilissima da usare, ma dovrebbe permettere anche quanto chiedi. Qua, ad esempio, dovresti poter trovare ispirazione:

Per real time intendo che non appena si verifica un cambiamento di tensione sull'adc, questo venga immediatamente mostrato nel grafico, sfasato di pochi millisecondi con il mondo reale.

Questo è quello che più o meno riesco ad ottenere con lo strumento "serial plotter" incluso nell'ide di Arduino e che con un semplice script python non accade (ho un ritardo di cinque o sei secondi).

Non so cosa sia il serial plotter, immagino un pezzo di Processing?

Il “semplice script python” cosa fa di preciso? Come legge i dati? Come lo plotta?

SukkoPera:
Non so cosa sia il serial plotter

Il serial plotter è una funzione inserita nell'IDE 1.6.7. Menù Strumenti --> Plotter seriale.

Per lo script ho copiato modificando alcune cose come il nome degli assi ecc.. quello trovato qui': Arduino-er: Python to plot graph of serial data from Arduino Uno analog input

EDIT:
Ho trovato qualcosa di molto interessante a questo link: http://www.x-io.co.uk/serial-oscilloscope/.
Nel video viene mostrato collegato ad un giroscopio a tre assi, sarebbe possibile realizzare qualcosa di simile con python? Anche solo per curiosità oltre al fatto che non dispongo di windows..

niente?:frowning: