mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Add debounce to Pi GPIO node
This commit is contained in:
parent
6567739236
commit
72917117a9
@ -41,11 +41,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-intype"><i class="fa fa-level-up"></i> <span data-i18n="rpi-gpio.label.resistor"></span></label>
|
<label for="node-input-intype"><i class="fa fa-level-up"></i> <span data-i18n="rpi-gpio.label.resistor"></span></label>
|
||||||
<select type="text" id="node-input-intype" style="width: 150px;">
|
<select type="text" id="node-input-intype" style="width:100px;">
|
||||||
<option value="tri" data-i18n="rpi-gpio.resistor.none"></option>
|
<option value="tri" data-i18n="rpi-gpio.resistor.none"></option>
|
||||||
<option value="up" data-i18n="rpi-gpio.resistor.pullup"></option>
|
<option value="up" data-i18n="rpi-gpio.resistor.pullup"></option>
|
||||||
<option value="down" data-i18n="rpi-gpio.resistor.pulldown"></option>
|
<option value="down" data-i18n="rpi-gpio.resistor.pulldown"></option>
|
||||||
</select>
|
</select>
|
||||||
|
<span data-i18n="rpi-gpio.label.debounce"></span>
|
||||||
|
<input type="text" id="node-input-debounce" style="width:47px; text-align:right"/> mS
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label> </label>
|
<label> </label>
|
||||||
@ -65,7 +67,7 @@
|
|||||||
<p>Raspberry Pi input node. Generates a <b>msg.payload</b> with either a 0 or 1 depending on the state of the input pin. Requires the gpio command to work.</p>
|
<p>Raspberry Pi input node. Generates a <b>msg.payload</b> with either a 0 or 1 depending on the state of the input pin. Requires the gpio command to work.</p>
|
||||||
<p>You may also enable the input pullup resistor or the pulldown resistor.</p>
|
<p>You may also enable the input pullup resistor or the pulldown resistor.</p>
|
||||||
<p>The <b>msg.topic</b> is set to <i>pi/{the pin number}</i></p>
|
<p>The <b>msg.topic</b> is set to <i>pi/{the pin number}</i></p>
|
||||||
<p>Requires the RPi.GPIO python library version 0.5.8 (or better) in order to work.</p>
|
<p>Requires the RPi.GPIO python library version 0.5.10 (or better) in order to work.</p>
|
||||||
<p><b>Note:</b> we are using the actual physical pin numbers on connector P1 as they are easier to locate.</p>
|
<p><b>Note:</b> we are using the actual physical pin numbers on connector P1 as they are easier to locate.</p>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -77,8 +79,9 @@
|
|||||||
color:"#c6dbef",
|
color:"#c6dbef",
|
||||||
defaults: {
|
defaults: {
|
||||||
name: { value:"" },
|
name: { value:"" },
|
||||||
pin: { value:"",required:true,validate:RED.validators.number() },
|
pin: { value:"tri",required:true,validate:RED.validators.number() },
|
||||||
intype: { value:"in" },
|
intype: { value:"in" },
|
||||||
|
debounce: { value:"25" },
|
||||||
read: { value:false }
|
read: { value:false }
|
||||||
},
|
},
|
||||||
inputs:0,
|
inputs:0,
|
||||||
@ -104,7 +107,7 @@
|
|||||||
var alreadyset = this._("rpi-gpio.alreadyset");
|
var alreadyset = this._("rpi-gpio.alreadyset");
|
||||||
$.getJSON('rpi-gpio/'+this.id,function(data) {
|
$.getJSON('rpi-gpio/'+this.id,function(data) {
|
||||||
$('#pitype').text(data.type);
|
$('#pitype').text(data.type);
|
||||||
if ((data.type === "Model B+") || (data.type === "Model A+")) {
|
if ((data.type !== "Model B") && (data.type !== "Model A")) {
|
||||||
$('#node-input-pin').append($("<option></option>").attr("value",27).text("27 - SDA0 - BCM0"));
|
$('#node-input-pin').append($("<option></option>").attr("value",27).text("27 - SDA0 - BCM0"));
|
||||||
$('#node-input-pin').append($("<option></option>").attr("value",28).text("28 - SCL0 - BCM1"));
|
$('#node-input-pin').append($("<option></option>").attr("value",28).text("28 - SCL0 - BCM1"));
|
||||||
$('#node-input-pin').append($("<option></option>").attr("value",29).text("29 - GPIO21 - BCM5"));
|
$('#node-input-pin').append($("<option></option>").attr("value",29).text("29 - GPIO21 - BCM5"));
|
||||||
@ -206,7 +209,7 @@
|
|||||||
<p>When using PWM mode - expects an input value of a number 0 - 100. It can be floating point.</p>
|
<p>When using PWM mode - expects an input value of a number 0 - 100. It can be floating point.</p>
|
||||||
<p>PWM mode can be used to drive a servo using input values between 10 and 20 only.
|
<p>PWM mode can be used to drive a servo using input values between 10 and 20 only.
|
||||||
The GPIO2 pin is best for this as it uses hardware to do the PWM.</p>
|
The GPIO2 pin is best for this as it uses hardware to do the PWM.</p>
|
||||||
<p>Requires the RPi.GPIO python library version 0.5.8 (or better) in order to work.</p>
|
<p>Requires the RPi.GPIO python library version 0.5.10 (or better) in order to work.</p>
|
||||||
<p><b>Note:</b> we are using the actual physical pin numbers on connector P1 as they are easier to locate.</p>
|
<p><b>Note:</b> we are using the actual physical pin numbers on connector P1 as they are easier to locate.</p>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -249,7 +252,7 @@
|
|||||||
if (!$("#node-input-out").val()) { $("#node-input-out").val("out"); }
|
if (!$("#node-input-out").val()) { $("#node-input-out").val("out"); }
|
||||||
$.getJSON('rpi-gpio/'+this.id,function(data) {
|
$.getJSON('rpi-gpio/'+this.id,function(data) {
|
||||||
$('#pitype').text(data.type);
|
$('#pitype').text(data.type);
|
||||||
if ((data.type === "Model B+") || (data.type === "Model A+")) {
|
if ((data.type !== "Model B") && (data.type !== "Model A")) {
|
||||||
$('#node-input-pin').append($("<option></option>").attr("value",27).text("27 - SDA0 - BCM0"));
|
$('#node-input-pin').append($("<option></option>").attr("value",27).text("27 - SDA0 - BCM0"));
|
||||||
$('#node-input-pin').append($("<option></option>").attr("value",28).text("28 - SCL0 - BCM1"));
|
$('#node-input-pin').append($("<option></option>").attr("value",28).text("28 - SCL0 - BCM1"));
|
||||||
$('#node-input-pin').append($("<option></option>").attr("value",29).text("29 - GPIO21 - BCM5"));
|
$('#node-input-pin').append($("<option></option>").attr("value",29).text("29 - GPIO21 - BCM5"));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013,2015 IBM Corp.
|
* Copyright 2013,2016 IBM Corp.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -20,7 +20,7 @@ module.exports = function(RED) {
|
|||||||
var spawn = require('child_process').spawn;
|
var spawn = require('child_process').spawn;
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
|
|
||||||
var gpioCommand = __dirname+'/nrgpio.py';
|
var gpioCommand = __dirname+'/nrgpio';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
fs.statSync("/dev/ttyAMA0"); // unlikely if not on a Pi
|
fs.statSync("/dev/ttyAMA0"); // unlikely if not on a Pi
|
||||||
@ -53,6 +53,7 @@ module.exports = function(RED) {
|
|||||||
this.pin = n.pin;
|
this.pin = n.pin;
|
||||||
this.intype = n.intype;
|
this.intype = n.intype;
|
||||||
this.read = n.read || false;
|
this.read = n.read || false;
|
||||||
|
this.debounce = Number(n.debounce || 25);
|
||||||
if (this.read) { this.buttonState = -2; }
|
if (this.read) { this.buttonState = -2; }
|
||||||
var node = this;
|
var node = this;
|
||||||
if (!pinsInUse.hasOwnProperty(this.pin)) {
|
if (!pinsInUse.hasOwnProperty(this.pin)) {
|
||||||
@ -65,11 +66,7 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (node.pin !== undefined) {
|
if (node.pin !== undefined) {
|
||||||
if (node.intype === "tri") {
|
node.child = spawn(gpioCommand, ["in",node.pin,node.intype,node.debounce]);
|
||||||
node.child = spawn(gpioCommand, ["in",node.pin]);
|
|
||||||
} else {
|
|
||||||
node.child = spawn(gpioCommand, ["in",node.pin,node.intype]);
|
|
||||||
}
|
|
||||||
node.running = true;
|
node.running = true;
|
||||||
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
||||||
|
|
||||||
@ -216,16 +213,18 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var pitype = { type:"" };
|
var pitype = { type:"" };
|
||||||
exec(gpioCommand+" rev 0", function(err,stdout,stderr) {
|
exec(gpioCommand+" info", function(err,stdout,stderr) {
|
||||||
if (err) {
|
if (err) {
|
||||||
RED.log.info(RED._("rpi-gpio.errors.version"));
|
RED.log.info(RED._("rpi-gpio.errors.version"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (stdout.trim() == "0") { pitype = { type:"Compute" }; }
|
try {
|
||||||
else if (stdout.trim() == "1") { pitype = { type:"A/B v1" }; }
|
var info = JSON.parse( stdout.trim().replace(/\'/g,"\"") );
|
||||||
else if (stdout.trim() == "2") { pitype = { type:"A/B v2" }; }
|
pitype.type = info["TYPE"];
|
||||||
else if (stdout.trim() == "3") { pitype = { type:"Model B+" }; }
|
}
|
||||||
else { RED.log.info(RED._("rpi-gpio.errors.sawpitype"),stdout.trim()); }
|
catch(e) {
|
||||||
|
RED.log.info(RED._("rpi-gpio.errors.sawpitype"),stdout.trim());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
RED.nodes.registerType("rpi-gpio out",GPIOOutNode);
|
RED.nodes.registerType("rpi-gpio out",GPIOOutNode);
|
||||||
@ -235,7 +234,7 @@ module.exports = function(RED) {
|
|||||||
this.butt = n.butt || 7;
|
this.butt = n.butt || 7;
|
||||||
var node = this;
|
var node = this;
|
||||||
|
|
||||||
node.child = spawn(gpioCommand, ["mouse",node.butt]);
|
node.child = spawn(gpioCommand+".py", ["mouse",node.butt]);
|
||||||
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
||||||
|
|
||||||
node.child.stdout.on('data', function (data) {
|
node.child.stdout.on('data', function (data) {
|
||||||
@ -281,7 +280,7 @@ module.exports = function(RED) {
|
|||||||
RED.nodes.createNode(this,n);
|
RED.nodes.createNode(this,n);
|
||||||
var node = this;
|
var node = this;
|
||||||
|
|
||||||
node.child = spawn(gpioCommand, ["kbd","0"]);
|
node.child = spawn(gpioCommand+".py", ["kbd","0"]);
|
||||||
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
||||||
|
|
||||||
node.child.stdout.on('data', function (data) {
|
node.child.stdout.on('data', function (data) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
#
|
#
|
||||||
# Copyright 2014 IBM Corp.
|
# Copyright 2014,2016 IBM Corp.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@ -19,8 +19,9 @@ import struct
|
|||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
bounce = 20 # bounce time in mS to apply
|
bouce = 20;
|
||||||
|
|
||||||
if sys.version_info >= (3,0):
|
if sys.version_info >= (3,0):
|
||||||
print("Sorry - currently only configured to work with python 2.x")
|
print("Sorry - currently only configured to work with python 2.x")
|
||||||
@ -95,18 +96,18 @@ if len(sys.argv) > 2:
|
|||||||
|
|
||||||
elif cmd == "in":
|
elif cmd == "in":
|
||||||
#print "Initialised pin "+str(pin)+" to IN"
|
#print "Initialised pin "+str(pin)+" to IN"
|
||||||
|
bounce = int(sys.argv[4])
|
||||||
def handle_callback(chan):
|
def handle_callback(chan):
|
||||||
|
sleep(bounce/1000)
|
||||||
print GPIO.input(chan)
|
print GPIO.input(chan)
|
||||||
|
|
||||||
if len(sys.argv) == 4:
|
|
||||||
if sys.argv[3].lower() == "up":
|
if sys.argv[3].lower() == "up":
|
||||||
GPIO.setup(pin,GPIO.IN,GPIO.PUD_UP)
|
GPIO.setup(pin,GPIO.IN,GPIO.PUD_UP)
|
||||||
elif sys.argv[3].lower() == "down":
|
elif sys.argv[3].lower() == "down":
|
||||||
GPIO.setup(pin,GPIO.IN,GPIO.PUD_DOWN)
|
GPIO.setup(pin,GPIO.IN,GPIO.PUD_DOWN)
|
||||||
else:
|
else:
|
||||||
GPIO.setup(pin,GPIO.IN)
|
GPIO.setup(pin,GPIO.IN)
|
||||||
else:
|
|
||||||
GPIO.setup(pin,GPIO.IN)
|
|
||||||
print GPIO.input(pin)
|
print GPIO.input(pin)
|
||||||
GPIO.add_event_detect(pin, GPIO.BOTH, callback=handle_callback, bouncetime=bounce)
|
GPIO.add_event_detect(pin, GPIO.BOTH, callback=handle_callback, bouncetime=bounce)
|
||||||
|
|
||||||
@ -169,12 +170,6 @@ if len(sys.argv) > 2:
|
|||||||
except:
|
except:
|
||||||
data = 0
|
data = 0
|
||||||
|
|
||||||
elif cmd == "rev":
|
|
||||||
print GPIO.RPI_REVISION
|
|
||||||
|
|
||||||
elif cmd == "ver":
|
|
||||||
print GPIO.VERSION
|
|
||||||
|
|
||||||
elif cmd == "mouse": # catch mice button events
|
elif cmd == "mouse": # catch mice button events
|
||||||
file = open( "/dev/input/mice", "rb" )
|
file = open( "/dev/input/mice", "rb" )
|
||||||
oldbutt = 0
|
oldbutt = 0
|
||||||
@ -225,9 +220,11 @@ elif len(sys.argv) > 1:
|
|||||||
print GPIO.RPI_REVISION
|
print GPIO.RPI_REVISION
|
||||||
elif cmd == "ver":
|
elif cmd == "ver":
|
||||||
print GPIO.VERSION
|
print GPIO.VERSION
|
||||||
|
elif cmd == "info":
|
||||||
|
print GPIO.RPI_INFO
|
||||||
else:
|
else:
|
||||||
print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver {pin} {value|up|down}"
|
print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}"
|
||||||
print " only ver (gpio version) and rev (board revision) accept no pin parameter."
|
print " only ver (gpio version) and info (board information) accept no pin parameter."
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver {pin} {value|up|down}"
|
print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}"
|
||||||
|
@ -569,6 +569,7 @@
|
|||||||
"readinitial": "Read initial state of pin on deploy/restart?",
|
"readinitial": "Read initial state of pin on deploy/restart?",
|
||||||
"type": "Type",
|
"type": "Type",
|
||||||
"initpin": "Initialise pin state?",
|
"initpin": "Initialise pin state?",
|
||||||
|
"debounce": "Debounce",
|
||||||
"button": "Button",
|
"button": "Button",
|
||||||
"pimouse": "Pi Mouse",
|
"pimouse": "Pi Mouse",
|
||||||
"pikeyboard": "Pi Keyboard",
|
"pikeyboard": "Pi Keyboard",
|
||||||
|
Loading…
Reference in New Issue
Block a user