0

我对 johnny-5 (Multiple Boards) 有点困难;任何人都可以为我解释一下吗?

我连接了 2 个 Arduino,我可以使用“var board = new Five.Board()”单独访问它们。

我可以通过 Cylon.js 成功连接和使用它们。

但是,当我尝试使用“new Five.Boards()”时,它似乎永远不会发出“就绪”事件,因此我可以开始编写我的逻辑。

使用(稍作修改)johnny-5/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)上尝试了完全相同的设置,所有系统都存在相同的问题......

我不确定我是否在这里遗漏了一些愚蠢的东西;但是,无论我尝试什么,johnny-5 都不允许我继续。正如我上面提到的,它似乎与 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-5/lib/board.js

线路:1109

如果你改变:

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

它似乎发出“就绪”事件。

4

1 回答 1

0

我在 repl 初始化中发现了一个错误,这将在下一个版本中修复。state.board.info(...)问题是对in的调用,由于最近重构董事会日志记录和日志记录函数定义期间的疏忽Repl.prototype.initialize,该方法未定义。info此错误出现在 v0.8.85 中,因此请尝试npm install johnny-five@0.8.84在下一个版本之前解决此问题。

于 2015-07-23T15:43:07.520 回答