From 8e84e19cdef379b3829336010038cfc5d4a22759 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 20 Sep 2016 08:19:45 +0100 Subject: [PATCH] add mcp3008 node and bump some packages --- README.md | 2 + hardware/mcp3008/.DS_Store | Bin 0 -> 6148 bytes hardware/mcp3008/LICENSE | 177 ++++++++++++++++++++++++++++++++ hardware/mcp3008/README.md | 38 +++++++ hardware/mcp3008/package.json | 24 +++++ hardware/mcp3008/pimcp3008.html | 71 +++++++++++++ hardware/mcp3008/pimcp3008.js | 76 ++++++++++++++ package.json | 28 ++--- 8 files changed, 402 insertions(+), 14 deletions(-) create mode 100644 hardware/mcp3008/.DS_Store create mode 100644 hardware/mcp3008/LICENSE create mode 100644 hardware/mcp3008/README.md create mode 100644 hardware/mcp3008/package.json create mode 100644 hardware/mcp3008/pimcp3008.html create mode 100644 hardware/mcp3008/pimcp3008.js diff --git a/README.md b/README.md index 6336cabc..e78ad545 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ Copyright 2013, 2016 IBM Corp. under [the Apache 2.0 license](LICENSE). **node-red-node-intel-galileo** - *[mraa-spio](hardware/intel)* - A collection of analogue & digital input & output nodes for the Intel Galileo and Edison. +**node-red-node-pi-mcp3008** - *[pimcp3008](hardware/mcp3008)* - Allows A Raspberry Pi to node to read from an MCP3008 Analogue to Digital Converter chip via the SPI bus. + **node-red-node-pi-neopixel** - *[neopixel](hardware/neopixel)* - Allows A Raspberry Pi to drive a strip of NeoPixels directly. **node-red-node-pi-unicorn-hat** - *[unicorn](hardware/unicorn)* - Lets a Raspbeery Pi control a Pimorini Unicorn HAT 8x8 LED display. diff --git a/hardware/mcp3008/.DS_Store b/hardware/mcp3008/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0Node-RED node to read from +the MCP3008 Analogue to Digital Converter, +such as the Rasp.io analogzero, though it will work with breadboard versions also. + +**Warning**: Input voltages must not exceed 3.3V + +### Pre-requisites + +You must ensure that SPI is enabled. For recent (2016) versions of Raspbian you can do this + + - Run `sudo raspi-config` + - Select `9 - Advanced Options` + - Select `A5 - SPI` + - Select `yes` to enable SPI + - Select `OK` to confirm + - Select the `Finish` button + +### Install + +Run the following command in your Node-RED user directory - typically `~/.node-red` + + npm install node-red-node-pi-mcp3008 + +### Usage + +Reads from an MCP3008 Analogue to Digital (ADC) chip on the Pi SPI CE0 connection. + +You can either set a channel in the edit dialogue, or you can set the `msg.payload` to +select the channel dynamically. If so then the payload must be a value from 0 to 7. + +Outputs a numeric `msg.payload` with a range of 0 to 1023, where 0 = 0V and 1023 = 3.3V (assuming you use the default 3.3V voltage reference). + +**Hint**: use a `range` node to adjust the values to the range you want. + +Also sets `msg.topic` to `adc/{the pin number}` diff --git a/hardware/mcp3008/package.json b/hardware/mcp3008/package.json new file mode 100644 index 00000000..722daf57 --- /dev/null +++ b/hardware/mcp3008/package.json @@ -0,0 +1,24 @@ +{ + "name" : "node-red-node-pi-mcp3008", + "version" : "0.0.2", + "description" : "A Node-RED node to read from the MCP3008 Analogue to Digital Converter", + "dependencies" : { + "mcp-spi-adc": "^0.0.1" + }, + "repository" : { + "type":"git", + "url":"https://github.com/node-red/node-red-nodes/tree/master/hardware" + }, + "license": "Apache-2.0", + "keywords": [ "node-red", "pi", "adc", "mcp3008" ], + "node-red" : { + "nodes" : { + "pimcp3008": "pimcp3008.js" + } + }, + "author": { + "name": "Dave Conway-Jones", + "email": "conway@uk.ibm.com", + "url": "http://nodered.org" + } +} diff --git a/hardware/mcp3008/pimcp3008.html b/hardware/mcp3008/pimcp3008.html new file mode 100644 index 00000000..b4794392 --- /dev/null +++ b/hardware/mcp3008/pimcp3008.html @@ -0,0 +1,71 @@ + + + + + + + + diff --git a/hardware/mcp3008/pimcp3008.js b/hardware/mcp3008/pimcp3008.js new file mode 100644 index 00000000..6cc34591 --- /dev/null +++ b/hardware/mcp3008/pimcp3008.js @@ -0,0 +1,76 @@ +/** + * Copyright 2016 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. + **/ + +module.exports = function(RED) { + "use strict"; + var fs = require('fs'); + // unlikely if not on a Pi + try { fs.statSync("/dev/ttyAMA0"); } + catch(err) { throw "Info : Ignoring Raspberry Pi specific node"; } + + var mcpadc = require('mcp-spi-adc'); + var mcp3008 = []; + + function PiMcpNode(n) { + RED.nodes.createNode(this,n); + this.pin = n.pin || 0; + this.interval = n.interval || 1000; + var node = this; + + try { + fs.statSync("/dev/spidev0.0"); + if (mcp3008.length === 0) { + for (var i=0; i<8; i++) { + mcp3008.push(mcpadc.open(i, function (err) { + if (err) { node.error("Error: "+err); } + })); + } + } + node.on("input", function(msg) { + var pin = null; + if (node.pin === "M") { + var pay = parseInt(msg.payload.toString()); + if ((pay >= 0) && (pay <= 7)) { pin = pay; } + else { node.warn("Payload needs to select channel 0 to 7"); } + } + else { pin = parseInt(node.pin); } + if (pin !== null) { + mcp3008[pin].read(function (err, reading) { + if (err) { node.warn("Read error: "+err); } + else { node.send({payload:reading.rawValue, topic:"adc/"+pin}); } + }); + } + }); + + } + catch(err) { + node.error("Error : Can't find SPI device - is SPI enabled in raspi-config ?"); + } + + node.on("close", function(done) { + if (mcp3008.length !== 0) { + var j=0; + for (var i=0; i<8; i++) { + mcp3008[i].close(function() { j += 1; if (j === 8) {done()} }); + } + mcp3008 = []; + } + else { done(); } + }); + } + + RED.nodes.registerType("pimcp3008",PiMcpNode); +} diff --git a/package.json b/package.json index dd4dcfc9..2fe474bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-nodes", - "version" : "0.0.5", + "version" : "0.0.6", "description" : "Node-RED-nodes package to hold the test framework ONLY - use npm to install individual nodes", "homepage" : "http://nodered.org", "license" : "Apache-2.0", @@ -18,24 +18,24 @@ ], "devDependencies": { "grunt": "^0.4.5", - "grunt-simple-mocha": "0.4.1", - "grunt-contrib-jshint": "1.0.0", - "grunt-lint-inline": "0.4.4", - "grunt-jscs": "2.8.0", + "grunt-simple-mocha": "^0.4.1", + "grunt-contrib-jshint": "^1.0.0", + "grunt-lint-inline": "^0.4.4", + "grunt-jscs": "^2.8.0", "mocha": "^2.4.5", "should": "^8.3.1", "sinon": "^1.17.3", "supertest": "^1.2.0", - "proxyquire": "1.7.4", - "pushbullet": "1.4.*", + "proxyquire": "^1.7.10", + "pushbullet": "^1.4.0", "when": "^3.7.7", - "exif": "0.6.0", - "ngeohash": "0.6.*", - "nodemailer" : "1.11.*", - "poplib" : "0.1.7", - "mailparser" : "0.5.3", - "imap" : "0.8.17", - "msgpack-js": "0.3.0" + "exif": "^0.6.0", + "ngeohash": "^0.6.0", + "nodemailer" : "^1.11.0", + "poplib" : "^0.1.7", + "mailparser" : "^0.5.3", + "imap" : "^0.8.18", + "msgpack-js": "^0.3.0" }, "engines": { "node": ">=0.10"