yapcduino
Version:
Yet another nodejs library for pcduino (extends jheising's node.pcduino but provide simple API and some extra function).
234 lines (185 loc) • 5.93 kB
Markdown
# yapcduino.js
Yet another nodejs library for pcduino built for modern nodejs and provide more arduino functions and wrapper.
Yapcduino should work in Node.js 0.10 and 0.12 as well as io.js.
## Install
```bash
npm install yapcduino --save
```
## Usage
### Basic Features
```javascript
var p = require('yapcduino');
p.pinMode(10, p.INPUT); // Set pin #10 to input
p.pinMode(10, p.INPUT_PULLUP); // Set pin #10 to input with pull-up
var ret = p.digitalRead(10);
```
```javascript
p.pinMode(0, p.OUTPUT);
p.digitalWrite(0, p.HIGH);
p.digitalWrite(0, p.LOW);
```
```javascript
// Note: only 3, 5, 6, 9, 10, and 11 are PWM pins
p.analogWrite(3, 16);
var ret = p.analogRead(3);
```
### Global Mode
Sometimes it's silly to write all this functions with a prefix.
Since yapcduino@0.9.0, we have introduced global mode.
```javascript
require('yapcduino')({global: true});
pinMode(0, OUTPUT);
digitalWrite(0, HIGH);
```
### Arduino Binding
The following functions are provided using Node.js's Nan binding.
And can be called like `pcduino.pinMode(0, pcduino.OUTPUT)`
```c
void pinMode(uint8_t, uint8_t);
void digitalWrite(uint8_t, uint8_t);
int digitalRead(uint8_t);
int analogRead(uint8_t);
/*
* only pin (3/5/6/9/10/11) can be used as analog
*/
void analogReference(uint8_t mode);
void analogWrite(uint8_t, int);
/*
* pin(3/9/10/11) support frequency[125-2000]Hz @different dutycycle
* pin(5/6) support frequency[195,260,390,520,781] @256 dutycycle
*/
int pwmfreq_set(uint8_t pin, unsigned int freq);
unsigned long millis(void);
unsigned long micros(void);
void delay(unsigned long);
void delayMicroseconds(unsigned int us);
void delaySched(unsigned long);
void delayMicrosecondsSched(unsigned int us);
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
```
### Constants
```
HIGH: 0x1,
LOW: 0x0,
INPUT: 0x0,
OUTPUT: 0x1,
INPUT_PULLUP: 0x2,
LSBFIRST: 0,
MSBFIRST: 1,
CHANGE: 1,
FALLING: 2,
RISING: 3
```
### Servo
```javascript
require('yapcduino')({global: true});
var s = new Servo(3, {type: 'SG90'}); // available types: ['SG90']
for(var i = 1; i <= 180; i += 5) {
Native.delay(100);
console.log(i);
s.write(i);
}
s.stop();
```
#### jsdoc
```javascript
/**
* Construct a Servo object
*
* Note: pin(3/9/10/11) support frequency[125-2000]Hz @different dutycycle
* pin(5/6) support frequency[195,260,390,520,781] @256 dutycycle
*
* @param {Int} pin - pwm pin to use (only 3, 5, 6, 9, 10, and 11)
* @param {Object} options - Options for servo
* @param {String} options.type - Type of your servo, available types: ['default', 'SG90']
* @param {Int} options.minPWM - PWM Value for angle 0, optional if options.type defined
* @param {Int} options.maxPWM - PWM Value for angle max, optional if options.type defined
* @param {Int} options.maxAngle - Max angle to reach, defaults 180, optional if options.type defined
* @param {Int} options.frequency - Frequency, defaults to 390, optional if options.type defined
*/
function Servo(pin, options) {}
/**
* Set angle to given angle
*
* @param {Int} angle - Angle in degree
*/
Servo.prototype.write = function(angle) {}
/**
* Return current angle
*/
Servo.prototype.read = function() {}
/**
* Stop Servo
*/
Servo.prototype.stop = function() {}
```
### SoftPWM (Powered by pthread)
Use your GPIO pin to fake PWM pin using CPU.
**Improtant**: SoftPWM may not be stable enough for your **servo**, which expects a pulse over a very tight range. Use SoftPWM in servo may cause positions jumps.
```javascript
var pin = 0;
var pwm = new SoftPWM(pin);
var dutyCycle = 0.5;
pwm.write(dutyCycle, {frequency: 980, loops: Infinity}); // run the PWM forever
// everything done? stop and unset this.pin
// Note: after detach, you have to attach(pin) before call write or read
pwm.detach();
```
```javascript
var pin = 0;
var pwm = new SoftPWM(pin);
var dutyCycle = 0.5;
var us = 20 * 1000; // 500HZ
pwm.write(dutyCycle, {period: us, loops: 1000});
// Get count of loops of the pin since last write (useful for stepping motor)
var count = pwm.getLoopCount();
```
#### jsdoc
```javascript
function SoftPWM(pin) {}
/**
* Attach the SoftPWM instance to a new pin
*
*/
SoftPWM.prototype.attach = function(pin) {}
/**
* Detach the SoftPWM instance from original pin (will unset output of original pin and set this.pin to null)
*
*/
SoftPWM.prototype.detach = function() {}
/**
* Get count of loops of the pin since last write
*
*/
SoftPWM.prototype.getLoopCount = function() {}
/**
* Writes a PWM wave to a p in (using digitalWrite).
* To stop, simply call pwm.write(0)
*
* @see http://www.arduino.cc/en/Tutorial/PWM
* @see http://www.arduino.cc/en/Reference/analogWrite
* @param {Float} dutyCycle - Duty Cycle [0, 1]
* @param {Object} options - Options for PWM
* @param {Int} options.period - Period (in us), defaults to 20 * 1000
* @param {Int} options.frequency - Frequency, period will be ignored if frequency set
* @param {Number} options.loops - (loops to live) How many loops should it run, defaults to Infinity (actually is 2147483647), note that -1 will be converted to 2147483647
* @param {Bool} options.sync - Whether to run it in sync mode, defaults to false
*/
SoftPWM.prototype.write = function(dutyCycle, options) {}
/**
* Read last set dutyCycle (will return undefined if not set)
*
*/
SoftPWM.prototype.read = function() {}
```
## Source
The src/arduino comes from https://github.com/pcduino/c_environment
## Authors
- Zeno Zeng \<zenoofzeng@gmail.com\>
- Senorsen \<sen@senorsen.com\>
## Changelog
See: https://github.com/zenozeng/yapcduino.js/releases
## Links
- [How can I kill a particular thread of a process?](http://unix.stackexchange.com/questions/1066/how-can-i-kill-a-particular-thread-of-a-process)