From 0ebdd4fc7d9b8b0e665ccbfa5effcf314ae3796f Mon Sep 17 00:00:00 2001 From: Edgar O Silva Date: Tue, 26 Nov 2013 12:38:29 -0600 Subject: [PATCH 01/11] Updated digital pin and added pwm raspi example. --- examples/raspi_led_brightness.coffee | 20 +++++++++++ src/digital-pin.coffee | 50 +++++++++++++++------------- 2 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 examples/raspi_led_brightness.coffee diff --git a/examples/raspi_led_brightness.coffee b/examples/raspi_led_brightness.coffee new file mode 100644 index 0000000..1b25e77 --- /dev/null +++ b/examples/raspi_led_brightness.coffee @@ -0,0 +1,20 @@ +Cylon = require('..') + +# Initialize the robot +Cylon.robot + connection: + name: 'raspi', adaptor: 'raspi', port: '/dev/ttyACM0' + + device: + name: 'led', driver: 'led', pin: 11 + + work: (my) -> + # we do our thing here + brightness = 0 + fade = 5 + every 0.05.seconds(), -> + brightness += fade + my.led.brightness(brightness) + fade = -fade if (brightness is 0) or (brightness is 255) + +.start() diff --git a/src/digital-pin.coffee b/src/digital-pin.coffee index 7f7210c..9b144b3 100644 --- a/src/digital-pin.coffee +++ b/src/digital-pin.coffee @@ -34,29 +34,29 @@ namespace 'Cylon.IO', -> @mode ?= mode # Check if the pin acceess file is already in the GPIO folder - FS.exists @_pinPath(), (exists) => + FS.exists(@_pinPath(), (exists) => if exists then @_openPin() else @_createGPIOPin() + ) close: -> - FS.writeFile @_unexportPath(), "#{ @pinNum }", (err) => + FS.writeFile(@_unexportPath(), "#{ @pinNum }", (err) => @_closeCallback() + ) closeSync: -> - FS.writeFileSync @_unexportPath(), "#{ @pinNum }" + FS.writeFileSync(@_unexportPath(), "#{ @pinNum }") @_closeCallback false digitalWrite: (value) -> @_setMode('w') unless @mode is 'w' @status = if value is 1 then 'high' else 'low' - FS.writeFile @_valuePath(), value, (err) => + FS.writeFile(@_valuePath(), value, (err) => if err - @emit( - 'error', - "Error occurred while writing value #{value} to pin #{@pinNum}" - ) + @emit('error', "Error occurred while writing value #{value} to pin #{@pinNum}") else - @emit 'digitalWrite', value + @emit('digitalWrite', value) + ) # Reads the pin input every interval amount of time: # params: @@ -65,14 +65,15 @@ namespace 'Cylon.IO', -> @_setMode('r') unless @mode is 'r' readData = null - setInterval => - FS.readFile @_valuePath(), (err, data) => + setInterval(() => + FS.readFile(@_valuePath(), (err, data) => if err - @emit 'error', "Error occurred while reading from pin #{ @pinNum }" + @emit('error', "Error occurred while reading from pin #{ @pinNum }") else readData = data - @emit 'digitalRead', data - , interval + @emit('digitalRead', data) + ) + , interval) setHigh: -> @digitalWrite 1 @@ -85,35 +86,38 @@ namespace 'Cylon.IO', -> # Creates the GPIO file to read/write from _createGPIOPin: () -> - FS.writeFile @_exportPath(), "#{ @pinNum }", (err) => + FS.writeFile(@_exportPath(), "#{ @pinNum }", (err) => if err - @emit 'error', 'Error while creating pin files' + @emit('error', 'Error while creating pin files') else @_openPin() + ) _openPin: () -> - @_setMode @mode, true - @emit 'open' + @_setMode(@mode, true) + @emit('open') _closeCallback: (err) -> if err - @emit 'error', 'Error while closing pin files' + @emit('error', 'Error while closing pin files') else - @emit 'close', @pinNum + @emit('close', @pinNum) # Sets the mode for the GPIO pin by writing the correct values to the pin reference files _setMode: (mode, emitConnect = false) -> @mode = mode if mode is 'w' - FS.writeFile @_directionPath(), GPIO_DIRECTION_WRITE, (err) => + FS.writeFile(@_directionPath(), GPIO_DIRECTION_WRITE, (err) => @_setModeCallback err, emitConnect + ) else if mode is 'r' - FS.writeFile @_directionPath(), GPIO_DIRECTION_READ, (err) => + FS.writeFile(@_directionPath(), GPIO_DIRECTION_READ, (err) => @_setModeCallback err, emitConnect + ) _setModeCallback: (err, emitConnect) -> if err - @emit 'error', "Setting up pin direction failed" + @emit('error', "Setting up pin direction failed") else @ready = true @emit('connect', @mode) if emitConnect From e13e923e8cc6c8fe576f38b281d35e279faccfbd Mon Sep 17 00:00:00 2001 From: Edgar O Silva Date: Tue, 26 Nov 2013 12:51:11 -0600 Subject: [PATCH 02/11] Fixes err param not being passed. --- dist/digital-pin.js | 2 +- src/digital-pin.coffee | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/digital-pin.js b/dist/digital-pin.js index 3f64871..d44ac16 100644 --- a/dist/digital-pin.js +++ b/dist/digital-pin.js @@ -62,7 +62,7 @@ DigitalPin.prototype.close = function() { var _this = this; return FS.writeFile(this._unexportPath(), "" + this.pinNum, function(err) { - return _this._closeCallback(); + return _this._closeCallback(err); }); }; diff --git a/src/digital-pin.coffee b/src/digital-pin.coffee index 9b144b3..6226dfc 100644 --- a/src/digital-pin.coffee +++ b/src/digital-pin.coffee @@ -40,7 +40,7 @@ namespace 'Cylon.IO', -> close: -> FS.writeFile(@_unexportPath(), "#{ @pinNum }", (err) => - @_closeCallback() + @_closeCallback(err) ) closeSync: -> @@ -108,11 +108,11 @@ namespace 'Cylon.IO', -> @mode = mode if mode is 'w' FS.writeFile(@_directionPath(), GPIO_DIRECTION_WRITE, (err) => - @_setModeCallback err, emitConnect + @_setModeCallback(err, emitConnect) ) else if mode is 'r' FS.writeFile(@_directionPath(), GPIO_DIRECTION_READ, (err) => - @_setModeCallback err, emitConnect + @_setModeCallback(err, emitConnect) ) _setModeCallback: (err, emitConnect) -> From 29f3e9c06d9c1812e814cade20994c92b4794a41 Mon Sep 17 00:00:00 2001 From: Edgar O Silva Date: Tue, 26 Nov 2013 15:35:49 -0600 Subject: [PATCH 03/11] Update digital pin close callback param. --- src/digital-pin.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/digital-pin.coffee b/src/digital-pin.coffee index 6226dfc..127b10d 100644 --- a/src/digital-pin.coffee +++ b/src/digital-pin.coffee @@ -45,7 +45,7 @@ namespace 'Cylon.IO', -> closeSync: -> FS.writeFileSync(@_unexportPath(), "#{ @pinNum }") - @_closeCallback false + @_closeCallback(false) digitalWrite: (value) -> @_setMode('w') unless @mode is 'w' From 0710bc0e9c95e7186e2245de87c7eb6ab93f36f6 Mon Sep 17 00:00:00 2001 From: deadprogram Date: Tue, 26 Nov 2013 17:58:59 -0800 Subject: [PATCH 04/11] Update to 0.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3be5d3b..06cca11 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cylon", - "version": "0.6.0", + "version": "0.6.1", "main": "dist/cylon.js", "description": "A JavaScript robotics framework using Node.js", "homepage": "http://cylonjs.com", From f6a2b246d2b303efed13de38816791cf1a48190e Mon Sep 17 00:00:00 2001 From: deadprogram Date: Tue, 26 Nov 2013 18:09:58 -0800 Subject: [PATCH 05/11] Add more supported devices to README --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 0e4d9c7..bd02f33 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,9 @@ Cylon.js has a extensible system for connecting to hardware devices. The followi - [Ardrone](http://ardrone2.parrot.com/) <==> [Adaptor/Drivers](https://github.com/hybridgroup/cylon-ardrone) - [Arduino](http://www.arduino.cc/) <==> [Adaptor](https://github.com/hybridgroup/cylon-firmata) +- [Crazyflie](http://www.bitcraze.se/) <==> [Adaptor/Driver](https://github.com/hybridgroup/cylon-crazyflie) - [Leap Motion](https://www.leapmotion.com/) <==> [Adaptor/Driver](https://github.com/hybridgroup/cylon-leapmotion) +- [Pebble](http://www.getpebble.com/) <==> [Adaptor/Driver](https://github.com/hybridgroup/cylon-pebble) - [Raspberry Pi](http://www.raspberrypi.org/) <==> [Adaptor](https://github.com/hybridgroup/cylon-raspi) - [Salesforce](http://www.force.com/) <==> [Adaptor/Driver](https://github.com/hybridgroup/cylon-force) - [Sphero](http://www.gosphero.com/) <==> [Adaptor/Driver](https://github.com/hybridgroup/cylon-sphero) @@ -86,11 +88,19 @@ Support for many devices that use General Purpose Input/Output (GPIO) have a shared set of drivers provded using the cylon-gpio module: - [GPIO](https://en.wikipedia.org/wiki/General_Purpose_Input/Output) <=> [Drivers](https://github.com/hybridgroup/cylon-gpio) + - Analog Sensor + - Button + - LED + - Motor + - Maxbotix Ultrasonic Range Finder + - Servo Support for devices that use Inter-Integrated Circuit (I2C) have a shared set of drivers provded using the cylon-i2c module: - [I2C](https://en.wikipedia.org/wiki/I%C2%B2C) <=> [Drivers](https://github.com/hybridgroup/cylon-i2c) + - BlinkM + - HMC6352 Digital Compass More platforms and drivers are coming soon... From e40289b3ea9d4e1a4520e05d1f6280fbe66a87af Mon Sep 17 00:00:00 2001 From: Edgar O Silva Date: Wed, 27 Nov 2013 11:42:25 -0600 Subject: [PATCH 06/11] Added servo example for Raspi. --- examples/raspi_servo.coffee | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 examples/raspi_servo.coffee diff --git a/examples/raspi_servo.coffee b/examples/raspi_servo.coffee new file mode 100644 index 0000000..266418c --- /dev/null +++ b/examples/raspi_servo.coffee @@ -0,0 +1,22 @@ +Cylon = require('..') + +# Initialize the robot +Cylon.robot + connection: + name: 'raspi', adaptor: 'raspi', port: '/dev/ttyACM0' + + device: + name: 'servo', driver: 'servo', pin: 11 + + work: (my) -> + # we do our thing here + work: (my) -> + angle = 0 + increment = 90 + every 1.seconds(), -> + angle += increment + my.servo.angle(angle) + console.log("Current Angle => #{ my.servo.currentAngle() }") + increment = -increment if (angle is 0) or (angle is 180) + +.start() From ad39fdaf8063f9776b02fc49c13d204595e9f930 Mon Sep 17 00:00:00 2001 From: Edgar O Silva Date: Wed, 27 Nov 2013 16:49:40 -0600 Subject: [PATCH 07/11] Debugging digitalPin read. --- dist/digital-pin.js | 8 ++++++-- src/digital-pin.coffee | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/dist/digital-pin.js b/dist/digital-pin.js index d44ac16..847fb97 100644 --- a/dist/digital-pin.js +++ b/dist/digital-pin.js @@ -77,13 +77,14 @@ this._setMode('w'); } this.status = value === 1 ? 'high' : 'low'; - return FS.writeFile(this._valuePath(), value, function(err) { + FS.writeFile(this._valuePath(), value, function(err) { if (err) { return _this.emit('error', "Error occurred while writing value " + value + " to pin " + _this.pinNum); } else { return _this.emit('digitalWrite', value); } }); + return value; }; DigitalPin.prototype.digitalRead = function(interval) { @@ -93,16 +94,19 @@ this._setMode('r'); } readData = null; - return setInterval(function() { + setInterval(function() { return FS.readFile(_this._valuePath(), function(err, data) { if (err) { return _this.emit('error', "Error occurred while reading from pin " + _this.pinNum); } else { readData = data; + console.log("ReadData =======>"); + console.log(data); return _this.emit('digitalRead', data); } }); }, interval); + return true; }; DigitalPin.prototype.setHigh = function() { diff --git a/src/digital-pin.coffee b/src/digital-pin.coffee index 127b10d..32dda06 100644 --- a/src/digital-pin.coffee +++ b/src/digital-pin.coffee @@ -58,6 +58,8 @@ namespace 'Cylon.IO', -> @emit('digitalWrite', value) ) + value + # Reads the pin input every interval amount of time: # params: # interval: amount in miliseconds @@ -71,10 +73,14 @@ namespace 'Cylon.IO', -> @emit('error', "Error occurred while reading from pin #{ @pinNum }") else readData = data + console.log("ReadData =======>") + console.log(data) @emit('digitalRead', data) ) , interval) + true + setHigh: -> @digitalWrite 1 From 3ceda8f76e17114eecca09a7bba6ef6bd24310bf Mon Sep 17 00:00:00 2001 From: Edgar O Silva Date: Wed, 27 Nov 2013 17:13:59 -0600 Subject: [PATCH 08/11] DigitalRead buffer data converted to string now. --- dist/digital-pin.js | 4 +--- src/digital-pin.coffee | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/dist/digital-pin.js b/dist/digital-pin.js index 847fb97..4be45c0 100644 --- a/dist/digital-pin.js +++ b/dist/digital-pin.js @@ -99,9 +99,7 @@ if (err) { return _this.emit('error', "Error occurred while reading from pin " + _this.pinNum); } else { - readData = data; - console.log("ReadData =======>"); - console.log(data); + readData = data.toString(); return _this.emit('digitalRead', data); } }); diff --git a/src/digital-pin.coffee b/src/digital-pin.coffee index 32dda06..4cb18d7 100644 --- a/src/digital-pin.coffee +++ b/src/digital-pin.coffee @@ -72,9 +72,7 @@ namespace 'Cylon.IO', -> if err @emit('error', "Error occurred while reading from pin #{ @pinNum }") else - readData = data - console.log("ReadData =======>") - console.log(data) + readData = data.toString() @emit('digitalRead', data) ) , interval) From 402edc1a1e9e5a951499c2e2948d46bec5b5a355 Mon Sep 17 00:00:00 2001 From: Edgar O Silva Date: Wed, 27 Nov 2013 18:03:02 -0600 Subject: [PATCH 09/11] Update digital read to parseInt buffer response. --- dist/digital-pin.js | 4 ++-- src/digital-pin.coffee | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/digital-pin.js b/dist/digital-pin.js index 4be45c0..ce3b587 100644 --- a/dist/digital-pin.js +++ b/dist/digital-pin.js @@ -99,8 +99,8 @@ if (err) { return _this.emit('error', "Error occurred while reading from pin " + _this.pinNum); } else { - readData = data.toString(); - return _this.emit('digitalRead', data); + readData = parseInt(data.toString()); + return _this.emit('digitalRead', readData); } }); }, interval); diff --git a/src/digital-pin.coffee b/src/digital-pin.coffee index 4cb18d7..15126bb 100644 --- a/src/digital-pin.coffee +++ b/src/digital-pin.coffee @@ -72,8 +72,8 @@ namespace 'Cylon.IO', -> if err @emit('error', "Error occurred while reading from pin #{ @pinNum }") else - readData = data.toString() - @emit('digitalRead', data) + readData = parseInt(data.toString()) + @emit('digitalRead', readData) ) , interval) From 8f7e1d0193a656cbfd28ded3abcaacc574f86ac8 Mon Sep 17 00:00:00 2001 From: Edgar O Silva Date: Wed, 27 Nov 2013 18:23:17 -0600 Subject: [PATCH 10/11] Updated servo examples to use a limit range of motion instead of full 180. --- examples/raspi_servo.coffee | 6 +++--- examples/servo.coffee | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/raspi_servo.coffee b/examples/raspi_servo.coffee index 266418c..513bdae 100644 --- a/examples/raspi_servo.coffee +++ b/examples/raspi_servo.coffee @@ -11,12 +11,12 @@ Cylon.robot work: (my) -> # we do our thing here work: (my) -> - angle = 0 - increment = 90 + angle = 30 + increment = 40 every 1.seconds(), -> angle += increment my.servo.angle(angle) console.log("Current Angle => #{ my.servo.currentAngle() }") - increment = -increment if (angle is 0) or (angle is 180) + increment = -increment if (angle is 30) or (angle is 150) .start() diff --git a/examples/servo.coffee b/examples/servo.coffee index e31eeb3..6ec30fd 100644 --- a/examples/servo.coffee +++ b/examples/servo.coffee @@ -9,12 +9,12 @@ Cylon.robot name: 'servo', driver: 'servo', pin: 3 work: (my) -> - angle = 0 - increment = 90 + angle = 30 + increment = 40 every 1.seconds(), -> angle += increment my.servo.angle(angle) console.log("Current Angle => #{ my.servo.currentAngle() }") - increment = -increment if (angle is 0) or (angle is 180) + increment = -increment if (angle is 30) or (angle is 150) .start() From 671e39598437627287aef98edaa3b46a3e791e60 Mon Sep 17 00:00:00 2001 From: deadprogram Date: Wed, 27 Nov 2013 19:10:10 -0800 Subject: [PATCH 11/11] Crazyflies --- examples/crazyflie.coffee | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 examples/crazyflie.coffee diff --git a/examples/crazyflie.coffee b/examples/crazyflie.coffee new file mode 100644 index 0000000..c8d5b3f --- /dev/null +++ b/examples/crazyflie.coffee @@ -0,0 +1,19 @@ +Cylon = require '..' + +Cylon.robot + connection: + name: 'crazyflie', adaptor: 'crazyflie', port: "radio://1/10/250KPS" + + device: + name: 'drone', driver: 'crazyflie' + + work: (my) -> + #my.drone.setParam('flightmode.althold', true) + my.drone.on 'start', -> + my.drone.takeoff() + after 10.seconds(), -> + my.drone.land() + after 15.seconds(), -> + my.drone.stop() + +.start()