firmatajs,多个Arduinos给予超时(johnny-five,cylonjs)

时间:2014-12-11 09:27:29

标签: node.js arduino arduino-uno johnny-five

我有两个Arduino unos使用标准StandardFirmata闪存,我正在尝试使用简单的节点项目(johnny-five npm包)进行多板演示。当我单独尝试时,两个arduinos都有效。使用以下代码:

var five = require("johnny-five");

var boardOne = new five.Board({ id: "A", port: "/dev/cu.usbmodem1d1141" });
boardOne.on("ready", function(){
    var led = new five.Led({
    pin: 13,
    board: this
    });
    led.on();
});

node index.js 
1418288836782 Connected /dev/cu.usbmodem1d1141 
1418288836784 Repl Initialized 
>> 

尝试多板示例时,我得到: 设备或固件错误连接到主板时发生超时。 请检查您是否使用正确的固件正确刷新了电路板。

var five = require("johnny-five");

var ports = [
    { id: "A", port: "/dev/cu.usbmodem1d1141" },
    { id: "B", port: "/dev/cu.usbmodem1d1131" }
];

new five.Boards(ports).on("ready", function(){
    var led = new five.Led({
        pin: 13,
        board: this[0]
    });
    led.on();
});


更新#1:

出于好奇,我试图切换USB电缆并得到一些不同的结果:

1)只有一个arduino似乎连接:

1418318698635 Device(s) /dev/cu.usbmodem1a1231,/dev/cu.usbmodem1a1241 
1418318698642 Device(s) /dev/cu.usbmodem1a1241 
1418318701849 Connected /dev/cu.usbmodem1a1231 
1418318701850 Board ID:  A 

或2)我收到错误:

.../johnny-five-master/node_modules/firmata/lib/firmata.js:246
board.pins[pin].analogChannel = currentValue;
                              ^
TypeError: Cannot set property 'analogChannel' of undefined
at Object.SYSEX_RESPONSE.(anonymous function) [as 106] 
(.../johnny-five-master/node_modules/firmata/lib/firmata.js:246:35)


更新#2:

我用cylon.js进行了上述测试并获得了相同的结果。仍然没有线索如何解决这个问题:( 一个arduino工作正常,多个什么都不做。 (也许与osx相关的问题?)

更新#3:

我在johnny-five代码中添加了一些日志,这肯定是一个连接问题(我想!?)。第二个Arduino永远不会回应。我切换了arduinos的顺序并获得了相同的结果(第一个连接,另一个无法响应)。连接是异步的,所以它可能会在某处被阻塞。两个arduinos的灯光肯定显示正在进行一些行动。

node index.js
err: undefined --- type: connect --- io: /dev/tty.usbmodem1d1111
err: undefined --- type: connect --- io: /dev/tty.usbmodem1d1121
err: undefined --- type: ready --- io: /dev/tty.usbmodem1d1111
1418467187527 Connected /dev/tty.usbmodem1d1111 
1418467187527 Board ID:  A 
1418467284327 Device or Firmware Error A timeout occurred while connecting to the Board. 
Please check that you've properly flashed the board with the correct firmware.

1 个答案:

答案 0 :(得分:4)

感谢@izar发布此内容,然后在Johnny-Five gitter频道将问题提交给我们。从那里开始,Divan Visagie(来自Johnny-Five核心团队)致力于对这个bug进行分类,并能够通过再现进行确认。这揭示了Firmata.js中的一个错误,传递给Serialport的选项正在被该类扩展。由于默认对象被重用,Object.assign不是"深"操作,更改是参考,而不是副本。结果是第二次初始化得到一组"默认值"那些加载了第一个实例自己的数据。通过将Firmata更改为每个实例使用新的默认值来解决此问题。 Here's the patch