Comunicazione tra Arduino e Python

Salve a tutti,
Qualcuno mi potrebbe gentilmente spiegare come funziona e come posso passare una coppia di coordinate float dall’arduino ad un programma in python in un pc collegato tramite seriale.
Ho fatto dei test e ho trovato online degli esempi però con la comunicazione di una sola coordinata.
Grazie in anticipo.

P.s. Allego di seguito il file del test di Arduino.

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

void loop() {
 float X = random(-1000, 1000);
 float Y = random(-1000, 1000);
 int ritardo = random(5, 50)*100;
 Serial.print(X);
 Serial.print(';');
 Serial.println(Y);
 delay(ritardo);
}

test.ino (249 Bytes)

Allora, intanto la random() restituisce numeri interi, non float.

Ma a parte questo, quello che viene mostrato sul monitor seriale sono i due numeri separati da punto e virgola, e con il punto decimale quindi due cifre decimali, quindi mi pare corretto.

Ma dipende tu quale formato ti aspetti dall'altra parte, poiché si tratta comunque di una stringa che devi acquisire attendendo i caratteri '\r' e '\n' (che delimitano la fine del singolo record), dividere i due valori usando il punto e virgola, quindi convertire le due stringhe in float.

Grazie della dritta per la funzione random che non avevo considerato questo dettaglio.

Quindi lato python devo leggere da seriale i caratteri racchiusi tra '/r' e '/n' che se ho capito bene così facendo (stampando con serial.print) leggo da seriale ogni coppia di coordinate come stringa nel formato "X;Y" e da ognuna poi provvedo a separare le due componenti.

Un'ultima cosa... su Python mi sapresti dire come fare a leggere da seriale?

La "Serial.println()" manda la stringa passata come parametro più automaticamente il "newline" che è costituito dalla coppia di byte '\r' e '\n' (valori ASCII 13 e 10 rispettivamente).

Quindi tu da programma PC dovresti aspettare il carattere '\n' (codice 10) accumulando tutti i caratteri ricevuti nel frattempo, escluso il carattere '\r' (13). A quel punto devi fare il parse della stringa così ricevuta.

Un'ultima cosa... su Python mi sapresti dire come fare a leggere da seriale?

Mi spiace, ma non ho mai programmato in Python... C, C++, C#, VB, Pascal, Prolog, assembler Z80, ma niente Python. ;)

ComunqueGoogle è tuo amico, se cerchi "python serial" trovi ad esempio QUESTA pagina oppure QUESTA pagina. ;)

@edoca1999 non capisco una cosa, vuoi passare dati a qualcosa che è su PC, in un tuo thread precedente (qui) chiedevi su Processing. Ora chiedi di Python ma non mi pare lo conosci. Python non mi pare il massimo se devi fare grafica 2d e colloquio con seriale (cerchi di fare su pc un grafico?). Ma su PC che linguaggio conosci ?

nid69ita: @edoca1999 non capisco una cosa, vuoi passare dati a qualcosa che è su PC, in un tuo thread precedente (qui) chiedevi su Processing. Ora chiedi di Python ma non mi pare lo conosci. Python non mi pare il massimo se devi fare grafica 2d e colloquio con seriale (cerchi di fare su pc un grafico?). Ma su PC che linguaggio conosci ?

Ciao nid69ita, io di base conosco molto bene c++ e da poco mi sono messo a studiare Python dietro consiglio di amici che lo reputano un linguaggio molto semplice soprattutto per il plot 2d. Cercando su internet e anche qui nel forum mi ero imbattuto in Processing che però, pur avendo un linguaggio molto simile al c++ e un'interfeccia Arduino-ide-friendly, non mi è sembrato molto funzionale.

Pertanto sono tornato alla ribalta chiedendo consigli su come fare plot 2d con python. Spero di essere stato chiaro e sono pronto a rispondere ad ogni domanda.

Plot 2D con Python non è strettamente attinente col forum, ricevere da Arduino quasi neanche, trasmettere con Arduino si.

Ma rimanendo al formato 23.45;0.005\r\n puoi provare a ricevere + scomporre + convertire con una funzione come questa (a cui passi l'oggetto seriale) da cui ottieni i due float e False se andato a buon fine, o due None e True se qualcosa è andato storto:

def ricevi(s):
    try:
        a, b = (float(x) for x in s.read_until(b'\n').split(b';'))
        return a, b, False
    except:
        return None, None, True
a, b, error = ricevi(seriale)
if not error:
    .....

Claudio_FF: Plot 2D con Python non è strettamente attinente col forum, ricevere da Arduino quasi neanche, trasmettere con Arduino si.

Grazie per la risposta Claudio, mi scuso e mi rendo conto di essermi spinto troppo in là con la domanda, ma ho provato a chiedere se qualcuno ne sapeva più di me. Ringrazio tutti per le risposte e le prossime volte cercherò di essere più pertinente.