@BrianGenisio
"Using JavaScript for hardware sounds like a really bad idea" -- Coworker
"Using a dynamic language for hardware just sounds dangerous" -- Coworker
What can we do with Johnny-Five?
var five = require("johnny-five"),
board = new five.Board()
board.on("ready", function() {
var rightWheel = new five.Servo({pin: 11, type: "continuous"});
var leftWheel = new five.Servo({pin: 7, type: "continuous"});
rightWheel.cw();
leftWheel.ccw();
setTimeout(function() {
rightWheel.ccw();
leftWheel.cw();
}, 1000);
setTimeout(function() {
rightWheel.stop();
leftWheel.stop();
}, 2000);
});
module.exports = Car;
function Car(five, rightPin, leftPin) {
this.rightWheel = new five.Servo({pin: rightPin, type: "continuous"});
this.leftWheel = new five.Servo({pin: leftPin, type: "continuous"});
}
Car.prototype.forward = function() {
this.rightWheel.cw();
this.leftWheel.ccw();
};
Car.prototype.reverse = function() {
this.rightWheel.ccw();
this.leftWheel.cw();
};
Car.prototype.right = function() {
this.rightWheel.ccw();
this.leftWheel.ccw();
};
Car.prototype.left = function() {
this.rightWheel.cw();
this.leftWheel.cw();
};
Car.prototype.stop = function() {
this.rightWheel.stop();
this.leftWheel.stop();
};
var five = require("johnny-five"),
Car = require("./car"),
board = new five.Board(),
stdin = process.openStdin();
require('tty').setRawMode(true);
board.on("ready", function() {
var car = new Car(five, 11, 7);
var keyMap = {
up: "forward",
down: "reverse",
left: "left",
right: "right",
space: "stop"
};
stdin.on('keypress', function (chunk, key) {
if(keyMap[key.name]) {
car[keyMap[key.name]]();
}
});
});
var five = require("johnny-five"),
Car = require("./car"),
board = new five.Board();
board.on("ready", function() {
var car = new Car(five, 11, 7);
var eyes = new five.IR.Reflect.Array({
emitter: 13,
pins: ["A0", "A1", "A2", "A3", "A4", "A5"],
autoCalibrate: true
});
eyes
.enable()
.on("line", function(err, line) {
if (line < 1000) {
car.left();
} else if (line > 4000) {
car.right();
} else {
car.forward();
}
});
});
module.exports = OmniBot;
function OmniBot(five) {
var configs = five.Motor.SHIELD_CONFIGS.ADAFRUIT_V1;
this.m1 = new five.Motor(configs.M1);
this.m2 = new five.Motor(configs.M2);
this.m3 = new five.Motor(configs.M3);
}
OmniBot.prototype.moveAngle = function(angle, magnitude) {
var components = getComponents(angle, magnitude);
this.move(components.vx, components.vy);
};
OmniBot.prototype.move = function(vx, vy) {
var wheels = getVectors(vx, vy);
moveWheel(this.m1, wheels.w1);
moveWheel(this.m2, wheels.w2);
moveWheel(this.m3, wheels.w3);
};
OmniBot.prototype.stop = function() {
this.m1.stop();
this.m2.stop();
this.m3.stop();
};
function getComponents(angle, magnitude) {
var vx = Math.cos(angle) * magnitude;
var vy = Math.sin(angle) * magnitude;
return {
vx: vx,
vy: vy
}
}
function getVectors(vx, vy) {
var c = Math.sqrt(3/2);
return {
w1: -vx,
w2: 0.5 * vx - c * vy,
w3: 0.5 * vx + c * vy
}
}
function moveWheel(motor, magnitude) {
var minValue = 0;
if(magnitude < 0 ) {
motor.rev(Math.abs(magnitude) + minValue);
} else {
motor.fwd(magnitude + minValue);
}
}
var five = require("johnny-five"),
board = new five.Board(),
OmniBot = require("./omni-bot"),
stdin = process.openStdin();
require('tty').setRawMode(true);
board.on("ready", function() {
var bot = new OmniBot(five, "M1", "M2", "M3");
var keyMap = {
up: {angle: 0, mag: 255},
down: {angle: 180, mag: 255},
left: {angle: 270, mag: 255},
right: {angle: 90, mag: 255},
space: {angle: 0, mag: 0},
};
stdin.on('keypress', function (chunk, key) {
if(keyMap[key.name]) {
var command = keyMap[key.name];
bot.moveAngle(command.angle, command.mag);
}
});
});
var five = require("johnny-five"),
board = new five.Board()
board.on("ready", function() {
var led = five.Led(13);
// led.on();
// led.off();
// led.brightness(100);
// led.strobe();
// led.pulse();
// led.stop();
this.repl.inject({
led: led
});
});
var five = require("johnny-five"),
board = new five.Board()
board.on("ready", function() {
var rgb = new five.Led.RGB({
pins: [9, 10, 11],
isAnode: true
});
// rgb.color("#FF0000"); // red
// rgb.color("#00FF00"); // green
// rgb.color("#0000FF"); // blue
// rgb.color("#FF00FF"); // purple
// rgb.off();
// rgb.strobe();
// rgb.stop();
this.repl.inject({
rgb: rgb
});
});
var five = require("johnny-five"),
songs = require("j5-songs"),
board = new five.Board();
board.on("ready", function() {
var piezo = new five.Piezo(8);
//piezo.tone(440, 500);
//piezo.play({
// song: "C D F D A - A A A A G G G G - - C D F D G - G G G G F F F F - -",
// beats: 1 / 4,
// tempo: 100
//});
//piezo.play(songs.load('mario-intro'));
piezo.play(songs.load('starwars-theme'));
this.repl.inject({
piezo: piezo
});
});
var five = require("johnny-five");
var Spark = require("spark-io");
var board = new five.Board({
io: new Spark({
token: "API_TOKEN",
deviceId: "DEVICE_ID"
})
});
board.on("ready", function() {
var led = new five.Led("D7");
var motion = new five.Motion("D6");
motion.on("motionstart", function() {
led.on();
});
motion.on("motionend", function() {
led.off();
});
});