On Github acacha / javascript-bots
Sergi Tur Badenas / @acacha1 Temes: Black - White (default) - League - Sky - Simple Moon
Arduino és una plataforma open-source per a la electrònica amb un hardware i software fàcil d'utilitzar:
Un microcontrolador és un petit i simple computador.
$ 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
// 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 }
Hardware Open Source i electrònica fàcil https://www.makeblock.es/
Basada en Arduino Uno. Me orion
vs
Mbot robot educacional!
Mcore és la placa integrada al robot Mbot
Permet connexió USB o per bluetooth o Wifi (mochila wifi) amb mòduls intercanviables
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
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...$ 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
$ 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();
/dev/ttyS0 -> serial normal /dev/ttyUSB0 -> Serial USB. Bluetooth emparellar amb: $ sudo apt-get install blueman $ blueman-manager /dev/rfcomm0 -> Serial Bluetooth
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.
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.
El podem instal·lar desde la IDE d'Arduino
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.
JavaScript Robotics i IoT programming framework. Creat per Rick Waldron. Requeriments:
$ npm install johnny-five
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
$ node blink_led_j5.js 1463669542289 Device(s) /dev/ttyUSB1 1463669542296 Connected /dev/ttyUSB1 1463669545805 Repl Initialized
new five.Board({ port: "/dev/rfcomm0" }); $sudo node blink_led_j5_bt.js 1463669857246 Connected /dev/rfcomm0
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; }}});
$ 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
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
$ npm install socket.io express --save URL: http://localhost:3000
// 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');
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');
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 }); };