7

我正在构建一个使用 Python 远程控制的机器人,以通过一个简单的 GUI 通过 Internet 发送控制消息。

我的部分代码运行良好,GUI 和控制系统,但我被卡住了。我正在尝试使用视差 ping 传感器从Arduino Mega获取到对象的距离信息,并将该值发送到我的 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 向 Arduino 发送消息以检查 ping 传感器并返回值。我非常熟悉 Arduino 代码,但我在过去两周才开始使用 Python。

4

3 回答 3

1

Maybe check out the Pyduino project:

pyduino is a library which allows you to communicate with Arduino boards loaded with the Firmata protocol from within Python. It currently supports version 2 of the Firmata protocol.

于 2011-05-25T21:33:03.060 回答
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 回答
0

首先,让我说之前的答案是好的、有帮助的和直接相关的。我的评论更笼统,适用于任何实现与 Arduino 之间的双向数据流的人。基本思想是设计您的数据流,使其对于进入 Arudino 草图的数据是人类可键入的,对于来自 Arduino 草图的数据是人类可读的。这并不总是可能的,但经常是这样。

关键思想是使用串行监视器运行您的 Arduino 草图几次。您可以在 IDE 菜单的工具下找到串行监视器。您还可以键入 Ctrl-Shift-M 来调用串行监视器。

串行监视器显示 Arduino 草图发回给您的内容。但是,它还允许您输入发送到 Arduino 草图的数据。换句话说,您只需使用串行监视器即可测试和调试串行数据流的两端。

看看出现了什么。假设您的草图尝试通过 Serial.print() 发回数据,这通常会很有帮助。一些笔记。确保串行监视器中设置的波特率与草图中的波特率完全匹配(9600 在几乎所有情况下都是不错的选择)。

第二个注释很关键。启动串行监视器会强制在 Arduino 板上进行重置。您的草图(总是)重新开始。这是一件好事,因为它每次都能让您焕然一新。请注意,您可以强制重置,只需将波特率设置为 9600(即使它已经是 9600)。这使您可以在串行监视器中运行许多测试,而无需每次都重新启动串行监视器

于 2013-11-06T15:23:19.043 回答