Johnny-Five多个Arduinos连接,但没有发出"准备好"

时间:2015-07-18 21:39:50

标签: arduino emit johnny-five

我和johnny-five(多个委员会)有点困难;任何人都可以为我解释这个问题吗?

我连接了2个Arduinos,我可以使用" var board = new five.Board()"单独访问它们。

我可以成功连接并将它们与Cylon.js一起使用。

然而,当我尝试使用"新的五.Boards()"它似乎永远不会发出准备好的"事件,所以我可以开始编码我的逻辑。

使用(略微修改)johnny-five / eg / boards-multi.js

var five = require("../lib/johnny-five.js");
var boards = new five.Boards(["A", "B"]);

// Create 2 board instances with IDs "A" & "B"
boards.on("ready", function() {

  // Both "A" and "B" are initialized
  // (connected and available for communication)

  // |this| is an array-like object containing references
  // to each initialized board.
  this.each(function(board) {

    console.log("READY"); // NOTE: this never executes

    // Initialize an Led instance on pin 13 of
    // each initialized board and strobe it.
    var led = new five.Led({
      pin: 13,
      board: board
    });

    led.blink();
  });
});

我的控制台显示:

1437253899028 Device(s) /dev/ttyACM1,/dev/ttyACM0
1437253899104 Connected /dev/ttyACM1
1437253899121 Device(s) /dev/ttyACM0
1437253899126 Connected /dev/ttyACM0
1437253901860 Board ID:  A
1437253901862 Board ID:  B

......我永远等待,它永远不会发出准备好" ...

注1:我重新上传了最新的" StandardFirmata"两次都在他们身上;他们自己工作得很好。

注意2:我在3个不同的系统上尝试了完全相同的设置(一个是ubuntu linux,一个是Windows,另一个是Raspberry PI 2B)同样的问题...

我不确定我是否遗漏了这里愚蠢的东西;然而无论我尝试约翰尼五,我都不会允许我继续。正如我上面提到的,它似乎与Cylon完美配合 - 但是,我更倾向于使用j5,因为我已经有相当多的代码已经到位而我没有移植到Cylon只是为了将多个Arduino连接到我的系统。

非常感谢任何帮助!

更新#1:

我正在接近,我现在可以解决每个Arduino板。然而;我仍然难以理解如何正确地抓住"准备好"事件

var five = require('johnny-five');
var ports = [
  { id: "A", port: "/dev/ttyACM0" },
  { id: "B", port: "/dev/ttyACM1" }
];

var boards = new five.Boards(ports).on('ready', function() {
  // does nothing?
  console.log("THIS SHOULD TRIGGER");
});

// Waiting 5 seconds for the boards to init, instead of "ready" event.
setTimeout( function() {
  console.log(boards[0].isReady);
  console.log(boards[1].isReady);
}, 5000);

这最终得到了控制台输出:

1437268012413 Connected /dev/ttyACM0
1437268012427 Connected /dev/ttyACM1
1437268015161 Board ID:  A
1437268015163 Board ID:  B
true
true

....此时,我可以执行以下操作来处理电路板(当然在setTimeout()内):

  var led1 = new five.Led( {
    pin: 6,
    board: boards[0]
  });
  led1.on();
  var led2 = new five.Led( {
    pin: 4,
    board: boards[1]
  });
  led2.on();

仍然试图确定为什么我无法抓住难以捉摸的"准备好"。

更新#2:

看起来我想通了。它实际上已经准备就绪,但是我没有正确地使用API​​。

工作代码:

new five.Boards(ports).on('ready', function( boards ) {
  console.log( boards );  // ready emits
});

更新#3:

我想我在库中发现了一个错误。

似乎是以下文件:

node_modules / johnny-five / lib / board.js

行: 1109

如果你改变:

if (this.repl) 
to
if (false && this.repl)

似乎已经准备好"准备好"事件

1 个答案:

答案 0 :(得分:0)

我在repl初始化中发现了一个错误,这将在下一个版本中修复。问题是在state.board.info(...)中调用Repl.prototype.initialize,其中info方法由于在最近重构电路板日志记录和日志记录功能定义期间的疏忽而未定义。此错误出现在v0.8.85中,因此请尝试npm install johnny-five@0.8.84解决问题直到下一个版本。