Javascript Robotics and Browser-based Arduino Control
by danasf in Circuits > Arduino
82114 Views, 120 Favorites, 0 Comments
Javascript Robotics and Browser-based Arduino Control
This is made easy with node.js, Firmata and Johnny-Five. Let's get started!
Johnny-Five logo by Mike Sgier. Arduino photo CC-BY Raeky.
Install Node.js
Download and install the node for your platform. Source and binaries are available for Windows, OS X and Linux.
http://nodejs.org/download/
If you're using Ubuntu/Debian, you can use apt-get install nodejs (not node). If you're using a distro's package manager, make sure your node version is recent!
node --version
v0.10.26
Install Johnny-five
Create a folder for your project and use Node's package manager, npm, to install johnny-five.
At the command line use npm install as follows:
npm install johnny-five
If you'd like to create a web interface you'll need socket.io too:
npm install socket.io
Upload Firmata to Your Arduino
- Download and open the Arduino IDE
- Go to File -> Examples -> Firmata -> StandardFirmata
- Upload Firmata to your Arduino board
Blink Sketch ... in Javascript
Create a file called ledtest.js with your favorite text editor. Connect your Arduino, copy the code below and run node ledtest.js at the command line. You should see a blinky LED!
var five = require("johnny-five"),board, led;
board = new five.Board();
board.on("ready", function() {
led = new five.Led(13);
led.strobe(1000); // on off every second
});
Troubleshooting:
Johnny-five will try to find your Arduino automatically. If this doesn't work you can specify a serial port in the Board constructor, like so:
LED c/o OpenClipartboard = new five.Board({ port: "/dev/tty.usbmodem1234" });
WebSockets
We're using socket.IO, a wrapper that makes using WebSockets very simple. It takes into account the differences between browsers, handles gnarly back-end tasks like disconnections, heartbeats and timeouts so we can focus on the fun stuff.
Socket.io provides example code, we can use it with a little modification to control our Arduino with johnny-five.
Socket.IO Usage
Emit an event called 'message'
Process an event called 'incoming' and print out the datasocket.emit('message', { hello: 'world' });
socket.on('incoming', function(data) {
console.log(data);
});
Create a Web Interface With Bootstrap
If you followed the previous steps you should be able to run node webtest.js at the command line, visit http://localhost/ to start controlling your Arduino!
Once you can understand this you're well on your way to advanced Browser-to-Arduino hacking and nodebots (the johnny-five repo is an excellent resource for example code)
An example: on the browser side, when you click on 'Set Delay' emit a socket event 'led'
$('#ledSet').on('click',function(){
// parse number from led delay value
var tmp = parseInt($('#ledDelay').val(),10);
// print out
console.log("Setting LED Delay:",tmp)
// send socket message of delay
socket.emit('led',{delay:tmp});
});
On the server side, your message is processed and the strobe value adjusted:
socket.on('led', function (data) {
console.log(data);
if(board.isReady){ led.strobe(data.delay); }
});
Downloads
Additional Resources
- NodeBots - Javascript robots. Hardware hacking meetups around the world!
- Arduino Experimenter's guide for Node.js
- The Rise of JS Robotics
- NodeCopter
- Sumobot Jr
- Johnny-Five on github
- Node-SerialPort
- Bonescript - JS control of GPIO for BeagleBone