约翰尼五和多个板 - 如何识别我连接到哪个板
Johnny five and multiple boards - how to recognize which board I am connected to
假设我正在将 2 个 Arduino 板连接到计算机,我想在这里使用 Johnny-5。每个板用于不同的任务,例如一个读取传感器,另一个控制一些 LED。因此,向适当的董事会发出 read/write 信号对我来说很重要。
我在这里寻求一些灵活性,因为我发现:
这里我不知道哪块板子有key A和哪块b,我不能保证我的arduinos连接到另一台机器时keys不会相反:
new five.Boards([ "A", "B" ]);
在这里我确切地知道哪个板连接到哪个端口,但如果我打算将板连接到另一台机器,我不能硬编码:
new five.Boards([ "/dev/cu.usbmodem621", "/dev/cu.usbmodem411" ]);
我现在唯一的想法是使用一种跳线,例如将 pin10 连接到板 1 上的 +5V,然后连接到板 2 上的地,或者甚至使用电阻器并具有多个信号电平(如果我打算连接更多的板),然后探测引脚并获取我连接到哪个板的信息并将其分配给阵列中的 A 或 B。之后我会 运行 我的程序的主要代码。
我的问题是:您是否看到任何其他方法可以保证您 "talk" 纠正电路板?
选项 1:使用拨码开关设置设备 ID
使用 2 或 4 开关拨码开关来识别板。每个开关都可以连接到一个单独的数字输入。
开关越多,您可以拥有的板子就越多
- 1 位 - 2 板
- 2 位 - 4 板
- 4 位 - 16 板
- 8 位 - 256 板
在 2 位配置中,
- 00 - 板 A
- 01 - 板 B
- 10 - 板 C
- 11 - 板 D
选项 2:修改 Firmata 并硬编码设备 ID
扩展和自定义 firmata 固件。我确定这不是一个很好的选择。
选项 3:使用 filename/firmware 名称
我从 Johnny-Five 和 Frimata 小组那里得到了很多很好的建议。强尼五号使用文件名作为固件名,可以通过Johnny-Five中的棋盘对象访问。
firmware: { version: [Object], name: 'AdvancedFirmata.ino' },
就我而言,我只是在编译 AdvancedFirmata 代码并将其上传到设备时重命名了文件名。
firmware: { version: [Object], name: 'boardA.ino' },
这就是我要在我的项目中使用的,通过board.io.firmware.name
来识别不同的板
这似乎是最好的解决方案。
更新:这是一个完整的例子。就我而言,我让事情变得更加可配置,但这会起作用:
var boards = new five.Boards("A","B");
var j5 = {}
boards.on("ready", function(){
this.each(function(board){
// Set up LED on board B
if(board.io.firmware.name == "BoardA.ino"){
j5.ledA = new five.Led({
pin: 13,
board: board
});
}
// Set up LED on board B
else if (board.io.firmware.name == "BoardB.ino"){
j5.ledB = new five.Led({
pin: 13,
board: board
});
}
});
});
现在您可以:
// Toggle LED A every 500ms
setInterval(function(){
j5.ledA.toggle();
},500);
// Toggle LED B every 250ms
setInterval(function(){
j5.ledB.toggle();
},250);
假设我正在将 2 个 Arduino 板连接到计算机,我想在这里使用 Johnny-5。每个板用于不同的任务,例如一个读取传感器,另一个控制一些 LED。因此,向适当的董事会发出 read/write 信号对我来说很重要。
我在这里寻求一些灵活性,因为我发现:
这里我不知道哪块板子有key A和哪块b,我不能保证我的arduinos连接到另一台机器时keys不会相反:
new five.Boards([ "A", "B" ]);
在这里我确切地知道哪个板连接到哪个端口,但如果我打算将板连接到另一台机器,我不能硬编码:
new five.Boards([ "/dev/cu.usbmodem621", "/dev/cu.usbmodem411" ]);
我现在唯一的想法是使用一种跳线,例如将 pin10 连接到板 1 上的 +5V,然后连接到板 2 上的地,或者甚至使用电阻器并具有多个信号电平(如果我打算连接更多的板),然后探测引脚并获取我连接到哪个板的信息并将其分配给阵列中的 A 或 B。之后我会 运行 我的程序的主要代码。
我的问题是:您是否看到任何其他方法可以保证您 "talk" 纠正电路板?
选项 1:使用拨码开关设置设备 ID
使用 2 或 4 开关拨码开关来识别板。每个开关都可以连接到一个单独的数字输入。
开关越多,您可以拥有的板子就越多
- 1 位 - 2 板
- 2 位 - 4 板
- 4 位 - 16 板
- 8 位 - 256 板
在 2 位配置中,
- 00 - 板 A
- 01 - 板 B
- 10 - 板 C
- 11 - 板 D
选项 2:修改 Firmata 并硬编码设备 ID
扩展和自定义 firmata 固件。我确定这不是一个很好的选择。
选项 3:使用 filename/firmware 名称
我从 Johnny-Five 和 Frimata 小组那里得到了很多很好的建议。强尼五号使用文件名作为固件名,可以通过Johnny-Five中的棋盘对象访问。
firmware: { version: [Object], name: 'AdvancedFirmata.ino' },
就我而言,我只是在编译 AdvancedFirmata 代码并将其上传到设备时重命名了文件名。
firmware: { version: [Object], name: 'boardA.ino' },
这就是我要在我的项目中使用的,通过board.io.firmware.name
这似乎是最好的解决方案。
更新:这是一个完整的例子。就我而言,我让事情变得更加可配置,但这会起作用:
var boards = new five.Boards("A","B");
var j5 = {}
boards.on("ready", function(){
this.each(function(board){
// Set up LED on board B
if(board.io.firmware.name == "BoardA.ino"){
j5.ledA = new five.Led({
pin: 13,
board: board
});
}
// Set up LED on board B
else if (board.io.firmware.name == "BoardB.ino"){
j5.ledB = new five.Led({
pin: 13,
board: board
});
}
});
});
现在您可以:
// Toggle LED A every 500ms
setInterval(function(){
j5.ledA.toggle();
},500);
// Toggle LED B every 250ms
setInterval(function(){
j5.ledB.toggle();
},250);