2013-10-18 17 views
10

Sto provando a leggere i valori del potenziometro da un arduino usando python. Ma i miei valori di lettura seriale sono strani.Python non legge valori corretti dall'uscita seriale arduino

codice Python:

import serial 

ser = serial.Serial('COM12') 

print ("connected to: " + ser.portstr) 
count = 1      

while True: 
    for line in ser.read(): 
     print(str(count) + str(': ') + str(line)) 
     count = count + 1 


ser.close() 

Codice Arduino:

int potpin = 0; // analog pin used to connect the potentiometer 
int val = 0;  // variable to store the value coming from the sensor 
int oldVal = 0; // used for updating the serial print 

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

void loop() 
{ 
    val = analogRead(potpin);    
    val = map(val, 0, 1023, 0, 179);  

    if(val != oldVal) 
    { 
    Serial.print(val);   // print the value from the potentiometer 
    oldVal = val; 
    } 

    delay(100); 
} 

qualche uscita Python: Questa uscita è venuto da una scala, lento aumento sul potenziometro, non ho mai girato verso il basso in qualsiasi punto .

1: 56 
2: 57 
3: 49 
4: 48 
5: 49 
6: 49 
7: 49 
8: 50 
9: 49 
10: 51 

Quando si esegue il terminale seriale arduino ottengo valori che vanno da 0-179. Perché Python non sta ottenendo i valori corretti dalla porta seriale?

Grazie

EDIT:

risolto il problema. 48-55 sono i valori ascii per 1-9, quindi è questione di cambiare il codice Python per stampare il carattere e non il valore. Tuttavia questo causa un altro problema in quanto stampa singole cifre. ad esempio, il numero "10" viene fornito come singolo "1" e "0". Questo è semplicemente risolto usando Serial.write invece di Serial.print nello sketch arduino. Ciò significa anche che riceverai un byte che è il tuo numero e non il valore ascii del numero, quindi non devi convertire la riga di lettura da un valore in ascii.

Spero che questo aiuti.

+1

+1 per pubblicare il codice sorgente e per pubblicare la soluzione trovata. – jwygralak67

+20

Invece di modificare la domanda con la risposta, è possibile inviare la soluzione come risposta e quindi accettare la propria risposta. Questo rende chiaro alle persone che trovano la domanda che esiste una soluzione. – Craig

risposta

2

Lasciatemi provare ad offrire alcuni commenti che potrebbero essere utili ad altre persone con problemi simili (anche se questo problema è stato risolto). Innanzitutto, prova a eseguire il tuo disegno Arduino con il monitor seriale alcune volte. Puoi trovare il monitor seriale sotto Strumenti nel menu IDE. Puoi anche digitare Ctrl-Shift-M per richiamare il monitor seriale.

Guarda cosa si presenta. È spesso utile se lo schizzo tenta di inviare dati tramite Serial.print(). Alcune note Accertarsi assolutamente che la velocità di trasmissione impostata all'interno del monitor seriale corrisponda esattamente alla velocità di trasmissione nello schizzo (9600 è una buona scelta in quasi tutti i casi).

La seconda nota è fondamentale. Avvicinando il monitor seriale si forza un reset sulla scheda Arduino. Lo schizzo ricomincia (sempre). Questa è una buona cosa perché ti dà una nuova corsa ogni volta. Si noti che è possibile forzare un reset, semplicemente impostando la velocità di trasmissione su 9600 (anche se è già 9600). Ciò consente di eseguire numerosi test all'interno del monitor seriale senza dover riavviare il monitor seriale ogni volta.

Per quanto riguarda il problema originale, è necessario disporre di una sorta di delimitatore di dati. Ad esempio, è possibile inviare valori come < 53>. In Python dovresti cercare "<" e quindi continuare a leggere le cifre finché non ottieni il ">". Ciò consentirà l'invio di più cifre come un valore numerico.