salve ragazzi premetto che ho gia cercato tutorial e spiegazioni letto le documentazioni e fatto varie prove ma sono arrivato ad un punto in cui non so che pesci pigliare.
in pratica ho questo progetto dove sul pc ho un interfaccia grafica con python e 2 slider con cui inviare ad arduino (al momento arduino uno) il loro valore per cambiare il valore di 2 variabili(sensibilita e accelerazione).
adesso su python ho creato questa funzione:
che mi va a prendere il valore dello slider (l interfaccia e fatta con tkinter) e poi la invia ad arduino tramite la libreria interprete su python.
mentre su arduino ho questo frammento di codice:
if (Serial.available() > 0) {
sensitivity=Serial.read();
}
che ovviamente mi va a prendere la variabile sensibilita e ci ficca dentro il valore letto sulla seriale, e fin qui tutto funziona alla perfezione ma se voglio andare a leggere piu di un valore non ho idea di come posso fare.
spero vivamente che qualcuno riesca ad aiutarmi perche non ho propio idea di come fare.
Una soluzione potrebbe essere quella di crearti un piccolo protocollo di trasmissione e inviare ogni volta i 2 valori.
Tipo Snn;Ann; (dove nn è il valore dello slider).
Poi lato arduino ti sfanghi il parsing dei dati in arrivo.
Come detto da fratt serve necessariamente un qualche protocollo per far si che il ricevente possa interpretare nel modo corretto (senza mischiare o perdere dati) quello che viene trasmesso.
È evidente che bisogna riconoscere i due valori per assegnarli alle rispettive variabili, e questo implica una qualche forma di sincronizzazione, tramite tempi (pause intertrama) oppure tramite informazioni aggiuntive e/o manipolazione dei dati.
Il metodo della pausa può rendere tutto troppo lento, mentre per i byte aggiuntivi sorge il problema che non devono mai essere confondibili con i dati, e le possibilità sono tantissime, ma intanto bisogna decidere se si vuole lavorare direttamente con i byte binari (come nel caso che hai mostrato) oppure con stringhe di caratteri, che sempre byte sono, ma rappresentano non i valori ma i codici dei caratteri.
Ad esempio, volendo trasmettere stringhe ASCII, se abbiamo due valori m e n compresi tra 0 e 255, possiamo creare una stringa di valori espressi in esadecimale con preambolo di sincronizzazione * nel seguente modo:
s = "*{:02X}{:02X}".format(n, m)
Se n=16 e m=255 otteniamo: *10FF
e la possiamo trasmettere con:
.write(bytes(s, "ascii"))
E qui è il turno di Arduino, che deve restare in attesa di un asterisco (che indica inizio nuovi dati) e acquisire i quattro caratteri immediatamente successivi da cui ricalcolare i due valori.
ti ringrazio te e fratt per la risposta non sono abbastanza esperto di programmazione per capire come fare senza un esempio. il problema principale e che arduino gestisce 4 potenziometri e 1 encoder (al momento) e invia il loro stato a python che poi in base al loro valore esegue determinate azioni. quindi adesso non so come procedere dato che tutto deve essere molto veloce. io ho inviato il valore dello slider in quel modo perche altrimenti arduino non riceveva il numero cerretto e non riuscivo a trovare una soluzione. ma se esiste un qualsiasi altro modo a me va bene. tanto il valore dei 2 slidere devono essere compresi uno tra 0 e 50 e l altro tra 100 e 150, che rispettivamente sono il primo il valore di massimo per la rimappatura dei potenziometri, e il secondo la variabile di confronto del tempo per il tempo per far cambiare il valore piu velocemente o meno in modo che ho un accelerazione costante man mano che lo stick si inclina.
detto questo se riuscite a farmi un esempio di come creare il protocollo di trasmissione e la lettura da parte di arduino ve ne sarei grato perche non ho propio indea di come fare.
Vedi che a fornire tutte le informazioni si faceva molto prima... se i range dei valori sono quelli non serve alcun protocollo, perché sono già ben distinguibili. Li trasmetti in sequenza, e in ricezione se il valore ricevuto è tra 0 e 50 lo assegni a una variabile, altrimenti all'altra.
Per il resto un protocollo si fa su misura per quello che si vuole fare, ad esempio per ricevere la stringa di cui parlavo si potrebbe usare una logica come la seguente:
SE available:
leggi seriale
SE già trovato asterisco:
buffer[indice] = lettura
indice + 1
SE indice == 4:
elabora byte ricevuti
già trovato asterisco = false
ALTRIMENTI SE lettura == asterisco:
già trovato asterisco = true
indice = 0