A proof of concept to demonstrate that it's feasible to implement a Raspberry Pi IO Plugin for Johnny-Five using Linux-IO.
Tested on a Raspberry Pi 3 with Node.js v6.10.2.
npm install pi-io
Feature | Support |
---|---|
Analog Read | no |
Digital Read | yes |
Digital Write | yes |
PWM | yes |
Servo | yes |
I2C | yes |
One Wire | no |
Stepper | no |
Serial/UART | no |
DAC | no |
Ping | yes *) |
*) Ping was tested with three HC-SR04 proximity sensors with varying degrees of success. One sensor functioned as expected. The second didn't timeout as it should but it's was possible to workaround the issue with software. The third sensor didn't function. The issues may be related to the fact that a single pin is used for both trigger and echo.
To workaround these issues a controller was implemented that allows separate pins to be used for trigger and echo. The same three HC-SR04 proximity sensors functioned well with this controller.
Pin ID | Supported Modes | Comments |
---|---|---|
P1-3 or GPIO2 | INPUT, OUTPUT, PWM, SERVO | Alternatively I2C SDA1 |
P1-5 or GPIO3 | INPUT, OUTPUT, PWM, SERVO | Alternatively I2C SCL1 |
P1-7 or GPIO4 | INPUT, OUTPUT, PWM, SERVO | |
P1-8 or GPIO14 | INPUT, OUTPUT, PWM, SERVO | |
P1-10 or GPIO15 | INPUT, OUTPUT, PWM, SERVO | |
P1-11 or GPIO17 | INPUT, OUTPUT, PWM, SERVO | |
P1-12 or GPIO18 | INPUT, OUTPUT, PWM, SERVO | |
P1-13 or GPIO27 | INPUT, OUTPUT, PWM, SERVO | |
P1-15 or GPIO22 | INPUT, OUTPUT, PWM, SERVO | |
P1-16 or GPIO23 | INPUT, OUTPUT, PWM, SERVO | |
P1-18 or GPIO24 | INPUT, OUTPUT, PWM, SERVO | |
P1-19 or GPIO10 | INPUT, OUTPUT, PWM, SERVO | |
P1-21 or GPIO9 | INPUT, OUTPUT, PWM, SERVO | |
P1-22 or GPIO25 | INPUT, OUTPUT, PWM, SERVO | |
P1-23 or GPIO11 | INPUT, OUTPUT, PWM, SERVO | |
P1-24 or GPIO8 | INPUT, OUTPUT, PWM, SERVO | |
P1-26 or GPIO7 | INPUT, OUTPUT, PWM, SERVO | |
P1-29 or GPIO5 | INPUT, OUTPUT, PWM, SERVO | |
P1-31 or GPIO6 | INPUT, OUTPUT, PWM, SERVO | |
P1-32 or GPIO12 | INPUT, OUTPUT, PWM, SERVO | |
P1-33 or GPIO13 | INPUT, OUTPUT, PWM, SERVO | |
P1-35 or GPIO19 | INPUT, OUTPUT, PWM, SERVO | |
P1-36 or GPIO16 | INPUT, OUTPUT, PWM, SERVO | |
P1-37 or GPIO26 | INPUT, OUTPUT, PWM, SERVO | |
P1-38 or GPIO20 | INPUT, OUTPUT, PWM, SERVO | |
P1-40 or GPIO21 | INPUT, OUTPUT, PWM, SERVO | |
LED0 | OUTPUT | Built-in LED |
var five = require('johnny-five');
var PiIO = require('pi-io');
var board = new five.Board({
io: new PiIO()
});
board.on('ready', function() {
var led = new five.Led('GPIO17');
led.pulse(1000);
});
var five = require('johnny-five');
var PiIO = require('pi-io');
var board = new five.Board({
io: new PiIO()
});
board.on('ready', function() {
var servo = new five.Servo({
pin: 'GPIO27',
type: "continuous"
});
servo.cw(0.8);
});
var five = require('johnny-five');
var PiIO = require('pi-io');
var board = new five.Board({
io: new PiIO()
});
board.on('ready', function() {
var proximity = new five.Proximity({
controller: PiIO.HCSR04, // Custom controller
triggerPin: 'GPIO23',
echoPin: 'GPIO24'
});
proximity.on("change", function() {
console.log("cm: ", this.cm);
});
});
Note that this circuit uses a single pin for trigger and echo. Whether or not this functions correctly appears to be highly dependent on the particular HC-SR04 sensor being used. The circuit shown above that uses separate pins for trigger and echo is far more reliable.
var five = require('johnny-five');
var PiIO = require('pi-io');
var board = new five.Board({
io: new PiIO()
});
board.on('ready', function() {
var proximity = new five.Proximity({
controller: 'HCSR04',
pin: 'GPIO25'
});
proximity.on("data", function() {
console.log("cm: ", this.cm);
});
});
Additional examples can be found in the example directory.