Package Exports
- perf-gpio
- perf-gpio/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (perf-gpio) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
perf-gpio
High performance GPIO tool kit for raspberry pi, including quadrature_decoder, DC motor control, soft PWM, buttons, etc. Based on c wiringpi.
install
npm install perf-gpio --save
Note: perf-gpio depend on dynamic-linked wiringPi at run-time, make sure you have wiringPi installed (/usr/local/lib/libwiringPi.so
file).
API Example
https://pinout.xyz/pinout/wiringpi# is the best doc I can find for wiringpi Pin number mappings.
onoff -- simple
var onoff = require('perf-gpio').onoff;
// wiring-pi 2 = GPIO27 = PIN13
var led = onoff(2);
led.set(1);
onoff -- flash
var onoff = require('perf-gpio').onoff;
// wiring-pi 2 = GPIO27 = PIN13
var led = onoff(2);
var current = false;
setTimeout(timeout, 1000);
function timeout() {
setTimeout(timeout, 1000);
current = !current;
led.set(current);
console.log(current);
}
button -- simple read
var button = require('perf-gpio').button;
// wiring-pi 3 = GPIO22 = PIN15
var b = button(3, button.PUD_UP); // use raspberry pi build-in 50k pull-up resistor
setTimeout(timeout, 1000);
function timeout() {
setTimeout(timeout, 1000);
var current = b.get();
console.log(current);
}
button -- callback
var button = require('perf-gpio').button;
// wiring-pi 3 = GPIO22 = PIN15
var b = button(3, button.PUD_UP);
b.watch(function(err, status) {
console.log(status? 'UP' : 'DOWN');
});
inputBank (setup multiple pins, read all at once, as bit mask)
var inputBank = require('perf-gpio').inputBank();
// wiring-pi 25/24/23 = GPIO26/19/13 = PIN37/35/33
var bank = inputBank([25, 24, 23], "PUD_DOWN");
setTimeout(timeout, 1000);
function timeout() {
setTimeout(timeout, 1000);
var val = bank();
// bit mask: bit 0 <= wp25, bit 1 <= wp24, bit 2 <= wp23
console.log(val);
}
- Note:
inputBank
support batch read, but don't support edge-triggered callback. If you need callback, consider usingbutton
. - Note:
inputBank
andbutton
can share the same pin. Under the hood they are both "input" mode, thus no conflict.
quadrature_decoder
var qd = require('perf-gpio').quadrature_decoder;
// quadrature_decoder you need 2 pins, phase A and B
// wiringpi PIN 0 and 1, maps to BCM GPIO 17 and 18
var counter = qd(0,1);
timeout();
function timeout() {
setTimeout(timeout, 1000);
console.log(counter.getCounter());
}
led (DMA-PWM basic)
var led = require('perf-gpio').led();
var pin = led(25); // wiringPi 25, GPIO 26
pin(0.5); // 50% on
led (DMA-PWM cnt.)
var led = require('perf-gpio').led();
var pin = led(25); // wiringPi 25, GPIO 26
pin(1);
setTimeout(function() {
pin(0.5);
setTimeout(function() {
pin.close(); // turn off led before quit
led.shutdown(); // shutdown DMA device before quit
process.exit(0);
}, 2000);
}, 2000);
DC motor control
var motor = require('perf-gpio').motor();
// Need 2 pin to control a DC motor (forward/backword)
// you need a H-bridge module to drive a DC motor
var pin = motor(23, 25);
pin(-0.5); // anywhere range from [-1.0, +1.0]
function timeout() {
pin.close(); // turn off motor before quit
motor.shutdown(); // shutdown DMA device before quit
process.exit(0);
}
setTimeout(timeout, 2000);
Note: DC motor and LED shares the same DMA channel (14 for pi2/3/zero and 7 for pi4), 5ms cycle with 2us step size.
Servo control
var servo = require('perf-gpio').servo();
var pin = servo(29); // wiringpi_25=gpio_21=Phys_40
pin(1500); // 1.5ms (mid)
setTimeout(function () {
pin(500); // 0.5ms (min)
setTimeout(function () {
pin(2500); // 2.5ms (max)
setTimeout(function () {
pin(1500); // 1.5ms (mid)
setTimeout(function () {
servo.shutdown();
process.exit(0);
}, 500);
}, 1000);
}, 1000);
}, 1000);
Note: Servo runs on it's own DMA channel (13 for pi2/3/zero and 6 for pi4), 20ms cycle with 10us step size.
Clock Output
var clockOut = require('./index').clockOut();
// wiring-pi 22 = GPIO6 = PIN31
var pinNum = 22;
var pin = clockOut(pinNum);
pin.setFeq(10000); // 10kHz
.....
pin.shutdown();
- Note: This hardware clock, only available from a few pin.
- Note: If don't shutdown, pi continue output clock even after your programe exits!
- Note: valid range from [4.7k, 19.2M] (Hz)
Why perf-gpio?
- Performance is the main reason I write this library.
- perf-gpio is based on c wiringPi, most of the interrupt handling is done in c code. This is especially important for quadrature_decoder, so far perf-gpio is probably the best quadrature decoder available on raspberry-pi.
- The DMA-PWM is based on rpio-pwm, which is the best (if not the only) DMA-PWM solution on node.js (that's the reason I spend my time created it).
- perf-gpio also supports pull-up/down resistors (which is a must-have for my project).
license
MIT