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);
}
は、たぶん、あなたが利用可能であるよりも多くを読み取ろう
serial.flushInput()
またはserial.reset_input_buffer()
は、ご使用のバージョンに依存して(近くに)リアルタイムの読み取りを確実にするために読んだ後、バッファをフラッシュする必要があり、その後、典型的な結果は、あなたがに入れているということです所望の量のデータが利用可能になるまでスリープする。 'stream.read()'や 'stream.readline()'の代わりに 'os.read()'を使ってみましょう。 – Alfe私はこれまでにos.read()を使ったことが一度もありませんでしたが、引数は何ですか? – Jake3991
'help(os.read)'は 'read(fd、buffersize)'と言っています。 'fd'はintになります。例えば 'cap.fileno()'から取り出すことができます。 'buffersize'はバイト単位で読むために '1'にすることができます。効率的ではありませんが、何がうまくいかないかを見つけるためのアプローチかもしれません。 – Alfe