我注意到IRobot Create 2处于休眠状态时不会响应该应用程序的命令。如果我按下“清理”按钮并重新运行应用程序,则机器人会响应命令。

我的初始化序列(Android / Java)使用usb-serial-for-android:

port.open(connection);
port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1,UsbSerialPort.PARITY_NONE);
command(Opcode.START);
command(Opcode.SAFE);


物理结构是IRobot Create 2,通过IRobot串行电缆连接到Google Project Tango Tablet。

我的应用程序如何将Roomba从睡眠中唤醒?

评论

为清楚起见,已从问题中删除...根据OI [规格文档] [2],似乎将模式更改为“关闭”会唤醒机器人:> Roomba具有四种操作模式:“关闭”,“被动”,“安全”和“完全”。 Roomba在关闭模式下开机。以下命令可更改Roomba的OI模式。我认为这是文档中的错误,他们的意思是说Roomba关机了?如果文档正确,那么也许我应该将初始化顺序更改为不直观:command(Opcode.STOP);命令(Opcode.START);命令(Opcode.SAFE);

#1 楼

我一直在使用Create电缆和Python测试Steve的答案,但遇到了一些困难。

在打开串行端口时启用硬件流控制会导致从Create 2发送/接收数据时没有任何反应。指南的第4页显示“流量控制:无”。虽然我从未使用过硬件流控制,但我怀疑Create 2无法正确处理握手,因此数据无法正常流动。

在打开连接时启用硬件流控制不起作用,我尝试使用setRTS方法。 (对此方法和setDTR的研究表明它们都在PySerial中实现。)

我尝试了以下操作,看它是否会唤醒Create 2

serial_port.setRTS(True)
time.sleep(1)
serial_port.setRTS(False)
time.sleep(1)
serial_port.setRTS(True)


其中sleep参数1以秒为单位。我还通过以下更改尝试了上述方法
切换为False,True,然后为False
将睡眠时间设置为.5

此外,我使用setDTR( )。以上所有方法都无法唤醒Create2。

接下来,我尝试了一些简单的操作–尝试使Create 2避免入睡。根据第6页的

“要禁用睡眠,请在这五分钟之前将BRC引脚周期性地拉低。每个脉冲都会重置此五分钟计数器。 (一个不会导致波特率意外改变的示例是每分钟将引脚拉低一秒,但也有其他周期和占空比也会起作用。)”

使用“创建2”处于被动模式时,我尝试了以下操作

while True:
    time.sleep(60)
    serial_port.setRTS(True)
    time.sleep(1)
    serial_port.setRTS(False)
    time.sleep(1)
    serial_port.setRTS(True)


这没有效果。然后,当尝试唤醒Create 2时,我尝试了上述所有排列,但是这些排列都没有任何效果。我确实找到了一份pdf指南,其中详细说明了如何制作自己的Create电缆,该电缆指示BRC线路应连接到计算机侧的RTS,但似乎不起作用。

评论


$ \ begingroup $
我一直在使用按照此处的说明(irobotweb.com/~/media/MainSite/PDFs/About/STEM/Create/…)制作的电缆。使用该电缆,按照我所述的方法使用RTS唤醒机器人。看到您的回复后,我尝试使用官方的Create电缆,发现它不能正常工作。感到困惑,我小心地打开了电缆,并认为在PCBA上交换了橙色和绿色的导线,因此似乎至少其中一些电缆存在组装错误。建议您发送电子邮件至create@irobot.com,看看它们是否可以为您提供进一步的帮助。
$ \ endgroup $
–史蒂夫
2015年9月1日15:30在

$ \ begingroup $
另外,我在上一个答案中添加了文字以反映这一发现。
$ \ endgroup $
–史蒂夫
2015年9月1日15:36

#2 楼

Roomba在闲置五分钟后进入睡眠状态,以节省电量,如OI规范(2015年8月10日)第6页的“被动模式”中所述。引用地方的文档没有错,因为Roomba会在OI关闭的情况下打开电源(而不是处于被动,安全或完整状态)。如果您想让机器人永不入睡,请将其置为FULL。如果您想让机器人唤醒,则只需在通信之前对BRC引脚进行脉冲操作即可,如上文所述。如果您使用USB来创建电缆,一种简单的方法是使用硬件流控制来打开串行端口,因为Roomba的BRC连接到计算机侧的RTS,因此当准备发送字符时, BRC将被脉冲化。似乎至少有一些官方的Create to USB电缆不能正确实现此功能,但是按照站点上的说明进行电缆连接确实可行。第二个版本的Create电缆(带有0.1英寸接头)和包覆模制中的USB A连接器已更正了此错误。请注意,我是iRobot员工,但本网站上的帖子属于我自己,请勿发布不一定代表iRobot的立场,策略或观点。

评论


$ \ begingroup $
史蒂夫,谢谢。尝试使用您所描述的BRC脉冲唤醒机器人,我添加了port.setRTS(true);。在打开连接之前和之后,但没有尝试唤醒机器人。经过进一步检查,setRTS方法为空白。 goo.gl/w1b8yk您可以提供有关如何使用该库“使用硬件流控制打开串行端口”的任何清晰度的信息。
$ \ endgroup $
–亚伦·罗勒(Aaron Roller)
15年8月19日在15:24

$ \ begingroup $
几个想法。首先,我用Java编写的代码不多,而且这也不是我的库,因此要做的第一件事是针对库提出问题,以供维护人员填写setRTS方法。希望他们将其添加进来,然后您会变得很黄金。看起来好像有一个setDTR()方法;也许也应该尝试一下(尽管DTR输出没有连接到电缆上,但他知道Java库在做什么)。其次,需要对线路进行脉冲处理,但是看起来该方法只是将引脚设置为高电平,因此我建议尝试先设置true,然后设置false,然后再设置true。
$ \ endgroup $
–史蒂夫
15年8月19日在15:48



$ \ begingroup $
似乎已经有与您的麻烦有关的图书馆问题–它们是数字13(github.com/mik3y/usb-serial-for-android/issues/13),41(github.com/ mik3y / usb-serial-for-android / issues / 41)和58(github.com/mik3y/usb-serial-for-android/issues/58)。我只是在其中之一中记录您对维护者的需求。
$ \ endgroup $
–史蒂夫
15年8月19日在15:54



$ \ begingroup $
setDTR方法也是空白。我会按照您的建议进行操作,并与图书馆维护者联系以进行讨论。在让我上电之前,我一直没有解决问题。再次感谢。
$ \ endgroup $
–亚伦·罗勒(Aaron Roller)
15年8月19日在17:03



$ \ begingroup $
没问题;对不起,我帮不上忙。我同意您应该保持打开状态,直到它按预期的方式工作!
$ \ endgroup $
–史蒂夫
15年8月19日在17:05

#3 楼

史蒂夫是对的:在官方的Create电缆中交换了橙色和绿色的电线。如果交换两条线,则BRC变为零时,机器人将立即唤醒。