2013-10-18 20 views
10

Próbuję odczytać wartości potencjometru z arduino za pomocą pythona. Ale moje wartości odczytu szeregowego są dziwne.Python nie odczytuje poprawnych wartości z wyjścia szeregowego arduino

kod 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() 

kod 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); 
} 

Niektóre Python wyjściowa: Wyjście pochodził z prostej, powolny wzrost na potencjometr, nigdy nie odwrócił ją w dowolnym punkcie .

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

Po uruchomieniu terminala szeregowego arduino otrzymuję wartości z zakresu od 0 do 179. Dlaczego Python nie otrzymuje prawidłowych wartości z portu szeregowego?

Dzięki

EDIT:

rozwiązało problem. 48-55 to wartości ascii dla 1-9, więc jest to kwestia zmiany kodu Pythona, aby wydrukować znak, a nie wartość. Powoduje to jednak inny problem polegający na tym, że drukuje poszczególne cyfry. na przykład liczba "10" pojawia się jako pojedynczy "1" i "0". Jest to po prostu rozwiązane przez użycie Serial.write zamiast Serial.print w szkicu arduino. Oznacza to również, że otrzymasz bajt, który jest twoim numerem, a nie wartość ascii numeru, więc nie musisz konwertować odczytu w linii z wartości na ascii.

Mam nadzieję, że to pomoże.

+1

+1 za opublikowanie kodu źródłowego i opublikowanie znalezionego rozwiązania. – jwygralak67

+20

Zamiast edytować pytanie za pomocą odpowiedzi, możesz opublikować rozwiązanie jako odpowiedź, a następnie zaakceptować własną odpowiedź. Ułatwia to ludziom znalezienie odpowiedzi na pytanie, czy istnieje rozwiązanie. – Craig

Odpowiedz

2

Pozwól mi spróbować przedstawić kilka komentarzy, które mogą być pomocne dla innych osób z podobnymi problemami (mimo że problem został rozwiązany). Najpierw spróbuj uruchomić szkic Arduino z Serial Monitor kilka razy. Możesz znaleźć Serial Monitor w menu Narzędzia w menu IDE. Możesz również wpisać Ctrl-Shift-M, aby wywołać monitor szeregowy.

Spójrz na to, co się pojawi. Często będzie to pomocne, jeśli twój szkic spróbuje wysłać dane z powrotem przez Serial.print(). Kilka notatek. Upewnij się, że szybkość transmisji ustawiona w monitorze szeregowym dokładnie odpowiada prędkości transmisji w twoim szkicu (9600 jest dobrym wyborem w prawie wszystkich przypadkach).

Druga notatka jest krytyczna. Przywołanie monitora szeregowego wymusza reset na tablicy Arduino. Twój szkic zaczyna się od nowa (zawsze). To dobra rzecz, ponieważ daje za każdym razem świeży bieg. Pamiętaj, że możesz wymusić reset, po prostu ustawiając prędkość transmisji na 9600 (nawet jeśli jest już 9600). Umożliwia to przeprowadzenie wielu testów w monitorze szeregowym bez konieczności ponownego uruchamiania monitora szeregowego.

Co do pierwotnego problemu, prawdopodobnie powinieneś posiadać ograniczniki danych. Na przykład możesz wysłać wartości takie jak: < 53>. W Pythonie należy wyszukać "<", a następnie kontynuować czytanie cyfr, aż pojawi się ">". Umożliwi to wysłanie wielu cyfr jako jednej wartości numerycznej.