在通过Python将信号从Raspberry Pi发送到连续旋转的伺服器(PowerHD AR-3606HB机器人伺服)时,我难以维持Raspberry Pi(运行Raspbian的Model B)和Arduino(Uno)之间的连接。我不确定是否存在通过Python向Arduino发送伺服指令以旋转伺服的更有效方法。我正在尝试使用我认为是“数字串行连接”的方式通过USB将信号从Raspberry Pi传递到Arduino。我当前的连接:

Wireless Xbox 360 Controller -> Wireless Xbox 360 Controller Receiver -> Raspberry Pi -> Externally Powered USB Hub -> Arduino -> Servo



Servo connection to Arduino:
   Signal (Orange) - pin 9
   Power (Red) - +5 V
   Ground (Black) - GND


我在Raspberry Pi上安装了以下工具(尽管并非解决这个问题所需的全部工具):
Arduino

我上传到Arduino Uno的草图是Python-Arduino-Command-API提供的相应草图。 *再次,我并不认为这是将我的伺服器从Python驱动到Arduino(到伺服器)的最佳方法。通过USB连接:伺服器以顺时针方向测试一秒,逆时针方向测试一秒,然后使用以下Python脚本停止伺服器:

pi@raspberrypi ~/Python-Arduino-Command-API $ dir /dev/ttyA*
/dev/ttyACM0  /dev/ttyAMA0


通过Raspberry的输出Pi终端显示为:

pi@raspberrypi ~/Python-Arduino-Command-API $ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 045e:0719 Microsoft Corp. Xbox 360 Wireless Adapter
Bus 001 Device 005: ID 1a40:0201 Terminus Technology Inc. FE 2.1 7-port Hub
Bus 001 Device 006: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter
Bus 001 Device 007: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 008: ID 2341:0043 Arduino SA Uno R3 (CDC ACM)


尽管它仅在两个方向上都执行全速(以及标定的“停止”速度90),但我已经成功地从全速到慢速,例如,从0到90,以10为增量。

从Raspberry Pi,我可以从Xbox控制器发送输入来驱动伺服使用我与xboxdrv一起创建的小型自定义Python脚本(完美运行和我正在做的其他项目):

#!/usr/bin/env python
from Arduino import Arduino
import time

board = Arduino(9600, port='/dev/ttyACM0')

board.Servos.attach(9) # Declare servo on pin 9
board.Servos.write(9, 0) # Move servo to full speed, clockwise
time.sleep(1) # Sleep for 1 second
print board.Servos.read(9) # Speed check (should read "0")

board.Servos.write(9, 180)
time.sleep(1)
print board.Servos.read(9) # (Should read "180")

board.Servos.write(9, 90)
print board.Servos.read(9)
board.Servos.detach(9)


该脚本运行,我可以使用控制器上的RB按钮控制伺服器。但是,它最终会失败-有时在几分钟后,有时在几秒钟后(快速和间歇的输入似乎对加速崩溃没有影响)。脚本不再读取输入,终端停止,伺服器冻结给出的最后一个命令(不断旋转或停止),然后我被迫从脚本中按Ctrl +C。如果我检查Arduino是否仍连接到Raspberry Pi,则表明它已将自己重新连接到Raspberry Pi,显示为“ ttyACM1”(从/ dev / ttyACM0到/ dev / ttyACM1):

0
180
90


为什么Arduino重新连接自己?我还有其他方法可以处理此信息吗?与无线Xbox接收器的距离不是一个因素,因为所有这些部件为了测试目的彼此相邻。如果我一直在关注这个问题,那么将这种伺服系统用作我的机器人的轮子将是不可能的。

评论

我读到您正在使用Raspberry Pi和Arduino之间的USB连接。您正在使用USB到Arduino,再到Servo的电源吗?因此800mA可能是一个问题,USB最多应提供500mA。尝试使用一个外部电源给Arduino,由于电机至少1A,然后重试。无论如何,我认为您无需使用USB就可以进行直接UART链接。更具体地说,Arduino可能正在复位,并且因为它正在与USB串行转换器一起工作,所以没有信号的快速复位可能会更改Raspberry Pi的端口。

还是简单的测试,请尝试卸下“伺服”电机,然后查看是否发生这种情况。如果不是,请尝试添加一个较小的电流LED代替伺服器,然后查看是否正在传输信号。如果是这样,很可能是“伺服”电机从电源“链”中获取了很大的电流。

听起来好像在pi-> hub-> arduino之间的物理连接不好。故障的连接器或断线的位置几乎总是可以导通,但是在振动或摆动时会暂时失效。这可能会导致pi假设重新获得的Arduino是另一个Arduino,我会特别怀疑Tx / Rx对。
@DiegoCNascimento很棒的测试想法,当我断开“ servo”连接时,Arduino能够处理信息而不会崩溃(我知道这块硬件实际上是放弃了所有权利,将其标识为真正的伺服器)。查找零件上的文档,它的失速电流为800mA。伺服器试图通过USB汲取500mA以上的电流,并触发了Arduino的USB过流保护功能。 Arduino的合适电源解决了该问题。

@DiegoCNascimento如果您将此解决方案改写为实际答案,我很乐意将其标记为答案。

#1 楼

我怀疑您的Arduino正在复位,原因是产品表中电机的堵转电流为$ 800mA $,并且您使用的是USB电源,然后是Arduino调节器,为电机供电。 />当您使用USB /串行转换器建立与Raspberry Pi的连接时,重置时,可以在Raspberry Pi上创建一个新的“虚拟”串行端口,就像您说的那样。

在这种情况下,USB的最大电流供应接近$ 500mA $,但实际上,
比电机,Arduino等要多,所以它的数量要少得多。

要进行测试,只需断开电动机,然后查看是否不重置或创建新的“虚拟”串行端口即可。能够在所需电压下提供所需电流的电源。 Arduino的适当电源解决了该问题。


我仍然建议您使用其他电源为电动机供电,或者使用相同的电源,但不要使用Arduino的电源为电动机供电。这是因为即使使用外部电源,Arduino的电源稳压器的容量也只有1000mA $,这也会给ATMega电源带来一些噪声。当然,电源应在电机电压范围内。