Firmatajs, несколько Arduino дают тайм-аут (johnny-five, cylonjs)

У меня есть два Arduino Unos, прошитых стандартным StandardFirmata, и я пробую демонстрацию нескольких плат с простым проектом узла (пакет npm johnny-five). Обе ардуины работают, когда я пробую их по отдельности. со следующим кодом:

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) Подключается только одна ардуино:

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 никогда не отвечает. Я поменял порядок Arduino и получил тот же результат (сначала один подключается, другой не отвечает). Соединение асинхронное, поэтому, возможно, оно где-то заблокировано. Индикаторы на обоих Arduino определенно показывают, что происходит какое-то действие.

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.

person Stijn Heylen    schedule 11.12.2014    source источник
comment
Я также попробовал официальный пример (например, /board-multi.js) и перепрошил обе Arduino с помощью StandardFirmata, и я все еще получаю тайм-аут. Кто-то может знать, что происходит?   -  person Stijn Heylen    schedule 11.12.2014
comment
Вроде бы код должен работать, но у вас проблемы со связью. Когда вы в последний раз обновляли Johnny Five?   -  person KatieK    schedule 11.12.2014
comment
Я пробовал как код из github, так и пакет node. Свежая установка сегодня утром.   -  person Stijn Heylen    schedule 11.12.2014
comment
Похоже, Диван Висаги открыл для вас ошибку здесь: github.com/rwaldron/johnny-five /issues/532 :)   -  person Rick    schedule 14.12.2014


Ответы (1)


Спасибо @izar за публикацию этого сообщения, а затем задал нам вопрос на канале Johnny-Five . Оттуда Диван Визаги (из основной команды Johnny-Five) работал над сортировкой ошибки и смог подтвердить ее путем воспроизведения. Это выявило ошибку в Firmata.js, из-за которой параметры, переданные Serialport, расширялись этим классом. Поскольку объект по умолчанию использовался повторно, а Object.assign не является «глубокой» операцией, изменения вносились в ссылку, а не в копию. В результате вторая инициализация получала набор «значений по умолчанию», которые были загружены собственными данными первого экземпляра. Проблема была устранена путем изменения Firmata для использования новых значений по умолчанию для каждого экземпляра. Вот патч

person Rick    schedule 14.12.2014