mirror of
https://github.com/node-red/node-red-nodes.git
synced 2023-10-10 13:36:58 +02:00
Add new Pibrella dedicated node for Raspberry Pi.
This commit is contained in:
parent
8bfb483091
commit
ab8d6b1b65
112
hardware/Pi/38-rpi-pibrella.html
Normal file
112
hardware/Pi/38-rpi-pibrella.html
Normal file
@ -0,0 +1,112 @@
|
||||
<!--
|
||||
Copyright 2013 IBM Corp.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<script type="text/x-red" data-template-name="rpi-pibrella in">
|
||||
<div class="form-row">
|
||||
<label for="node-input-pin"><i class="icon-asterisk"></i> Input</label>
|
||||
<select type="text" id="node-input-pin" style="width: 150px;">
|
||||
<option value="-">select input </option>
|
||||
<option value="Red Button">Red Button</option>
|
||||
<option value="In A">In A</option>
|
||||
<option value="In B">In B</option>
|
||||
<option value="In C">In C</option>
|
||||
<option value="In D">In D</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
|
||||
<input type="text" id="node-input-name" placeholder="Name">
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="rpi-pibrella in">
|
||||
<p>Raspberry Pi Pibrella input node. Generates a <b>msg.payload</b> with either a 0 or 1 depending on the state of the input pin.</p>
|
||||
<p>The <b>msg.topic</b> is set to <i>pibrella/{the pin id}</i>, A, B, C, D or R</p>
|
||||
<p><b>Note:</b> This node currently polls the pin every 250mS. This is not ideal as it loads the cpu.</p>
|
||||
<p>Requires the WiringPi gpio command in order to work.</p>
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
RED.nodes.registerType('rpi-pibrella in',{
|
||||
category: 'advanced-input',
|
||||
color:"#c6dbef",
|
||||
defaults: {
|
||||
name: { value:"" },
|
||||
intype: { value: "in" },
|
||||
pin: { value:"",required:true },
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "rpi.png",
|
||||
label: function() {
|
||||
return this.name||this.pin||"Pibrella";
|
||||
},
|
||||
labelStyle: function() {
|
||||
return this.name?"node_label_italic":"";
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<script type="text/x-red" data-template-name="rpi-pibrella out">
|
||||
<div class="form-row">
|
||||
<label for="node-input-pin"><i class="icon-asterisk"></i> Output</label>
|
||||
<select type="text" id="node-input-pin" style="width: 150px;">
|
||||
<option value="-">select output </option>
|
||||
<option value="Red LED">Red LED</option>
|
||||
<option value="Amber LED">Amber LED</option>
|
||||
<option value="Green LED">Green LED</option>
|
||||
<option value="Out E">Out E</option>
|
||||
<option value="Out F">Out F</option>
|
||||
<option value="Out G">Out G</option>
|
||||
<option value="Out H">Out H</option>
|
||||
<option value="Buzzer">Buzzer</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
|
||||
<input type="text" id="node-input-name" placeholder="Name">
|
||||
</div>
|
||||
<div class="form-tips">Buzzer takes <b>msg.payload</b> between 2 (high) and 512 (low), or 0 for off.</div>
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-help-name="rpi-pibrella out">
|
||||
<p>Raspberry Pi Pibrella output node. The Pibrella board must be fitted.</p>
|
||||
<p>Will set the selected output high (on) or low (off) depending on the value passed in. Expects a <b>msg.payload</b> with either a 0 or 1 (or true or false).</p>
|
||||
<p>The Buzzer is a divider so low numbers are high notes. 0 is off, and the sensible lowest note is around 250-300.</p>
|
||||
<p>Requires the WiringPi gpio command in order to work.</p>
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
RED.nodes.registerType('rpi-pibrella out',{
|
||||
category: 'advanced-output',
|
||||
color:"#c6dbef",
|
||||
defaults: {
|
||||
name: { value:"" },
|
||||
pin: { value:"",required:true },
|
||||
},
|
||||
inputs:1,
|
||||
outputs:0,
|
||||
icon: "rpi.png",
|
||||
align: "right",
|
||||
label: function() {
|
||||
return this.name||this.pin||"Pibrella";
|
||||
},
|
||||
labelStyle: function() {
|
||||
return this.name?"node_label_italic":"";
|
||||
}
|
||||
});
|
||||
</script>
|
173
hardware/Pi/38-rpi-pibrella.js
Normal file
173
hardware/Pi/38-rpi-pibrella.js
Normal file
@ -0,0 +1,173 @@
|
||||
/**
|
||||
* Copyright 2013 IBM Corp.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
**/
|
||||
|
||||
var RED = require(process.env.NODE_RED_HOME+"/red/red");
|
||||
var util = require("util");
|
||||
var exec = require('child_process').exec;
|
||||
var fs = require('fs');
|
||||
|
||||
if (!fs.existsSync("/usr/local/bin/gpio")) {
|
||||
exec("cat /proc/cpuinfo | grep BCM27",function(err,stdout,stderr) {
|
||||
if (stdout.indexOf('BCM27') > -1) {
|
||||
util.log('[36-rpi-gpio.js] Error: Cannot find Wiring-Pi "gpio" command. http://wiringpi.com/download-and-install/');
|
||||
}
|
||||
// else not on a Pi so don't worry anyone with needless messages.
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Map physical P1 pins to Gordon's Wiring-Pi Pins (as they should be V1/V2 tolerant)
|
||||
var pintable = {
|
||||
// Physical : WiringPi
|
||||
"Amber LED":"0",
|
||||
"Buzzer":"1",
|
||||
"Red LED":"2",
|
||||
"Out E":"3",
|
||||
"Out F":"4",
|
||||
"Out G":"5",
|
||||
"Out H":"6",
|
||||
"Green LED":"7",
|
||||
"In C":"10",
|
||||
"In B":"11",
|
||||
"In D":"12",
|
||||
"In A":"13",
|
||||
"Red Button":"14",
|
||||
}
|
||||
var tablepin = {
|
||||
// WiringPi : Physical
|
||||
"0":"Amber",
|
||||
"Buzzer":"1",
|
||||
"2":"Red",
|
||||
"3":"E",
|
||||
"4":"F",
|
||||
"5":"G",
|
||||
"6":"H",
|
||||
"7":"Green",
|
||||
"10":"C",
|
||||
"11":"B",
|
||||
"12":"D",
|
||||
"13":"A",
|
||||
"14":"R",
|
||||
}
|
||||
|
||||
function PibrellaIn(n) {
|
||||
RED.nodes.createNode(this,n);
|
||||
this.buttonState = -1;
|
||||
this.pin = pintable[n.pin];
|
||||
this.intype = n.intype;
|
||||
var node = this;
|
||||
|
||||
if (this.pin) {
|
||||
exec("gpio mode "+node.pin+" "+node.intype, function(err,stdout,stderr) {
|
||||
if (err) node.error(err);
|
||||
else {
|
||||
node._interval = setInterval( function() {
|
||||
exec("gpio read "+node.pin, function(err,stdout,stderr) {
|
||||
if (err) node.error(err);
|
||||
else {
|
||||
if (node.buttonState !== Number(stdout)) {
|
||||
var previousState = node.buttonState;
|
||||
node.buttonState = Number(stdout);
|
||||
if (previousState !== -1) {
|
||||
var msg = {topic:"pibrella/"+tablepin[node.pin], payload:node.buttonState};
|
||||
node.send(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}, 250);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
this.error("Invalid GPIO pin: "+this.pin);
|
||||
}
|
||||
}
|
||||
|
||||
function PibrellaOut(n) {
|
||||
RED.nodes.createNode(this,n);
|
||||
this.pin = pintable[n.pin];
|
||||
var node = this;
|
||||
|
||||
if (this.pin == "1") {
|
||||
exec("gpio mode 1 pwm");
|
||||
process.nextTick(function() {
|
||||
exec("gpio pwm-ms");
|
||||
node.on("input", function(msg) {
|
||||
var out = Number(msg.payload);
|
||||
if (out == 1) { out = 2; } // doesn't work with 1...
|
||||
if (out == 0) { exec("gpio pwm 1 0"); }
|
||||
else {
|
||||
exec("gpio pwm 1 511");
|
||||
exec("gpio pwmc "+out);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
else if (this.pin) {
|
||||
process.nextTick(function() {
|
||||
exec("gpio mode "+node.pin+" out", function(err,stdout,stderr) {
|
||||
if (err) node.error(err);
|
||||
else {
|
||||
node.on("input", function(msg) {
|
||||
if (msg.payload === "true") msg.payload = true;
|
||||
if (msg.payload === "false") msg.payload = false;
|
||||
var out = Number(msg.payload);
|
||||
if ((out == 0)|(out == 1)) {
|
||||
exec("gpio write "+node.pin+" "+out, function(err,stdout,stderr) {
|
||||
if (err) node.error(err);
|
||||
});
|
||||
}
|
||||
else node.warn("Invalid input - not 0 or 1");
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
else {
|
||||
this.error("Invalid GPIO pin: "+this.pin);
|
||||
}
|
||||
}
|
||||
|
||||
exec("gpio mode 0 out",function(err,stdout,stderr) {
|
||||
if (err) {
|
||||
util.log('[36-rpi-gpio.js] Error: "gpio" command failed for some reason.');
|
||||
}
|
||||
exec("gpio mode 1 out");
|
||||
exec("gpio mode 2 out");
|
||||
exec("gpio mode 3 out");
|
||||
exec("gpio mode 4 out");
|
||||
exec("gpio mode 5 out");
|
||||
exec("gpio mode 6 out");
|
||||
exec("gpio mode 7 out");
|
||||
exec("gpio mode 10 in");
|
||||
exec("gpio mode 11 in");
|
||||
exec("gpio mode 12 in");
|
||||
exec("gpio mode 13 in");
|
||||
exec("gpio mode 14 in",function(err,stdout,stderr) {
|
||||
RED.nodes.registerType("rpi-pibrella in",PibrellaIn);
|
||||
RED.nodes.registerType("rpi-pibrella out",PibrellaOut);
|
||||
|
||||
PibrellaIn.prototype.close = function() {
|
||||
clearInterval(this._interval);
|
||||
}
|
||||
|
||||
PibrellaOut.prototype.close = function() {
|
||||
exec("gpio mode "+this.pin+" in");
|
||||
}
|
||||
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue
Block a user