【问题标题】:How to send a value from Arduino to Python and then use that value如何将值从 Arduino 发送到 Python,然后使用该值
【发布时间】:2013-11-06 23:23:19
【问题描述】:

我正在构建一个使用 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。

【问题讨论】:

    标签: python arduino pyserial pythoncard


    【解决方案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 以防万一它是一个字节序列,需要先将其解包为正常的东西,但这完全取决于您如何表示传感器数据。

    【讨论】:

      【解决方案2】:

      也许看看the Pyduino project:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2021-11-26
          • 2017-12-04
          • 2018-01-15
          • 2019-10-20
          • 1970-01-01
          • 2015-07-26
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          相关资源
          最近更新 更多