On Github hybridgroup / cylon-preso-jsconf-2014
var Cylon = require('cylon');
Cylon.robot({
connection: { name: 'arduino', adaptor: 'firmata', port: '/dev/ttyACM0' },
device: { name: 'led', driver: 'led', pin: 13 },
work: function(my) {
every((1).second(), function(){ my.led.toggle() });
}
}).start();
var Cylon = require('cylon');
Cylon.robot({
connection: { name: 'tessel', adaptor: 'tessel', port: 'GPIO' },
device: { name: 'led', driver: 'led', pin: 3 },
work: function(my) {
every((1).second(), function(){ my.led.toggle() });
}
}).start();
var Cylon = require('cylon');
Cylon.robot({
connection: { name: 'beaglebone', adaptor: 'beaglebone' },
device: { name: 'led', driver: 'led', pin: 'P9_12' },
work: function(my) {
every((1).second(), function(){ my.led.toggle() });
}
}).start();
var Cylon = require('cylon');
Cylon.robot({
connections: [
{ name: 'leapmotion', adaptor: 'leapmotion', port: '127.0.0.1:6437' },
{ name: 'sphero', adaptor: 'sphero', port: '/dev/rfcomm0' }
],
devices: [
{ name: 'leapmotion', driver: 'leapmotion', connection: 'leapmotion' },
{ name: 'sphero', driver: 'sphero', connection: 'sphero' }
],
work: function(my) {
var y = 0;
var x = 0;
my.sphero.setBackLED(255)
my.leapmotion.on('hand', function(hand) {
y = hand.palmY.fromScale(50, 200).toScale(0, 90) | 0;
x = hand.palmX.fromScale(-30, 50).toScale(0, 90) | 0;
});
every((1).second(), function() {
my.sphero.setRGB(Math.floor(Math.random() * 16777216));
});
every((0.01).second(), function() {
if (x != 0) {
if (x > 45) {
my.sphero.roll(40, x.fromScale(45, 90).toScale(90, 180) | 0);
} else {
my.sphero.roll(40, x.fromScale(0, 45).toScale(270, 359) | 0);
}
} else {
if (y > 45) {
my.sphero.roll(40, y.fromScale(45, 90).toScale(0, 90) | 0);
} else {
my.sphero.roll(40, y.fromScale(0, 45).toScale(180, 270) | 0);
}
}
});
}
})
Cylon.start();
var Cylon = require('cylon');
var bots = [
{ port: '/dev/rfcomm0', name: 'Thelma' },
{ port: '/dev/rfcomm1', name: 'Louise' },
{ port: '/dev/rfcomm2', name: 'Grace' },
{ port: '/dev/rfcomm3', name: 'Ada' },
{ port: '/dev/rfcomm4', name: 'Mary' }
];
var Green = 0x00FF00;
var Red = 0xFF0000;
var ConwayRobot = (function() {
function ConwayRobot() {}
ConwayRobot.prototype.connection = { name: 'Sphero', adaptor: 'sphero' };
ConwayRobot.prototype.device = { name: 'sphero', driver: 'sphero' };
ConwayRobot.prototype.born = function() {
this.contacts = 0;
this.age = 0;
this.alive = true;
this.life();
this.move();
};
ConwayRobot.prototype.move = function() {
this.sphero.roll(60, Math.floor(Math.random() * 360));
};
ConwayRobot.prototype.life = function() {
this.alive = true;
this.sphero.setRGB(Green);
};
ConwayRobot.prototype.death = function() {
this.alive = false;
this.sphero.setRGB(Red);
this.sphero.stop();
};
ConwayRobot.prototype.enoughContacts = function() {
return (this.contacts > 2 && this.contacts < 7);
};
ConwayRobot.prototype.birthday = function() {
this.age += 1;
console.log("Happy birthday, " + this.name + ". You are " + this.age + " and had " + this.contacts + " contacts.");
if (this.enoughContacts()) {
if (this.alive == false) { this.rebirth(); }
} else {
this.death();
}
this.contacts = 0;
};
ConwayRobot.prototype.work = function(me) {
var self = this;
me.sphero.on('connect', function() {
me.sphero.detectCollisions();
me.born();
});
me.sphero.on('collision', function() {
self.contacts += 1;
});
every((3).seconds(), function() {
if (me.alive != false) { me.move(); }
});
every((10).seconds(), function() {
if (me.alive != false) {
me.birthday();
}
});
};
return ConwayRobot;
})();
for (var i = 0; i < bots.length; i++) {
var bot = bots[i];
var robot = new ConwayRobot;
robot.connection.port = bot.port;
robot.name = bot.name;
Cylon.robot(robot);
}
Cylon.api({host: '192.168.1.116', port: '8080', ssl: false});
Cylon.start();
var Cylon = require('cylon');
Cylon.robot({
connections: [
{name: 'opencv', adaptor: 'opencv'},
{name: 'dualshock3', adaptor: 'joystick', controller: 'dualshock3'},
{name: 'ardrone', adaptor: 'ardrone', port: '192.168.1.1'}
],
devices: [
{name: 'mat', driver: 'mat', conneciton: 'opencv' },
{name: 'window', driver: 'window', conneciton: 'opencv'},
{name: 'controller', driver: 'dualshock3', connection: 'dualshock3'},
{name: 'drone', driver: 'ardrone', connection: 'ardrone'}
],
validate_pitch: function(data, offset) {
var value;
value = Math.abs(data) / offset;
if (value >= 0.1) {
if (value <= 1.0) {
return Math.round(value * 100.0) / 100.0;
} else {
return 1.0;
}
} else {
return 0.0;
}
},
work: function(my) {
var self = this;
self.offset = 125.0;
self.right_stick = {
x: self.offset,
y: self.offset
};
self.left_stick = {
x: self.offset,
y: self.offset
};
my.drone.getPngStream().on('data', function(png) {
my.mat.readImage(png, function(err, img) {
my.window.show(img);
});
});
my.controller.on("square:press", function(data) {
my.drone.takeoff();
});
my.controller.on("triangle:press", function(data) {
my.drone.hover()
});
my.controller.on("x:press", function(data) {
my.drone.land()
});
my.controller.on("right:move", function(data) {
self.right_stick = data;
});
my.controller.on("left:move", function(data) {
self.left_stick = data;
});
every(0, function() {
var pair;
pair = self.left_stick;
if (pair.y < self.offset - 5) {
my.drone.front(my.validate_pitch(pair.y - self.offset, self.offset));
} else if (pair.y > self.offset + 5) {
my.drone.back(my.validate_pitch(pair.y - self.offset, self.offset));
}
if (pair.x > self.offset + 5) {
my.drone.right(my.validate_pitch(pair.x - self.offset, self.offset));
} else if (pair.x < self.offset - 5) {
my.drone.left(my.validate_pitch(pair.x - self.offset, self.offset));
}
});
every(0, function() {
var pair;
pair = self.right_stick;
if (pair.y < self.offset - 5) {
my.drone.up(my.validate_pitch(pair.y - self.offset, self.offset));
} else if (pair.y > self.offset + 5) {
my.drone.down(my.validate_pitch(pair.y - self.offset, self.offset));
}
if (pair.x > self.offset + 20) {
my.drone.clockwise(my.validate_pitch(pair.x - self.offset, self.offset));
} else if (pair.x < self.offset - 20) {
my.drone.counterClockwise(my.validate_pitch(pair.x - self.offset, self.offset));
}
});
every((0.1).seconds(), my.drone.hover);
}
});
Cylon.start();
var Cylon = require('cylon');
Cylon.robot({
connection:
{name: 'neurosky', adaptor: 'neurosky', port: '/dev/rfcomm0'},
device:
{name: 'headset', driver: 'neurosky'},
work: function(my) {
my.headset.on('eeg', function(data) {
Logger.info(data);
});
}
});
Cylon.start();
require 'artoo'
require 'http'
connection :pebble, :adaptor => :pebble
device :watch, :driver => :pebble, :name => 'pebble'
api :host => '0.0.0.0', :port => '8080'
name 'pebble'
def button_push(*data)
unless data[1].nil?
puts "Posting to Cylon"
HTTP[:content_type => 'application/json'].get "https://192.168.1.3:3000/robots/drone/commands/faceOff"
p "#{data[1]} button pushed"
end
end
work do
pebble.send_notification("Hello Pebble!")
on pebble, :button => :button_push
end
var Cylon = require('cylon');
var rest = require('restler');
var haarcascade = "" + __dirname + "/haarcascade_frontalface_alt.xml";
var DroneRobot = (function(){
function DroneRobot() {}
DroneRobot.prototype.commands = ["faceOff"];
DroneRobot.prototype.connections = [
{ name: 'opencv', adaptor: 'opencv' },
{ name: 'ardrone', adaptor: 'ardrone', port: '192.168.1.1' }
];
DroneRobot.prototype.devices = [
{ name: 'drone', driver: 'ardrone', connection: 'ardrone' },
{ name: 'window', driver: 'window', conneciton: 'opencv' },
{ name: 'mat', driver: 'mat', conneciton: 'opencv' }
];
DroneRobot.prototype.work = function(my) {
console.log("SHOW ME YOUR FACE!");
};
DroneRobot.prototype.faceOff = function() {
var my = this;
var self = this;
self.detect = false;
self.image = null;
my.drone.getPngStream().on('data', function(png) {
my.mat.readImage(png, function(err, img) {
self.image = img;
if (self.detect === false) {
my.window.show(img);
}
});
});
my.mat.on('facesDetected', function(err, im, faces) {
var biggest, center_x, f, face, turn;
biggest = 0;
face = null;
for (var i = 0; i < faces.length; i++) {
f = faces[i];
if (f.width > biggest) {
biggest = f.width;
face = f;
}
}
if (face !== null && (face.width <= 100 && face.width >= 45)) {
rest.get('http://192.168.1.1:3000/robots/digispark/devices/led/commands/ToggleC').on('complete', function(result) {
if (result instanceof Error) {
console.log('Error:', result.message);
}
});
rest.get('http://127.0.0.1:3001/robots/mod/commands/WakeUp').on('complete', function(result) {
if (result instanceof Error) {
console.log('Error:', result.message);
}
});
im.rectangle([face.x, face.y], [face.x + face.width, face.y + face.height],
[0, 255, 0], 2);
center_x = im.width() * 0.5;
turn = -(face.x - center_x) / center_x;
console.log("turning: " + turn);
if (turn < 0) {
my.drone.clockwise(Math.abs(turn * 0.7));
} else {
my.drone.counterClockwise(Math.abs(turn * 0.7));
}
} else {
rest.get('http://192.168.1.1:3000/robots/digispark/devices/led/commands/OffC').on('complete', function(result) {
if (result instanceof Error) {
console.log('Error:', result.message);
}
});
rest.get('http://127.0.0.1:3001/robots/mod/commands/Snooze').on('complete', function(result) {
if (result instanceof Error) {
console.log('Error:', result.message);
}
});
}
my.window.show(im);
});
my.drone.takeoff();
after((8).seconds(), function() { my.drone.up(0.5); });
after((10).seconds(), function() { my.drone.hover(); });
after((13).seconds(), function() {
self.detect = true;
every(0.3.seconds(), function() {
my.drone.hover();
my.mat.detectFaces(self.image, haarcascade);
});
after((30).seconds(), function() { my.drone.land(); });
});
};
return DroneRobot;
})();
var robot = new DroneRobot;
robot.name = "drone";
Cylon.robot(robot);
Cylon.api({ host: '192.168.1.3', port: '3000' });
Cylon.start();
package main
import (
"github.com/hybridgroup/gobot"
"github.com/hybridgroup/gobot-digispark"
"github.com/hybridgroup/gobot-gpio"
)
func main() {
master := gobot.GobotMaster()
gobot.Api(master)
digispark := new(gobotDigispark.DigisparkAdaptor)
digispark.Name = "digispark"
led := gobotGPIO.NewLed(digispark)
led.Name = "led"
led.Pin = "2"
master.Robots = append(master.Robots, &gobot.Robot{
Name: "digispark",
Connections: []gobot.Connection{digispark},
Devices: []gobot.Device{red},
})
master.Start()
}