mirror of
				https://github.com/node-red/node-red-nodes.git
				synced 2025-03-01 10:37:43 +00:00 
			
		
		
		
	Add new Pibrella dedicated node for Raspberry Pi.
This commit is contained in:
		
							
								
								
									
										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");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
		Reference in New Issue
	
	Block a user