2

我在 Arduino 上运行一些代码,我有一个带有滑块的网站,它使用 cgi 脚本将值传递给 Python。然后 python 脚本使用 pySerial 将值发送到控制电机的 Arduino。

该计划是能够使用网站上的滑块控制电机速度。

但是,每当我更改网站上的值时,我似乎都会遇到 Arduino 重置的问题,导致电机停止。有没有办法解决?我的python代码如下。

#!/usr/bin/env python
import cgi
form=cgi.FieldStorage()

import json

ser = serial.Serial('dev/ttyACM0', 9600) 
#I think there should be a sleep here for 1.5 seconds
ser.write("%s\n" % (form["value"]))
ser.close()

print "Content-type: application/json"
print
print(json.JSONEncoder().encode({"status":"ok"}))

所以,假设我让电机以 50% 的速度运行,然后在网站上更改一个值,它运行这个执行serial.Serial('dev/ttyACM0', 9600) 命令的脚本。这会打开重置 arduino 的端口,在传递新命令之前停止电机。

有什么方法可以 ser.write("%s\n" % (form["value"])) 在不新打开端口的情况下传递到 arduino?比如在python会话之间保持端口打开?

如果没有,有没有其他方法可以解决这个问题?

4

2 回答 2

2

我相信重置是由于您正在使用的特定 Arduino 设备的硬件设计。我建议改用 Arduino Micro 或 Leonardo 板。他们使用虚拟串口,每次打开串口时都不应该重新启动你的草图。这是来自 Arduino 网站:

打开串口时没有复位。

与 Arduino Uno 不同,当您在计算机上打开串行端口时,Leonardo 和 Micro 不会重新启动您的草图。这意味着您不会看到主板已经发送到计算机的串行数据,例如,包括在 setup() 函数中发送的大多数数据。

复位时串行重新枚举。

由于主板没有专用芯片来处理串行通信,这意味着串行端口是虚拟的——它是一个软件例程,在您的操作系统和主板本身上都是如此。就像您的计算机在插入任何 Arduino 时创建串行端口驱动程序实例一样,Leonardo/Micro 在运行其引导加载程序时创建一个串行实例。该板是 USB 连接设备类 (CDC) 驱动程序的一个实例。这意味着每次重置板时,USB 串行连接都会断开并重新建立。板子会从串口列表中消失,列表会重新枚举。任何与 Leonardo 具有开放串行连接的程序都将失去其连接。这与 Arduino Uno 形成鲜明对比,使用它您可以在不关闭 USB 连接(由辅助 ATmega8U2 或 ATmega16U2 处理器维护)的情况下重置主处理器(ATmega328P)。这种差异会对驱动程序的安装、上传和通信产生影响……

于 2013-08-25T19:32:46.213 回答
0

我你也许可以使用setDTR(False),但我已经测试过了。不久前,他们修复了最初与 setDTR 相关的错误。你在什么操作系统上使用这个?

ser = serial.Serial('dev/ttyACM0', 9600)
ser.timeout = 1
ser.setDTR(False)

如果这不起作用,请告诉我们。

于 2013-08-15T17:37:28.377 回答