私はArduinoとPythonに非常に慣れていません。Pyserial を使用して、Arduino Uno とラップトップの間の通信に取り組んでいます。私のラップトップの Python スクリプトは、Novint Falcon にリンクされている H3D Viewer によって呼び出されます。
私のラップトップは Falcon の位置データを Arduino に送信し、ロボットに送信します。今は、Arduino から送信したデータを読み返して、すべてが機能することを確認しているだけです。しかし、そうではありません!
これは私の Python スクリプトの一部です (.x3d ファイルによって呼び出されます)。
dp_text, = references.getValue()
class display (threading.Thread):
def __init__(self, delay):
threading.Thread.__init__(self)
self.delay = delay
def run(self):
while 1:
receivedFalconData=[]
tex=[]
tex.append("DevicePosX = " + str(localFalconData))
receivedFalconData=ser.readline()
ser.flush()
ser.flushInput()
tex.append("Input = " + str(receivedFalconData))
dp_text.string.setValue(tex)
time.sleep(self.delay)
displaying = display(0.1)
displaying.start()
上記のスレッドは、H3D ビューアーのテキスト ノードを 100 ミリ秒ごとに更新する役割を果たします。Arduinoのコードは次のとおりです。
#include <SoftwareSerial.h>
char Axispos[6] ={0,0,0,0,0,0};
int xvalue= 0;
SoftwareSerial mySerial(7,6); //RX, TX
void setup() {
Serial.begin( 9600 );
Serial.flush();
mySerial.begin(9600);
}
void loop(){
while( Serial.available() > 0 )
{
Serial.readBytes(Axispos,6);
Serial.flush();
xvalue = (Axispos[0] << 8) + (Axispos[1] & 0xff);
Serial.println(xvalue);
Serial.flush();
mySerial.write(Axispos);
mySerial.flush();
delay(500);
}
}
Arduino によって読み取られた x 軸の値はラップトップに送り返され、receivedFalconData に格納されます。この値は、スクリプト自体の x 軸の値である localFalconData と同じであると想定されています。
結果: receivedFalconData は数秒間 localFalconData を模倣した後、ワイルドになります。
ただし、正しい値が再び表示されることがありますが、これはおそらく Pyserial の入力バッファ オーバーフローの問題であることがわかりますか? (私が正しければ) serial.readline() は入力バッファを読み取った後に空にするので、これはどうしてでしょうか? さらに、Arduino は 0.5 秒ごとにデータを送信するだけですが、ラップトップは 0.1 秒ごとに読み取ります。
しかし、readline() 部分がデータ送信用のクラスに配置されている場合 (Falcon が新しいデータを利用できるようになるたびに呼び出されます)、 receivedFalconData は完全に正しいです。
また、H3D で表示すると、receivedFalconData の後ろにこれらの ☐ 記号が 2 つ表示されます...
Pyserialの経験がある人は、私を助けてください。私の問題がまだ不明な場合は、喜んでさらに情報を提供します。