假设我正在将2块Arduino板连接到计算机,我想在这里使用Johnny five。每个板用于不同的任务,例如一个读取传感器,另一个控制一些LED。因此,对我来说,将信号读/写到合适的板上是很重要的。
我在这里寻找一些灵活性,因为我发现:
在这里,我不知道哪个板得到了密钥A和哪个B,而且我不能保证当我将我的arduinos连接到另一台机器时,密钥不会相反:
new five.Boards([ "A", "B" ]);
在这里,我确切地知道哪个板连接到哪个端口,但如果我计划将板连接到另一台机器,我无法对其进行硬编码:
new five.Boards([ "/dev/cu.usbmodem621", "/dev/cu.usbmodem411" ]);
我现在唯一的想法是使用一种跳线,例如在板1上连接引脚10到+5V,在板2上连接接地,或者甚至使用具有许多信号电平的电阻器(如果我计划连接更多的板),然后探测引脚,只需获取我连接到哪个板的信息,并将其分配给阵列中的a或B。之后,我会用我的程序运行主代码。
我的问题是:你有没有看到其他方法可以保证你和正确的董事会"交谈"?
选项1:使用dip开关设置设备ID
使用2或4开关的dip开关来识别电路板。每个开关都可以连接到一个单独的数字输入。
交换机越多,就越多
- 1位-2块板
- 2位-4块板
- 4位-16板
- 8位256板
在2位配置中,
- 00-板A
- 01-板B
- 10-板C
- 11-板D
选项2:修改Firmata并硬编码设备ID
扩展和自定义firmata固件。我已经确定这不是一个很好的选择。
选项3:使用文件名/固件名
我从Johnny Five&Frimata团体。Johnny Five使用文件名作为固件名称,Johnny Fife中的板对象可以访问该文件名。
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);