如何将值从Arduino发送到Python然后使用该值

时间:2011-05-25 02:27:10

标签: python arduino pyserial pythoncard

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

我的部分代码工作得很好,GUI和控制系统,但我被卡住了。我正在尝试使用视差ping传感器来获取Arduino Mega中对象信息的距离,并将该值发送到我的Python控制脚本以显示在远程GUI上。

我遇到的主要问题是如何集成将使用已建立的COM端口与Arduino的Python代码并发送消息告诉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。

3 个答案:

答案 0 :(得分: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,以防它的字节序列首先需要解包到一些理想的东西,但这一切都取决于你如何表示传感器数据。)

答案 1 :(得分:1)

也许请查看the Pyduino project

  

pyduino是一个库,它允许您在Py​​thon中与加载了Firmata协议的Arduino板进行通信。它目前支持Firmata协议的第2版。

答案 2 :(得分:0)

首先,我要说先前的答案是好的,有用的,并且直接相关。我的评论更为通用,适用于任何人实现与Arduino之间的双向数据流。基本思想是设计您的数据流,以便人类可以输入Arudino草图的数据,并且人类可以读取来自Arduino草图的数据。这并不总是可行的,但经常是这样。

关键的想法是使用串行监视器运行几次Arduino草图。您可以在IDE菜单中的Tools下找到Serial Monitor。您也可以输入Ctrl-Shift-M来调用串行监视器。

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

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

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