Programació de robots amb Javascript – Arduino – Makeblock



Programació de robots amb Javascript – Arduino – Makeblock

0 0


javascript-bots

Presentació sobre programació de robots amb Javascript

On Github acacha / javascript-bots

Programació de robots amb Javascript

Sergi Tur Badenas / @acacha1 Temes: Black - White (default) - League - Sky - Simple Moon

Per què Javascript?

  • Javascript rules the (web) world
  • Suportat per navegadors, tenim Node.js i frameworks i ECMAScript 6 i Apache Cordova (aplicacions mòbils híbrides)...
  • Programació Alt Nivell vs Baix Nivell+Embedded. Gràcies a Firmata
  • Per què no? ;-)

Robots?

  • No necessàriament només robots...
  • ... podem programar (gairebé) qualsevol plataforma Hardware...
  • ... microcontroladors (Particle, BeagleBone, Tessel, Spruino)...
  • ... i evidentment Arduino!...
  • ... benvinguts a l'Internet de les coses (IoT)!
  • Exemples

Internet Of Things

Exemples

Arduino

Arduino és una plataforma open-source per a la electrònica amb un hardware i software fàcil d'utilitzar:

Arduino boards

Un microcontrolador és un petit i simple computador.

  • Les plaques Arduino són els microcontroladors més coneguts.

  • Tenen un circuit programable integrat simple que permet detectar inputs (sensors) i generar outputs (activadors, leds, motors).
  • Arduino boards

Arduino IDE

Arduino downloads

$ sudo apt-get install gcc-avr avr-libc
$ cd && mkdir arduino && cd arduino
$ wget https://downloads.arduino.cc/arduino-1.6.6-linux64.tar.xz
$ sudo apt-get install xz-utils
$ tar xf arduino-1.6.6-linux64.tar.xz
$ cd arduino-1.6.6
$ sudo usermod -aG dialout
$ ./arduino

Programació en C

Hello world: Blink led!

// the setup function runs once when you press reset or power the board
void setup() {
	// initialize digital pin 13 as an output.
	pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
	digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
	delay(1000);              // wait for a second
	digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
	delay(1000);              // wait for a second
}

Makeblock

Hardware Open Source i electrònica fàcil https://www.makeblock.es/

Makeblock

Me Orion

Basada en Arduino Uno. Me orion

Makeblock

Easy Motor Wiring

Makeblock

Easy wiring

vs

Mbot

Mbot robot educacional!

Mcore

Mcore és la placa integrada al robot Mbot

Permet connexió USB o per bluetooth o Wifi (mochila wifi) amb mòduls intercanviables

Mòduls. Inventor Electrònic Kit

Kit de mòduls i sensors

Ultimate robot kit

Altres kits | Vídeo mDrawBot

Mblock

Mòdul per a Scratch. Programació per blocs

No està per Linux però funciona en Wine (tot i que no he aconseguit fer anar ports sèrie). Es pot copiar el codi a Arduino IDE i instal·lar

Altres plataformes / microcontroladors

Javascript & Internet of Things 101

Requeriments per poder programar la IoT amb Javascript:

Microcontroladors amb firmware de propòsit general (Firmata o similars). Executar Javascript des de fora navegadors: Node.js. També podem utilitzar Node.js des del navegador amb Browserify. Frameworks per facilitar la programació: Jhonny-five, nodebots, Cylon.js ... Connectar host amb microcontrolador via connexió sèrie. La comunicació sèrie pot ser a través d'un tethering, USB, WIFI/Bluetooth...

Node.js

Node.js

  • Node.js és un runtime Javascript (ECMAScript) que permet executar javascript fora dels navegadors.
  • Aplicacions servidor, aplicacions stand-alone, Javascript everywhere!.
  • Utilitza Chrome's V8 JavaScript engine.
  • Event-driven, non-blocking I/O model lleuger i eficient.
  • Sistema de paquets npm npm, sistema de codi obert open source més gran del món.
  • Node.js a acacha.org.

Node.js

Instal·lació

$ cd
$ wget https://nodejs.org/dist/v4.4.4/node-v4.4.4-linux-x64.tar.xz
$ tar xvzf node-v4.4.4-linux-x64.tar.gz
$ editor .bashrc
export PATH=~/node-v4.4.4-linux-x64/bin:${PATH}
$ bash
$ which npm
/home/sergi/node-v4.4.4-linux-x64/bin/npm
$ which node
/home/sergi/node-v4.4.4-linux-x64/bin/node
$ npm -v
2.14.7
$ node -v
v4.4.4

Node.js

Instal·lació i ús de llibreries/mòduls

$ npm install cylon cylon-firmata
var Cylon = require('cylon');

Cylon.robot({
	connections: {
	arduino: { adaptor: 'firmata', port: '/dev/ttyACM0' }
},

devices: {
	led: { driver: 'led', pin: 13 }
},

work: function(my) {
	every((1).second(), my.led.toggle);
}
}).start();

Connexió sèrie

  • Suport per Javascript/Node.js/npm: node-serialport
  • Tots els frameworks Javascript de robòtica suporten comunicació sèrie
  • Driver Linux instal·lar de sèrie (cal instal·lar en Windows)
  • Tethering. Es pot serialitzar qualsevol connexió USB, WIFI, Bluetooth, Ethernet -> Internet Of Things.
  • Instruccions bluetooth a acacha.org
/dev/ttyS0 -> serial normal
/dev/ttyUSB0 -> Serial USB. Bluetooth emparellar amb:
$ sudo apt-get install blueman
$ blueman-manager
/dev/rfcomm0 -> Serial Bluetooth

Firmata

Firmware multipropòsit que permet executar software al microcontrolador des de fora del microcontrolador. No cal actualitzar/instal·lar firmware al microcontrolador per cada programa que fem.

Firmata

Protocol utilitzat per accedir a microcontroladors executant codi des d'un ordinador.

El programa JavaScript s'executa al host machine utilitzant Node.js. El programa transmet operacions bàsiques de I/O al microcontrolador utilitzant el protocol Firmata a través d'una connexió sèrie.

Firmata converteix el microcontrolador en un thin client.

Firmata

Instal·lació a Arduino

El podem instal·lar desde la IDE d'Arduino

  • Sketch > Include Library > Manage Libraries
  • Busqueu Firmata i instal·leu Firmata by Firmata Developers
  • Instal·leu el fitxer .ino de Arduino IDE -> [File] -> [Examples] -> [Firmata] -> [StandardFirmata]
  • Oco! El Mbot té un firmata a mida, vegeu projecte mbot_nodebots

Firmata test

Programa per testejar protocol firmata i dispositius amb el firmware Firmata instal·lat. Firmata test

$ wget http://www.pjrc.com/teensy/firmata_test/firmata_test.64bit_2
$ sudo chmod +x firmata_test.64bit_2
$ ./firmata_test.64bit_2

Board preparada! Ara podem utilitzar Javascript per interactuar amb el microcontrolador. De fet podem utilitzar múltiples idiomes de programació com Python, Java, PHP vegeu Firmata client libraries.

Frameworks Javascript per a la programació de robots

Cylon.js

  • Github
  • Suporta un munt de plataformes no totes Open
  • Suport per a drones , robots sphero, leap motion, llums inteligent com Philips Hue

Johnny-five

Instal·lació:

JavaScript Robotics i IoT programming framework. Creat per Rick Waldron. Requeriments:

  • Instal·lar Node.js
  • Preparar la placa (Arduino) amb Firmata.
  • Instal·lar llibreria amb npm
$ npm install johnny-five

Johnny-five

Hello World:

Codi a github https://github.com/acacha/javascript-bots: blink_led_j5.js

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
	var led = new five.Led(13);
	led.blink(500);
});
Més exemples

Johnny-five

Execució hello World:

$ node blink_led_j5.js
1463669542289 Device(s) /dev/ttyUSB1
1463669542296 Connected /dev/ttyUSB1
1463669545805 Repl Initialized
  • Observeu que busca automàticament port USB, però podem indicar quin port volem utilitzar. Exemple bluetooth (executeu com a root!)
new five.Board({ port: "/dev/rfcomm0" });
$sudo node blink_led_j5_bt.js
1463669857246 Connected /dev/rfcomm0

Robot Mbot amb nodebots

Robot Mbot amb nodebots

  • Exemple per controlar els motors
  • asdasd
var five = require("johnny-five");

var max_speed_l = 255;
var max_speed_r = 255;

// set up the input
var stdin = process.openStdin();
require('tty').setRawMode(true);

var board = new five.Board({port: process.argv[2]});

var l_motor = r_motor = null;

board.on("ready", function(err) {
	if (err){
		console.log(err);
	return;
}

l_motor = new five.Motor({pins: {pwm: 6, dir: 7}});
r_motor = new five.Motor({pins: {pwm: 5, dir: 4}});

console.info("Board connected. Robot set up. LRUD to control");

});

stdin.on('keypress', function(chunk, key) {
	// process the keypresses
  if (key) {
    switch (key.name) {
      case "up":
        l_motor.reverse(max_speed_l);
        r_motor.forward(max_speed_r);
        break;
      case "down":
        r_motor.reverse(max_speed_r);
        l_motor.forward(max_speed_l);
        break;
      case "left":
        l_motor.forward(max_speed_l);
        r_motor.forward(max_speed_r);
        break;
      case "right":
        r_motor.reverse(max_speed_r);
        l_motor.reverse(max_speed_l);
      break;
      case "space":
        l_motor.stop();
        r_motor.stop();
        break;
}}});

Robot Mbot amb nodebots

Exemple amb bluetooth

$ sudo su
cd /home/sergi/Code/Mbot/mbot_nodebots/examples
nvm install v0.12.7
nvm list
v0.12.7
nvm use v0.12.7
node -v
v0.12.7
rfcomm connect 0 // Només si encara no teniu connectat el dispositiu per bluetooth. Potser ja l'heu connectat utilitzant les eines de Gnome per bluetooth o Blueman manager
node motors.js /dev/rfcomm0

Apache Cordova

Aplicacions híbrides amb mòbils

“Write once deploy everywhere!“
  • Permet convertir a natiu (Android/IOS/Windows Mobile...) codi Javascript. Suport multiplataforma.
  • Cal tenir en compte programació responsive i multidispositiu.
  • Es poden utilitzar funcionalitats natives com sensors (p. ex. Tilt).
  • Podeu crear aplicacions mòbils per a robots amb Javascript!.

Gamepad API

Read Eval Print Loop: REPL

  • Funcionalitat de sèrie amb node.js al executar: $ node
  • Proporciona una consola interactiva amb JavaScript útil per depurar, Tinkering, testing...
  • https://nodejs.org/api/repl.html
  • Amb Jhonny-five no utilitzem el de Node! Les instàncies board ja creen el seu propi REPL.
  • Similar a la consola dels navegadors Chrome Dev Tools/Firebug
  • Similar a Laravel: $php artisan tinker

Read Eval Print Loop: REPL

https://github.com/rwaldron/johnny-five/blob/master/docs/repl.md

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
	console.log("Ready event. Repl instance auto-initialized!");

	var led = new five.Led(13);
	led.on();

	this.repl.inject({
		// Allow limited on/off control access to the
		// Led instance from the REPL.
		on: function() {
		  led.on();
		},
		off: function() {
		  led.off();
		}
	});
});
>> on()  // will turn on the LED
// or
>> off() // will turn off the LED

Socket.io

  • Websockets: Activen comunicació bidireccional client-servidor en web
  • Permeten enviar esdeveniments push, del servidor web al navegador
  • Aplicacions real time com Chats, sense Polling
npm install express --save
$ npm install socket.io express --save
URL: http://localhost:3000

Socket.io

// server.js
var express = require('express');
var app = express();
var httpServer = require("http").createServer(app);
var five = require("johnny-five");
var io=require('socket.io')(httpServer);

var port = 3000;

app.use(express.static(__dirname + '/public'));

app.get('/', function(req, res) {
	res.sendFile(__dirname + '/public/index.html');
});

httpServer.listen(port);
console.log('Server available at http://localhost:' + port);
var led;

//Arduino board connection

var board = new five.Board();
	board.on("ready", function() {
	console.log('Arduino connected');
	led = new five.Led(13);
});

//Socket connection handler
io.on('connection', function (socket) {
	console.log(socket.id);

	socket.on('led:on', function (data) {
		led.on();
		console.log('LED ON RECEIVED');
	});

	socket.on('led:off', function (data) {
		led.off();
		console.log('LED OFF RECEIVED');
	});
});

console.log('Waiting for connection');

Socket.io

Al client (navegador/pàgina web o app standalone node.js) només cal executar:

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
var socket = io('http://localhost:3000');
socket.emit('led:on');
socket.emit('led:off');

Javascript Promises

Permeten treballar de forma asíncrona

/**
  * Go Forward
  */
var go = function(dir,time) {
	return new Promise( function resolve) {
	 //go code here
	});
	this.repl.inject({
	 go: go
	});
};

The end: RIP?

Programació de robots amb Javascript Sergi Tur Badenas / @acacha1 Temes: Black - White (default) - League - Sky - Simple Moon