Чтение входных контактов с johnny-5 и arduino
Я работаю над приложением, использующим node.js и arduino.
Я использую каркас johnny-Five и загрузил эскиз StandardFirmata в мое arduino, к которому подключен контроллер аркады на контактах 2, 3, 4 и 5.
это моя реализация:
var five = require('johnny-five');
var board
board = new five.Board();
board.on('ready', function(){
console.log('board is ready');
this.pinMode(2, five.Pin.INPUT);
this.pinMode(3, five.Pin.INPUT);
this.pinMode(4, five.Pin.INPUT);
this.pinMode(5, five.Pin.INPUT);
this.digitalRead(2, function(value) {
if(value === 0)
{
console.log('up');
}
});
this.digitalRead(3, function(value) {
if(value === 0) {
console.log('right');
}
});
this.digitalRead(4, function(value) {
if(value === 0) {
console.log('left');
}
});
this.digitalRead(5, function(value) {
if(value === 0) {
console.log('down');
}
});
});
Теперь проблема в том, что когда я опускаю или выключаю свой аркадный контроллер, он регистрирует "вверх" или "вниз" несколько раз... это может быть 5 раз, это может быть 10 раз. Что я делаю неправильно?
2 ответа
Это совершенно правильно. Значения читаются быстрее, чем движется ваша рука, поэтому перед изменением физического состояния устройства может быть много чтений текущего состояния ("ВЫСОКОЕ" или "НИЗКОЕ"). Одно из решений - отменить обработчики, другое - сохранить последнее значение и работать только тогда, когда текущее значение отличается:
var five = require("../lib/johnny-five");
var board = new five.Board();
board.on("ready", function(){
var directions = {
up: { pin: 2, value: null },
right: { pin: 3, value: null },
left: { pin: 4, value: null },
down: { pin: 5, value: null },
};
Object.keys(directions).forEach(function(key) {
var pin = directions[key].pin;
this.pinMode(pin, five.Pin.INPUT);
this.digitalRead(pin, function(data) {
// Catpure the initial pin value
if (directions[key].value === null) {
directions[key].value = data;
}
// Something changed
if (directions[key].value !== data) {
console.log(pin, key);
}
directions[key].value = data;
});
}, this);
});
Если у вас есть дополнительные вопросы, пожалуйста, присоединяйтесь к нам на канале Johnny-Five Gitter.
Для этого вы также можете использовать стандартный класс кнопки бампера johnny-Five. В ней уже реализована дебуция.
https://github.com/rwaldron/johnny-five/blob/master/docs/button-bumper.md
var five = require("johnny-five"),
bumper, led;
five.Board().on("ready", function() {
bumper = new five.Button(7);
led = new five.Led(13);
bumper.on("hit", function() {
led.on();
}).on("release", function() {
led.off();
});
});
Это потребует от вас рефакторинга вашего кода, но после этого он станет намного чище.