7

私は、Pythonを使用してリモート制御され、単純なGUIを介してインターネット経由で制御メッセージを送信するロボットを構築中です。

私は自分のコードの一部、GUIと制御システムをかなりうまく機能させましたが、行き詰まっています。視差pingセンサーを使用してArduinoMegaからオブジェクト情報までの距離を取得し、その値をPython制御スクリプトに送信してリモートGUIに表示しようとしています。

私が抱えている主な問題は、すでに確立されているCOMポートを使用するPythonコードをArduinoと統合し、メッセージを送信してArduinoにpingセンサーをポーリングし、値を受け取るPythonプログラムに送信する方法です。次に、その値をGUIに挿入します。

私はすでにArduinoを制御するためのこのコードを持っており、それは私のシンプルなGUIで機能します。

import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)

from PythonCard import model

class MainWindow(model.Background):
    def on_SpdBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
    def on_FBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('F')
       ser.write(chr(spd))
    def on_BBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('B')
       ser.write(chr(spd))
    def on_LBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('L')
       ser.write(chr(spd))
    def on_RBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('R')
       ser.write(chr(spd))
    def on_SBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('S')
       ser.write('0')
    def on_PngDisBtn_mouseClick(self, event):
       ser.write('~')
       ser.write('P1')
       ser.write('p2')

app = model.Application(MainWindow)
app.MainLoop()

私が本当にやりたいのは、上記のコードを改善し、クリックするボタンを追加して、Pythonにメッセージを送信してpingセンサーをチェックして値を返すように指示することです。私はArduinoコードに非常に精通していますが、この2週間でPythonを使い始めたばかりです。

4

3 に答える 3

1

基本的には、すでに行っているのと同じように、適切なコマンドを Arduino に送信するだけで済みますが、Arduino が何かを送り返すのを待ちます。それのpythonの終わりはこのように見えるかもしれません

ser.write('foo')
retval = ser.readline() # read a complete line (\r\n or \n terminated), 
    #or you could use read(n) where n is the number of bytes you want (default=1)
ping_data = retval.strip() # strip out the newline, if you read an entire line

もちろん、それは文字列を取得します。後で計算で使用するために、おそらく int または float に変換する必要があります (文字列には int(ping_data) または float(ping_data) を使用するか、struct.unpack を使用します)。最初に正常なものにアンパックする必要があるバイト シーケンスの場合は、センサー データをどのように表現するかによって異なります)。

于 2011-05-25T09:09:02.270 に答える