2013-10-18 10 views
10

私はPythonを使ってarduinoからポテンショメータの値を読み取ろうとしています。しかし、私のシリアル読み取り値は奇妙です。Pythonはarduinoシリアル出力から正しい値を読んでいません

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

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

いくつかのPythonの出力:この出力はポテンショメータにまっすぐ、ゆっくりと増加から来た は、私は、任意の時点でそれを断ったことはありません。

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

arduinoシリアル端末を実行すると、0〜179の範囲の値が得られます。 Pythonがシリアルポートから正しい値を取得しないのはなぜですか?

おかげ

EDIT:

は、問題を解決しました。 48〜55は1〜9のascii値なので、値ではなく文字を出力するためにPythonコードを変更する必要があります。しかし、これは個々の数字を印刷するという別の問題を引き起こします。例えば、数字「10」は単一の「1」および「0」として来る。これは、arduinoスケッチでSerial.printの代わりにSerial.writeを使うだけで簡単に解決できます。これはまた、numberからascii値ではなく、あなたの数値であるバイトを受け取ることを意味するので、read in lineを値からasciiに変換する必要はありません。

これが役に立ちます。

+1

+1あなたのソースコードを投稿し、見つけた解決策を投稿してください。 – jwygralak67

+20

答えを使って質問を編集するのではなく、解答として回答を投稿してから自分の答えを受け入れることができます。これは解決策があることを人々が知ることを明らかにする。 – Craig

答えて

2

この問題が解決されているにもかかわらず、同様の問題を抱えている他の人に役立ついくつかのコメントを提供しようとします。まず、Arduinoスケッチをシリアルモニタで数回実行してみてください。シリアルモニタはIDEメニューのツールの下にあります。 Ctrl + Shift + Mキーを押してシリアルモニタを起動することもできます。

表示される内容を確認してください。あなたのスケッチがSerial.print()を介してデータを返そうとすると、非常に役に立ちます。いくつかのノート。シリアルモニタに設定されているボーレートがスケッチのボーレートと正確に一致することを絶対に確認してください(9600はほとんどすべての場合に適しています)。

2番目の注釈は重要です。シリアルモニタを起動すると、Arduinoボードのリセットが強制されます。あなたのスケッチは(常に)始まります。これは毎回新鮮な実行を与えるので、良いことです。ボーレートを9600に設定するだけで、強制的にリセットすることができます(すでに9600であっても)。これにより、毎回シリアルモニタを再起動しなくても、シリアルモニタ内で多くのテストを実行できます。

元の問題については、おそらく何らかの種類のデータ区切り記号があるはずです。たとえば、< 53>のような値を送信できます。 Pythonでは、 '<'をスキャンし、 '>'が得られるまで数字の読み取りを続けます。これにより、複数の数字を1つの数値として送信することができます。

関連する問題