Arduino pin management in Javascript
JavaScript
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.

README.md

PinIO - Arduino pin management in javascript

This is a simple node.js library for controlling multiple arduino boards and groups of pins. This is intended to be a fairly low-level library that exposes an API which makes lower-level management of Arduino pins easier.

Beginners

Beginners with arduino would be better off looking at the excellent Johnny-Five Library: https://github.com/rwldrn/johnny-five. This library will abstract away a lot of pain points of dealing with pesky bits.

Installation

npm install pinio

Turning a LED on and off

var pinio = new (require('pinio')).Pinio()

pinio.on('ready', function(board) {

	var led = board.pins(11)
	led.output()
	led.high()

	setTimeout(function() {
		led.low()
	}, 2000)

})

Managing multiple boards

var pinio = new (require('pinio')).Pinio()

pinio.on('ready', function(first, second) {

	function turnOn(board, pin) {
		var led = board.pins(11)

		led.output()
		led.high()

		setTimeout(function() {
			led.low()
		}, 2000)
	}

	// Turn on an LED connected to the first board on port 11
	turnOn(first, 11)

	// Turn on an LED connected to the second board on port 10
	turnOn(second, 10)
})

Ping distance sensor

var pinio = new (require('pinio')).Pinio()

pinio.on('ready', function(board) {
	var ping = board.pins(13)

	setInterval(function() {
		ping.pulse()
	}, 500)

	ping.on('read', function(distance) {
		console.log('Distance is:', distance)
	})
})

Continuous Rotation Servo

The best way to position a continuous rotation servo is to set it to stopped, servo.write(90), then adjust the potentiometer until the servo no longer moves.

var pinio = new (require('pinio')).Pinio()

pinio.on('ready', function(board) {
	// "0" is full speed backwards.
	// "90" is stop,
	// "180" is full speed forward, 
	// TODO: I would like to make this -90, 0, 90

	var servo = board.pins(9)

	servo.mode('SERVO')

	var incrementer = 10
	var current = 90

	function setPosition() {
		servo.write(current)
		current += incrementer

		if (current >= 180 || current == 0)
			incrementer = 0 - incrementer

		setTimeout(setPosition, 500)
	}
	setPosition()

})

Shift Register

This example will implement a binary counter with 8 LEDs connected to a shift register on pins 2, 3, 4.

var pinio = new (require('pinio')).Pinio()

pinio.on('ready', function(board) {

	var dataPin = board.pins(2)
	var latchPin = board.pins(3)
	var clockPin = board.pins(4)

	dataPin.output()
	latchPin.output()
	clockPin.output()

	function shiftOut(clockPin, dataPin, value) {
		for (var mask = 128; mask > 0; mask = mask >> 1) {
			clockPin.low()
			dataPin[ value & mask ? 'high' : 'low' ]()
			clockPin.high()
		}
	}

	var counter = 0
	function loop() {

		if (counter >= 256)
			return

		latchPin.low()
		
		shiftOut(clockPin, dataPin, counter)

		latchPin.high()

		counter++
		setTimeout(loop, 100)
	}

	loop()
})

Potentiometer

Reads the value of a potentiometer on pin analog 0.

var pinio = new (require('pinio')).Pinio()

pinio.on('ready', function(board) {
	var pot = board.pins('A0')
	pot.read(function(val) {
		console.log(val)
	})
})

PWM Writing

Outputs a value using pulse-width modulation.

var pinio = new (require('pinio')).Pinio()

pinio.on('ready', function(board) {
	var control = board.pins(2)
	control.pwm(200)
})

Encoder

Detecting motor speed with an encoder. This example uses two PWM digital motors along with two optical encoders. This is similar to code I use in a personal robot.

var pinio = new (require('pinio')).Pinio()

pinio.on('ready', function(board) {

	board.firmata.setMaxListeners(100)

	var movement = [0, 0]

	var encoders = [

		// Encoder 1
		[2, 3],

		// Encoder 2
		[11, 12]
	]

	function setupEncoder(pins, idx) {
		console.log('Setting up encoder:', idx, pins)
		var encodeA = board.pins(pins[0])
		var encodeB = board.pins(pins[1])

		function gotData(val) {
			movement[idx] += val
		}

		function startRead() {

			try {
				encodeA.mode('INPUT')
				encodeA.high()
				encodeB.mode('INPUT')
				encodeB.high()
			} catch(e) {
				console.log('Err ', e)
			}

			encodeA.read(gotData)
			encodeB.read(gotData)
		}
		startRead()
	}
	encoders.forEach(setupEncoder)

	setInterval(function() {
		console.log('Movement: ', movement)
	}, 300)
})

Board API

After initialization, the ready event will be fired with several board objects. A board object may create a pin wrapper with the following commands:

var myLed = board.pins(12)
var myGroup = board.pins(8, 9)

Pin API

Each pin group has shortcut methods.

  • pin.output() - Sets the pin to output mode
  • pin.high() - digital high
  • pin.low() - digital low
  • pin.pulse() - for things like IR sensors
  • pin.write() - analog signals