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

2024-09-28 22:32:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我面临的主要问题是如何集成Python代码,该代码将使用已建立的COM端口与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。在


Tags: 代码selfeventvalueondefcomponentsgui
3条回答

首先,让我说,前面的答案是好的,有帮助的,直接相关的。我的双向数据流和应用程序都是我的通用数据流。基本思想是设计你的数据流,这样数据流就可以被人工输入到Arudino草图中,而对于来自Arduino草图的数据,它是人类可读的。这并不总是可能的,但经常是这样。在

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

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

看看出现了什么。假设草图试图通过连续打印(). 几点注意事项。确保串行监视器内设置的波特率与草图中的波特率完全匹配(几乎所有情况下9600都是一个不错的选择)。在

第二点至关重要。启动串行监视器强制Arduino板复位。你的素描从头开始(总是)。这是一件好事,因为它让你每次都有新的跑步体验。请注意,您可以强制重置,只需将波特率设置为9600(即使已经是9600)。这使您可以在串行监视器内运行许多测试,而无需每次重新启动串行监视器

基本上,您只需向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)),或者解包结构如果它是一个字节序列,需要先将其解压为正常的内容,但这完全取决于您如何表示传感器数据)。在

或许可以看看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.

相关问题 更多 >