Johnny-Five 多个 Arduinos 连接,但不发射 "ready"
Johnny-Five multiple Arduinos connecting, but not emitting "ready"
我在使用 johnny-5(多板)时遇到了一些困难;谁能帮我解释一下这个问题?
我连接了 2 个 Arduinos,我可以使用 "var board = new five.Board()".
完美地单独访问它们
我可以成功连接并使用它们 Cylon.js。
但是,当我尝试使用 "new five.Boards()" 时,它似乎从未发出 "ready" 事件,所以我可以开始编写我的逻辑。
使用(稍作修改)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
...我永远等待它永远不会发出 "ready"...
注1:我已经多次重新上传最新的"StandardFirmata";他们自己工作得很好。
注意 2:我在 3 个不同的系统上尝试了完全相同的设置(一个 ubuntu linux,一个 Windows,一个 Raspberry PI 2B)同样的问题...
我不确定我是否遗漏了一些愚蠢的东西;然而,无论我尝试什么,约翰尼五号都不允许我继续。正如我上面提到的,它似乎与 Cylon 完美配合——但是,我宁愿使用 j5,因为我已经有相当多的代码我宁愿不移植到 Cylon 只是为了连接多个Arduino 到我的系统。
如有任何帮助,我们将不胜感激!
更新#1:
我离 一点 更近了,我现在可以解决每个 Arduino 板的问题了。然而;我仍然对如何正确捕捉 "ready" 事件感到困惑。
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();
仍在尝试确定为什么我无法捕捉到难以捉摸的 "ready"。
更新#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)
它似乎发出了 "ready" 事件。
我在 repl 初始化中发现了一个错误,这将在下一个版本中修复。问题是在 Repl.prototype.initialize
中对 state.board.info(...)
的调用,其中 info
方法由于最近重构板日志记录和日志记录函数定义期间的疏忽而未定义。此错误出现在 v0.8.85 中,因此请尝试 npm install johnny-five@0.8.84
解决此问题,直到下一个版本。
我在使用 johnny-5(多板)时遇到了一些困难;谁能帮我解释一下这个问题?
我连接了 2 个 Arduinos,我可以使用 "var board = new five.Board()".
完美地单独访问它们我可以成功连接并使用它们 Cylon.js。
但是,当我尝试使用 "new five.Boards()" 时,它似乎从未发出 "ready" 事件,所以我可以开始编写我的逻辑。
使用(稍作修改)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
...我永远等待它永远不会发出 "ready"...
注1:我已经多次重新上传最新的"StandardFirmata";他们自己工作得很好。
注意 2:我在 3 个不同的系统上尝试了完全相同的设置(一个 ubuntu linux,一个 Windows,一个 Raspberry PI 2B)同样的问题...
我不确定我是否遗漏了一些愚蠢的东西;然而,无论我尝试什么,约翰尼五号都不允许我继续。正如我上面提到的,它似乎与 Cylon 完美配合——但是,我宁愿使用 j5,因为我已经有相当多的代码我宁愿不移植到 Cylon 只是为了连接多个Arduino 到我的系统。
如有任何帮助,我们将不胜感激!
更新#1:
我离 一点 更近了,我现在可以解决每个 Arduino 板的问题了。然而;我仍然对如何正确捕捉 "ready" 事件感到困惑。
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();
仍在尝试确定为什么我无法捕捉到难以捉摸的 "ready"。
更新#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)
它似乎发出了 "ready" 事件。
我在 repl 初始化中发现了一个错误,这将在下一个版本中修复。问题是在 Repl.prototype.initialize
中对 state.board.info(...)
的调用,其中 info
方法由于最近重构板日志记录和日志记录函数定义期间的疏忽而未定义。此错误出现在 v0.8.85 中,因此请尝试 npm install johnny-five@0.8.84
解决此问题,直到下一个版本。