2017-12-21 23 views
0

Arduinoの超音波距離計から私のラップトップにデータをストリーミングしようとしています。私はArduinoから新しい価値を得ることに問題があるようです。私がPythonスクリプトを起動すると、私が望んだようにデータを印刷し始めます。しかし、センサーが見る距離を変えるとこのデータは変化しません。serial.readline()が最初の値の1つに固執しているようです。私はこのシリアル通信のものに新しいですので、どんな助けも大歓迎です!ArduinoからPyserialが新しい価値を得ない

コードは以下のとおりです。センサーがArduino IDEのシリアルモニターで動作していることを確認しました。

import numpy 
import serial 
import time 
import sys 
import cv2 
import pickle 

#set up the camera stuff 
cap = cv2.VideoCapture(0) 

#container for images 
images=[] 

#container for distances 
distances=[] 

#first frame number 
frame_num=1 

#setup the serial connection and pause to establish it 
ser = serial.Serial('/dev/cu.usbmodem1421', 9600,timeout=1) 

time.sleep(5) 

while True: 
    try: 
     #grab and image 
     ret,frame=cap.read() 

     #grab the distance 
     distance=ser.readline() 
     print(distance) 

     #process the image to a gray and 1241,376 
     #gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
     #gray_resized=cv2.resize(gray,(1241,376)) 

     #cv2.imshow("FRAME",gray_resized) 
     #print(distance) 

     #images.append([frame_num,gray_resized]) 
     #distances.append([frame_num,distance]) 

     #ser.flush() 

    except KeyboardInterrupt: 
     #pickle.dump(images, open("save.p", "wb")) 
     #pickle.dump(distances, open("save.p", "wb")) 
     sys.exit() 

Arduinoのコード:あなたはArduinoのは、あなたのpythonことを速くバッファに書き込んでいるわけロックの問題を持っていないので、もしそれが、EOLを得るまで

// defines pins numbers 
const int trigPin = 7; 
const int echoPin = 8; 

// defines variables 
long duration; 
int distance; 

void setup() { 
    pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output 
    pinMode(echoPin, INPUT); // Sets the echoPin as an Input 
    Serial.begin(9600); // Starts the serial communication 
    delayMicroseconds(50); 
} 

void loop() { 
    // Clears the trigPin 
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2); 

    // Sets the trigPin on HIGH state for 10 micro seconds 
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trigPin, LOW); 

    // Reads the echoPin, returns the sound wave travel time in microseconds 
    duration = pulseIn(echoPin, HIGH); 

    // Calculating the distance in CM 
    distance= duration*0.034/2; 
    String distance_out=String(distance); 

    // Prints the distance on the Serial Monitor in CM 
    Serial.println(distance); 
    Serial.flush(); 

    //Serial.print("Distance: "); 
    //Serial.println(distance); 
} 
+0

は、たぶん、あなたが利用可能であるよりも多くを読み取ろうserial.flushInput()またはserial.reset_input_buffer()は、ご使用のバージョンに依存して(近くに)リアルタイムの読み取りを確実にするために読んだ後、バッファをフラッシュする必要があり、その後、典型的な結果は、あなたがに入れているということです所望の量のデータが利用可能になるまでスリープする。 'stream.read()'や 'stream.readline()'の代わりに 'os.read()'を使ってみましょう。 – Alfe

+0

私はこれまでにos.read()を使ったことが一度もありませんでしたが、引数は何ですか? – Jake3991

+0

'help(os.read)'は 'read(fd、buffersize)'と言っています。 'fd'はintになります。例えば ​​'cap.fileno()'から取り出すことができます。 'buffersize'はバイト単位で読むために '1'にすることができます。効率的ではありませんが、何がうまくいかないかを見つけるためのアプローチかもしれません。 – Alfe

答えて

1

実際には、Pythonのserial.readline()がブロックされてスクリプトでそれを読んでください。

あなたは

関連する問題