npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

pidriver

v0.0.3

Published

Node.js driver for RaspberryPI (A,B,B+) with support for GPIO, SPI, PWM, LCD

Downloads

4

Readme

pidriver

Node.js bind of wiringPi lib

Installation

$ [sudo] npm install pidriver

Usage

Some functions may need root privileges

$ [sudo] node myapp

API is at most sync but any function that have callback(cb) can by async

//sync
var ret = input.write(0);

//async
input.write(0, function(err, ret){
	console.log(arguments);
})

Using "mods"

	var pi = require('pidriver');

	pi.INPUT	//'in'

	//all mods:

	var mods = {
		//Gpio mode:
		INPUT: 'in',
		OUTPUT: 'out',

		//for internal use rather (best not to use)
		PWM_OUTPUT: 2,
		GPIO_CLOCK: 3,

		//Gpio states:
		LOW: new Buffer('0'),
		HIGH: new Buffer('1'),

		// Gpio pull
		PUD_OFF: 0,
		PUD_DOWN: 1,
		PUD_UP: 2,

		// PWM
		PWM_MODE_MS: 0,
		PWM_MODE_BAL: 1,

		// Interrupt levels
		INT_EDGE_NONE: 'none',
		INT_EDGE_SETUP: 0,
		INT_EDGE_FALLING: 'falling',
		INT_EDGE_RISING: 'rising',
		INT_EDGE_BOTH: 'both'
	};

Gpio


var pi = require('pidriver'),
    led = new pi.Gpio('GPIO27', {mode: pi.OUTPUT}),
    input = new pi.Gpio('GPIO24', {pull: pi.PUD_UP});

input.on('up', function(input){
	console.log('Button is pressed');
	led.up();	//light up led
});

input.on('down', function(input){
	console.log('Button is unpressed');
	led.down();	//turn off led
});

new Gpio(gpio [,options])

gpio - pin number / 'GPIOx' / 'WPIOx' / 'special name'

You can use pin number or one of most popular names: 'GPIOx' for official gpio numbering, 'WPIOx' for wiringPi gpio numbering or its special name like 'PWM0' (for 12s pin) pin map

Full list of available names:

var pi = require('pidriver');

console.log(pi.pins)

/*	example for 12s pin:
	{
		...
		12: {name: ['PWM0','GPIO18', 'WPIO1'], gpio: 18, able: true, pullable: true},
		...
	}

	Pin number: 12
	Available names: PWM0, GPIO18, WPIO1
	Usable as Gpio
	Pullable (see below)
*/

options

	//default
	{
		edge: pi.INT_EDGE_BOTH,
		mode: pi.INPUT,
		pull: pi.PUD_OFF,
		state: 0	//initial state
	}

About mode and pull wiringPi doc, use "mods" for edge, mode, pull

Gpio is also Event Emitter:

Gpio.on('event', cb)

events: 'change' - state change 'up' - state 1 'down' - state 0

Gpio methods

  • Gpio.read([cb]) - read state

  • Gpio.write(state [,cb]) - set state

  • Gpio.up([cb]) - set state high

  • Gpio.down([cb]) - set state low

  • Gpio.setEdge(edge)

  • Gpio.setDirection(dir)

  • Gpio.setPull(pud)

  • Gpio.isPullable()

  • Gpio.isInput()

  • Gpio.isOutput()

  • Gpio.direction() - get direction

  • Gpio.options() - get options

  • Gpio.unexport()

Group


	var pi = require('pidriver'),
	led0 = new pi.Gpio('GPIO27', {mode: _.OUTPUT}),
	led1 = new pi.Gpio('GPIO22', {mode: _.OUTPUT}),
	led2 = new pi.Gpio('GPIO22', {mode: _.OUTPUT});

	var group = new pi.Group([led0, led1, led2]);
	group.up();	//light up all leds
	group.write(5);	// turn on leds: led0 and led2

new Group(gpios)

gpios - Array of Gpio

Group methods

  • Group.read([cb])

  • Group.write(value [,cb])

value is number (you can use hex(0xFF) also) number is formatted to bits array (85 -> 01010101) and asian to proper pin

  • Group.up([cb])

  • Group.down([cb])

PWM


	var pi = require('pidriver'),
	pwm = new pi.PWM('PWM0', {});

	console.log('PWM start blinking');
	var state = 0;

	setInterval(function() {
		state += 50;

		if(state>1023)
			state = 0;

		pwm.write(state);
	}, 100);

new PWM(gpio [,options])

gpio - gpio name, see Gpio

options

//default
{
	clock: 2,
	range: 1024,
	mode: mods.PWM_MODE_BAL,
	duty: 0
}

about range, clock, mode see PWM, for mode use "mods"

PWM methods

  • PWM.isHW() - is hardware PWM (only supported)

  • PWM.setRange(range)

  • PWM.setClock(clock)

  • PWM.setMode(mode)

  • PWM.write(value[, cb])

  • PWM.options()

  • PWM.unexport()

SPI


$ gpio load spi
	var pi = require('pidriver'),
		spi = new pi.SPI(0, {
			preBuffering: function(buff, arg){
				buff.writeUInt8(1, 0);
				buff.writeUInt8((8+arg)<<4, 1);
				buff.writeUInt8(0, 2);
				return buff;
			},
			postBuffering: function(buff, arg){
				return ((buff[1]&3)<<8) + buff[2];
			}
		});

	//post and preBuffering code from http://www.raspberrypi-spy.co.uk/2013/10/analogue-sensors-on-the-raspberry-pi-using-an-mcp3008/
	//example of reading channel 0 on MCP3008

	setInterval(function(){
		var channel = 0;
		console.log(spi.read(channel));
	},200);

new SPI(channel [,options])

channel - there is only two channels (0 and 1 (CE0 and CE1 pin))

options

	//default
	{
		channel: 0,
		clock: 1000000,
		preBuffering: null,
		postBuffering: null,
		words: 3
    }

SPI methods

  • SPI.options()

  • SPI.write(data, arg [,cb])

  • SPI.read(arg [,cb])

  • SPI.transfer(data, arg [,cb])

LCD


	var pi = require('pidriver'),
		lcd = new pi.LCD(['GPIO7','GPIO8','GPIO25','GPIO24','GPIO23','GPIO18']);

 	lcd.home();

 	var i = 0,
 		t = ['-','\\','|','/'];

	setInterval(function(){
		lcd.setPosition(0,1);
		lcd.write(new Buffer(t[++i%4]));
	} , 500)

new LCD(gpios [,options])

gpios - array of GPIO name (first is rs, second strb, channel0, channel1, ...)

options

	//default
	{
		rows: 2,	//number of LED's rows
		cols: 16,	//number of LED's cols
		bits: 4		//number of LED's channel (4 or 8 depends on LCD and installation)
	}

LCD methods

  • LCD.clear([cb])

  • LCD.home([cb])

  • LCD.write([cb])

  • LCD.setPosition(x, y [,cb])