Hardware programming with JavaScript

Andrey Kucherenko

Умный дом
Умная работа

Умное хобби

Умный дом

Интернет вещей (IoT)

  • Безопасность
  • Экономия
  • Удобство

Умная работа

  • Удобство
  • Информативность
  • Фан

 

Умное хобби

Железо

Arduino

Спецификация

Микроконтроллер: ATmega328

Рабочее напряжение: 5 В

Входное напряжение (рекомендуемое): 7-12 В

Входное напряжение (предельное): 6-20 В

Цифровые Входы/Выходы: 14

(6 из которых могут использоваться как выходы ШИМ)

Аналоговые входы: 6

Постоянный ток через вход/выход: 40 мА

Постоянный ток для вывода 3.3 ВЖ 50 мА

Флеш-память: 32 Кб (ATmega328) из которых 0.5 Кб используются для загрузчика

ОЗУ: 2 Кб (ATmega328)

EEPROM: 1 Кб (ATmega328)

Тактовая частота: 16 МГц

Наконец-то JavaScript

  • Johnny Five
  • Cylon.js
  • ...

Johnny-Five

Johnny-Five is an Open Source, Firmata Protocol based, IoT and Robotics programming framework

https://github.com/rwaldron/johnny-five

Johnny-Five



var five = require("johnny-five");
var myBoard, myLed;

myBoard = new five.Board();

myBoard.on("ready", function() {

  myLed = new five.Led(13);

  myLed.strobe( 1000 );

  // make myLED available as "led" in REPL

  this.repl.inject({
    led: myLed
  });

  /**
   * try "on", "off", "toggle", 
   * "strobe", "stop" (stops strobing)
   */
});

Cylon.js

JavaScript Robotics, By Your Command. Next generation robotics framework with support for 35 different platforms

Cylon.js


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();

Raspberry Pi

Спецификация

  • GPIO: 40 пинов ;
  • USB-порты:  4 порта USB 2.0;
  • MicroSD: да.
  • Пониженное энергопотребление: разработчикам удалось снизить энергопотребление до величины 0,5-1Вт.
  • Звук: снижение уровня шумов, улучшение качества звука.
  • Улучшенный форм-фактор: разработчики сделали плату более рациональной и удобной для работы.
  • SoC Broadcom BCM2835 (CPU, GPU, DSP и SDRAM)
  • CPU: 700 МГц ARM1176JZF-S core (семейство ARM11)
  • GPU: Broadcom VideoCore IV, OpenGL ES 2.0, 1080p30 h.264/MPEG-4 AVC high-profile decoder
  • Память (SDRAM): 512 Мб
  • Видео выходы: HDMI
  • Аудио выходы: 3.5 мм джек, HDMI
  • разъем 10/100 Ethernet RJ45

JavaScript

  • Johnny-Five
  • Cylon.js
  • onoff
  • ...

Johnny-Five



var five = require("johnny-five");
var raspi = require('raspi-io');

var myBoard, myLed;

myBoard = new five.Board({io: new raspi()});

myBoard.on("ready", function() {

  myLed = new five.Led(13);

  myLed.strobe( 1000 );

  // make myLED available as "led" in REPL

  this.repl.inject({
    led: myLed
  });

  /**
   * try "on", "off", "toggle", 
   * "strobe", "stop" (stops strobing)
   */
});

Cylon.js


var Cylon = require('cylon');

Cylon.robot({
  connections: {
    arduino: { 
      adaptor: 'raspi' 
    }
  },

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

  work: function(my) {
    every((1).second(), my.led.toggle);
  }
}).start();
var Cylon = require('cylon');

Cylon.robot({
  connections: {
    edison: { adaptor: 'intel-iot' }
  },

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

  work: function(my) {
    every((1).second(), my.led.toggle);
  }
}).start();
var Cylon = require('cylon');
Cylon.robot({

    connections: {
        edison: {adaptor: 'intel-iot'},
        sphero: {adaptor: 'sphero', port: "/dev/rfcomm0"}
    },

    devices: {
        sphero: {driver: 'sphero', connection: 'sphero'}
    },

    work: function (my) {
        var color = process.argv[2] || 0xFF0000;

        my.sphero.color(color);
     
    }
});
Cylon.start();
var Cylon = require('cylon');

Cylon.robot({
  connections: {
    edison: { adaptor: 'intel-iot'},
    sphero: { adaptor: 'sphero', port: '/dev/rfcomm0' }
  },

  devices: {
    led: { driver: 'led', pin: 13, connection: 'edison' },
    sphero: { driver: 'sphero', connection: 'sphero' }
  },

  work: function(my) {
    my.sphero.stop();
    my.sphero.detectCollisions();
    my.sphero.on('collision', function() {
      my.led.toggle();
    });
  }
}).start();
var Cylon = require('cylon');

Cylon.robot({
  connections: {
    sphero: { adaptor: 'sphero', port: '/dev/rfcomm0' }
  },

  devices: {
    sphero: { driver: 'sphero' }
  },

  work: function(my) {
    var flag = true;
    var color = 0x00FF00,
        bitFilter = 0xFFFF00;

    console.log("Setting up Collision Detection...");

    my.sphero.on("collision", function() {
      console.log("Collision:");
      color = color ^ bitFilter;
      console.log("Color: " + (color.toString(16)) + " ");
      my.sphero.color(color);
    });

    my.sphero.detectCollisions();    

    every((2).second(), function () {
     my.sphero.roll(60, flag ? 190 : 10);
     flag = !flag;
    });
  }
}).start();

Parrot AR.Drone 2.0

Parrot Bebop

node-ar-drone

var arDrone = require('ar-drone');
var client  = arDrone.createClient();

client.takeoff();

client
  .after(5000, function() {
    this.clockwise(0.5);
  })
  .after(3000, function() {
    this.stop();
    this.land();
  });

node-ar-drone

var arDrone = require('ar-drone');
var client  = arDrone.createClient();
client.createRepl();


$ node repl.js
// Make the drone takeoff
drone> takeoff()
true
// Wait for the drone to takeoff
drone> clockwise(0.5)
0.5
// Let the drone spin for a while
drone> land()
true
// Wait for the drone to land

node-bebop

var bebop = require('node-bebop');

var drone = bebop.createClient();

drone.connect(function() {
  drone.takeOff();

  setTimeout(function() {
    drone.land();
  }, 5000);
});

Спасибо

Вопросы?