cylon

A JavaScript robotics framework for Node.js

Cylon.js is a JavaScript framework for robotics and physical computing built on top of Node.js.

It provides a simple, but powerful way to create solutions that incorporate multiple, different hardware devices concurrently.

Want to use Ruby on robots? Check out our sister project, Artoo.

Want to use Golang to power your robots? Check out our sister project, Gobot.

All you need to get started on a new robot is the cylon module:

npm install cylon

With the core module installed, now install the modules for whatever hardware support you need. For the Arduino + LED blink example, we'll need the firmata module:

npm install cylon-firmata

The below example connects to an Arduino over a serial connection, and blinks an LED once per second.

The example requires that the Arduino have the Firmata sketch installed; which can be obtained either through the Ardunio IDE or the gort arduino upload firmata command available in gort.

var Cylon = require('cylon');
 
// define the robot 
var robot = Cylon.robot({
  // change the port to the correct one for your Arduino 
  connections: {
    arduino: { adaptor: 'firmata', port: '/dev/ttyACM0' }
  },
 
  devices: {
    led: { driver: 'led', pin: 13 }
  },
 
  workfunction(my) {
    every((1).second(), my.led.toggle);
  }
});
 
// connect to the Arduino and start working 
robot.start();
var Cylon = require('cylon');
 
Cylon.robot({
  connections: {
    ardrone: { adaptor: 'ardrone', port: '192.168.1.1' }
  },
 
  devices: {
    drone: { driver: 'ardrone' }
  },
 
  workfunction(my) {
    my.drone.takeoff();
 
    after((10).seconds(), my.drone.land);
    after((15).seconds(), my.drone.stop);
  }
}).start();
var Cylon = require('cylon');
 
Cylon.robot({
  connections: {
    digispark: { adaptor: 'digispark' },
    leapmotion: { adaptor: 'leapmotion' }
  },
 
  devices: {
    servo1: { driver: 'servo', pin: 0, connection: 'digispark' },
    servo2: { driver: 'servo', pin: 1, connection: 'digispark' },
    leapmotion: { driver: 'leapmotion', connection: 'leapmotion' }
  },
 
  workfunction(my) {
    my.x = 90;
    my.= 90;
 
    my.leapmotion.on('hand', function(hand) {
      my.x = hand.palmX.fromScale(-300, 300).toScale(30, 150);
      my.= hand.palmZ.fromScale(-300, 300).toScale(30, 150);
    });
 
    every(100, function() {
      my.servo1.angle(my.x);
      my.servo2.angle(my.z);
 
      console.log(my.servo1.currentAngle() + "" + my.servo2.currentAngle());
    });
  }
}).start();

To use the API server, first install the plugin:

$ npm install cylon-api-http

Then it can be used in Cylon scripts:

var Cylon = require('cylon');
 
// tell the API server to listen for requests at 
// https://localhost:4000 
Cylon.api({ port: 4000 });
 
var bots = [
  { port: '/dev/rfcomm0', name: 'Thelma' },
  { port: '/dev/rfcomm1', name: 'Louise' }
];
 
bots.forEach(function(bot) {
  Cylon.robot({
    name: bot.name,
 
    connections: {
      sphero: { adaptor: "sphero", port: bot.port }
    },
 
    devices: {
      sphero: { driver: "sphero" }
    },
 
    workfunction(my) {
      every((1).second(), function() {
        console.log(my.name);
        my.sphero.setRandomColor();
        my.sphero.roll(60, Math.floor(Math.random() * 360));
      });
    }
  });
});
 
// start up all robots at once 
Cylon.start();

For those more familiar with jQuery, D3, or other fluent-style JavaScript libraries, Cylon.JS also supports a fluent syntax:

var Cylon = require('cylon');
 
Cylon
  .robot()
  .connection('arduino', { adaptor: 'firmata', port: '/dev/ttyACM0' })
  .device('led', { driver: 'led', pin: 13 })
  .on('ready', function(bot) {
    setInterval(function() {
      bot.led.toggle();
    }, 1000);
  });
 
Cylon.start();

Cylon.js has an extensible syntax for connecting to multiple, different hardware devices. The following 35 platforms are currently supported:

PlatformSupport
Ardronecylon-ardrone
Arduinocylon-firmata
Arduino YUNcylon-firmata
AT&T M2Xcylon-m2x
Audiocylon-audio
Beaglebone Blackcylon-beaglebone
Bluetooth LEcylon-ble
Crazyfliecylon-crazyflie
Digisparkcylon-digispark
Electric Impcylon-imp
Intel Edisoncylon-intel-iot
Intel Galileocylon-intel-iot
Intel IoT Analyticscylon-intel-iot-analytics
Joystickcylon-joystick
Keyboardcylon-keyboard
Leap Motioncylon-leapmotion
MiPcylon-mip
MQTTcylon-mqtt
Nestcylon-nest
Neuroskycylon-neurosky
Olliecylon-ollie
OpenCVcylon-opencv
Phillips Huecylon-hue
Pebblecylon-pebble
Pinocciocylon-pinoccio
PowerUp 3.0cylon-powerup
Rapirocylon-rapiro
Raspberry Picylon-raspi
Salesforcecylon-force
Skynetcylon-skynet
Sparkcylon-spark
Speechcylon-speech
Spherocylon-sphero
Tesselcylon-tessel
WICED Sensecylon-wiced-sense

Our implementation of GPIO (General Purpose Input/Output) allows for a shared set of drivers supporting a number of devices:

  • GPIO <=> Drivers
    • Analog Sensor
    • Button
    • Continuous Servo
    • Direct Pin
    • IR Rangefinder
    • LED
    • MakeyButton
    • Motor
    • Maxbotix Ultrasonic Range Finder
    • Servo

Additionally, we also support a number of I2C (Inter-Integrated Circuit) devices through a shared cylon-i2c module:

  • I2C <=> Drivers
    • BlinkM
    • BMP180
    • HMC6352 Digital Compass
    • LCD Display
    • MPL115A2 Barometer/Thermometer
    • MPU6050

We'll also have many more platforms and drivers coming soon, follow us on Twitter for updates.

Cylon.js can be run directly in-browser, using the browserify NPM module. You can also run it from withing a Chrome connected app, or a PhoneGap mobile app.

For more info on browser support, and for help with different configurations, you can find more info in our docs.

Cylon.js has support for different API plugins that can be used to interact with your robots remotely. At this time we have support for http and socket.io plugins with more comming in the near future.

To use it, install it alongside Cylon:

$ npm install cylon-api-http

Then, all you need to do is call Cylon#api in your robot's script:

var Cylon = require("cylon");
 
// For http 
Cylon.api('http');
 
// Or for Socket.io 
Cylon.api('socketio');
 

Then visit https://localhost:3000/ and you are ready to control your robots from a web browser!

You can check out more information on the Cylon API in the docs here.

Cylon uses the Gort http://gort.io Command Line Interface (CLI) so you can access important features right from the command line. We call it "RobotOps", aka "DevOps For Robotics". You can scan, connect, update device firmware, and more!

Cylon also has its own CLI to generate new robots, adaptors, and drivers. You can check it out at https://github.com/hybridgroup/cylon-cli.

We're busy adding documentation to our website, check it out at cylonjs.com/documentation.

If you want to help with documentation, you can find the code for our website at on the https://github.com/hybridgroup/cylon-site.

  • All patches must be provided under the Apache 2.0 License
  • Please use the -s option in git to "sign off" that the commit is your work and you are providing it under the Apache 2.0 License
  • Submit a Github Pull Request to the appropriate branch and ideally discuss the changes with us in IRC.
  • We will look at the patch, test it out, and give you feedback.
  • Avoid doing minor whitespace changes, renamings, etc. along with merged content. These will be done by the maintainers from time to time but they can complicate merges and should be done seperately.
  • Take care to maintain the existing coding style.
  • Add unit tests for any new or changed functionality & lint and test your code using make test and make lint.
  • All pull requests should be "fast forward"
    • If there are commits after yours use “git rebase -i <new_head_branch>”
    • If you have local changes you may need to use “git stash”
    • For git help see progit which is an awesome (and free) book on git
VersionNotes
0.22.1Remove lodash, misc. bug fixes
0.22.0API extraction, new devices syntax.
0.21.2Update Robeaux version
0.21.1Add back debug logging for starting/connecting devices/connections
0.21.0Remove Connection/Device objects, update Robot connection/device syntax, fluent syntax updates
0.20.2Correct API issues, possible issue with test setups
0.20.1Revert accidental scrict handling of param in driver initializer
0.20.0Browser support, new module loading, log level support, misc. development changes
0.19.1Correct issue with dynamic method proxying
0.19.0Fluent syntax, improved start/halt, various other updates
0.18.0Updates Robot and Driver commands structure
0.17.0Updates to API to match CPPP-IO spec
0.16.0New IO Utils, removal of Utils#bind, add Adaptor#_noop method.
0.15.1Fixed issue with the API on Tessel
0.15.0Better halting, cleaner startup, removed 'connect' and 'start' events, and misc other cleanups/refactors.
0.14.0Removal of node-namespace and misc. cleanup
0.13.3Fixes bug with disconnect functions not being called.
0.13.2Use pure Express, adds server-sent-events, upd API.
0.13.1Add API authentication and HTTPS support
0.13.0Set minimum Node version to 0.10.20, add utils to global namespace and improve initialization routines
0.12.0Extraction of CLI tooling
0.11.2bugfixes
0.11.0Refactor into pure JavaScript
0.10.4Add JS helper functions
0.10.3Fix dependency issue
0.10.2Create connections convenience vars, refactor config loading
0.10.1Updates required for test driven robotics, update Robeaux version, bugfixes
0.10.0Use Robeaux UX, add CLI commands for helping connect to devices, bugfixes
0.9.0Add AngularJS web interface to API, extensible commands for CLI
0.8.0Refactored Adaptor and Driver into proper base classes for easier authoring of new modules
0.7.0cylon command for generating new adaptors, support code for better GPIO support, literate examples
0.6.0API exposes robot commands, fixes issues in driver/adaptor init
0.5.0Improve API, add GPIO support for reuse in adaptors
0.4.0Refactor proxy in Cylon.Basestar, improve API
0.3.0Improved Cylon.Basestar, and added API
0.2.0Cylon.Basestar to help develop external adaptors/drivers
0.1.0Initial release for ongoing development

Copyright (c) 2013-2015 The Hybrid Group. Licensed under the Apache 2.0 license.