Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Node.js Berlin March '18 - Hardware Hacking for Web Developers

Node.js Berlin March '18 - Hardware Hacking for Web Developers

Slides for my talk at the Node.js Berlin meetup in March 2018

0722ad084c65f6177d80cf793cfbd013?s=128

Dominik Kundel

March 13, 2018
Tweet

Transcript

  1. Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs

  2. How many of you have a Microcontroller? Dominik Kundel |

    @dkundel | Photo by Felipe Faria on Unsplash
  3. Did you use it? Dominik Kundel | @dkundel | Photo

    by Igor Ovsyannykov on Unsplash
  4. Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs

  5. Hi! I'm Dominik Kundel! Developer Evangelist at ! @dkundel "

    dkundel@twilio.com # github/dkundel Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  6. I ! JavaScript Photo by Thomas William & Thomas Kvistholt

    on Unsplash
  7. Hardware Dominik Kundel | @dkundel | Photo by Felipe Faria

    on Unsplash
  8. The destiny of Hardware Dominik Kundel | @dkundel | Photo

    by Igor Ovsyannykov on Unsplash
  9. Simple LED demos Dominik Kundel | @dkundel | #nodejsberlin #nodebots

    #porgjs #coffeejs
  10. It's not easy... Dominik Kundel | @dkundel | Photo by

    Nicolas Thomas on Unsplash
  11. ! Preparation Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs

    #coffeejs
  12. ! Costly ! Dominik Kundel | @dkundel | #nodejsberlin #nodebots

    #porgjs #coffeejs
  13. ! ⌘ + Z / Ctrl+Z Dominik Kundel | @dkundel

    | #nodejsberlin #nodebots #porgjs #coffeejs
  14. ! Rewarding " Dominik Kundel | @dkundel | #nodejsberlin #nodebots

    #porgjs #coffeejs
  15. C/C ++ Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs

    #coffeejs
  16. ! C/C ++ " Dominik Kundel | @dkundel | #nodejsberlin

    #nodebots #porgjs #coffeejs
  17. Three ways to combine JavaScript & Hardware Dominik Kundel |

    @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  18. APIs & Protocols JavaScript ➡ API ➡ C/C++ ➡ Hardware

    Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  19. APIs & Protocols Option 1: Particle Cloud API Dominik Kundel

    | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  20. What is a Particle? ! particle.io Dominik Kundel | @dkundel

    | #nodejsberlin #nodebots #porgjs #coffeejs
  21. Particle Cloud API Example curl https: //api.particle.io/v1/devices/0123456789abcdef/brew \ -d access_token=123412341234

    \ -d "args=coffee" void setup() { // register the cloud function Particle.function("brew", brewCoffee); } int brewCoffee(String command) { if(command == "coffee") { return 1; } else return -1; } Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  22. APIs & Protocols Option 2 MQTT Lightweight machine-to-machine publish/subscribe messaging

    protocol Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  23. Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs

  24. MQTT ! No need for IP Address of a device

    " ⚖ Scales to multiple devices ✅ Cross-platform / Cross-language Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  25. MQTT Example in JS var mqtt = require('mqtt'); var client

    = mqtt.connect('mqtt: //test.mosquitto.org'); client.on('connect', function() { client.subscribe('presence'); client.publish('presence', 'Hello mqtt'); }); client.on('message', function(topic, message) { // message is Buffer console.log(message.toString()); client.end(); }); Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  26. MQTT Example in C ++ #include <SPI.h> #include <Ethernet.h> #include

    <PubSubClient.h> // Update these with values suitable for your network. byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; IPAddress ip(172, 16, 0, 100); IPAddress server(172, 16, 0, 2); void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i=0;i<length;i ++) { Serial.print((char)payload[i]); } Serial.println(); } EthernetClient ethClient; PubSubClient mqttClient(ethClient); void reconnect() { // Loop until we're reconnected while (!mqttClient.connected()) { Serial.print("Attempting MQTT connection ..."); // Attempt to connect if (mqttClient.connect("arduinoClient")) { Serial.println("connected"); // Once connected, publish an announcement ... mqttClient.publish("outTopic","hello world"); // ... and resubscribe mqttClient.subscribe("inTopic"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { Serial.begin(57600); mqttClient.setServer(server, 1883); mqttClient.setCallback(callback); Ethernet.begin(mac, ip); // Allow the hardware to sort itself out delay(1500); } void loop() { if (!mqttClient.connected()) { reconnect(); } mqttClient.loop(); } Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  27. MQTT Subscribe boolean rc = mqttClient.subscribe("myTopic"); Dominik Kundel | @dkundel

    | #nodejsberlin #nodebots #porgjs #coffeejs
  28. MQTT Setup void setup() { Ethernet.begin(mac, ip); // Allow the

    hardware to sort itself out delay(1500); mqttClient.setServer(server, 1883); if (mqttClient.connect("myClientID")) { // connection succeeded } } void loop() { mqttClient.loop(); } Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  29. MQTT Callback void callback(char* topic, byte* payload, unsigned int length)

    { // Allocate the correct amount of memory for the payload copy byte* p = (byte*)malloc(length); // Copy the payload to the new buffer memcpy(p,payload,length); // Republish the received message mqttClient.publish("outTopic", p, length); // Free the memory free(p); } mqttClient.setCallback(callback); Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  30. Example Twitch Live Lamp ! github.com/dkundel/twitch-live-lamp Dominik Kundel | @dkundel

    | #nodejsberlin #nodebots #porgjs #coffeejs
  31. API & Protocols ! Pros ! Lightweight, intuitive ways to

    communicate between devices " Move heavy business logic off devices # Programming language independent Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  32. API & Protocols ! Cons ! Still have to write

    C ++ code for the hardware " Need to deploy/use a message broker Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  33. "Tethered" Nodebots Node.js ➡ Hardware Dominik Kundel | @dkundel |

    #nodejsberlin #nodebots #porgjs #coffeejs
  34. serialport Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs

  35. johnny-five Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs

  36. johnny-five (J5) ! Talk to microcontrollers from Node.js " Use

    a familiar syntax # Leverage the npm ecosystem $ Often tethered to a host machine Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  37. Blink on an Arduino with C ++ // the setup

    function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  38. Blink on an Arduino with J5 var five = require('johnny-five');

    var board = new five.Board(); board.on('ready', function() { var led = new five.Led(13); led.blink(500); }); Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  39. Button with C ++ const int buttonPin = 2; //

    the number of the pushbutton pin const int ledPin = 13; // the number of the LED pin int buttonState = 0; // variable for reading the pushbutton status void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); } void loop() { // read the state of the pushbutton value: buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed. If it is, the buttonState is HIGH: if (buttonState == HIGH) { // turn LED on: digitalWrite(ledPin, HIGH); } else { // turn LED off: digitalWrite(ledPin, LOW); } } Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  40. Button with J5 var five = require('johnny-five'); var board =

    new five.Board(); board.on('ready', function() { var led = new five.Led(13); var button = new five.Button(2); button.on('press', () => { led.on(); }); button.on('release', () => { led.off(); }); }); Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  41. Demo PorgJS Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs

    #coffeejs
  42. "Tethered" Nodebots ! Pros ! Hardware independent code with J5

    ⚒ Use familiar tools # Bring your Editor/IDE $ Use the npm ecosystem % Great website for beginners Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  43. "Tethered" Nodebots ! Cons ⛓ Often tethered to a "host"

    " Less examples than classic Arduino projects Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  44. "Untethered" Nodebots JavaScript ⚭ Microcontroller Dominik Kundel | @dkundel |

    #nodejsberlin #nodebots #porgjs #coffeejs
  45. JerryScript Ultra-lightweight JavaScript engine for the Internet of Things !

    jerryscript.net Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  46. Espruino Espruino is a JavaScript interpreter for microcontrollers. ! www.espruino.com

    Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  47. Espruino Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs

  48. Espruino ! Can run on ESP8266 microcontrollers ($2 a piece)

    " Has it's own hardware versions as well # Open Source Code & Hardware ✍ Comes with its own IDE ⛔ Limited npm support & Does not work with J5 Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  49. Tessel Tessel 2 is a robust IoT and robotics development

    platform. ! tessel.io Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  50. Tessel Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs

  51. Tessel ! Run Node.js with (almost) the entire npm ecosystem

    " Compatible with J5 ⛓ Use your favorite toolchain & editor $ Open Source Code & Hardware % Tessel 2 is fairly expensive Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  52. Demo JavaScript meets Coffee Machine Dominik Kundel | @dkundel |

    #nodejsberlin #nodebots #porgjs #coffeejs
  53. "Untethered" Nodebots ! Pros ✂ Untethered systems running JavaScript "

    Familar programming language ⚒ Use familiar tools $ Bring your own Editor/IDE % (potentially) use the npm ecosystem Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  54. "Untethered" Nodebots ! Cons ⛓ Less flexible on hardware choices

    " Missing cutting edge language features # Some docs better than others Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  55. ! How to get started Dominik Kundel | @dkundel |

    #nodejsberlin #nodebots #porgjs #coffeejs
  56. ! Finding a project Dominik Kundel | @dkundel | #nodejsberlin

    #nodebots #porgjs #coffeejs
  57. ! Use case driven learning Dominik Kundel | @dkundel |

    #nodejsberlin #nodebots #porgjs #coffeejs
  58. ⚒ Hack existing projects Dominik Kundel | @dkundel | #nodejsberlin

    #nodebots #porgjs #coffeejs
  59. ⚡ Electronics basics Dominik Kundel | @dkundel | #nodejsberlin #nodebots

    #porgjs #coffeejs
  60. ! Useful things ⚖ A digital multimeter (Volt, Amps, Ohm)

    " A breadboard # Plenty of jumper wires $ A set of resistors % A few LEDs & A few Solid State Relays to eumlate switches/buttons Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  61. ! Johnny-Five Inventor's Kit ! Available on Sparkfun Dominik Kundel

    | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  62. ! Grove Starter Kit for Arduino ! Available at Seeed

    Studio Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  63. ! Generic Arduino Starter Kit ! Elegoo UNO Starter Kit

    Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  64. ! Resources ! d-k.im/hardware-node-bln ☕ bit.ly/coffeejs # d-k.im/nodebots $ nodebots.io

    % johnny-five.io & tessel.io Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs
  65. Thank You! ! Dominik Kundel " d-k.im/hardware-node-bln # @dkundel $

    dkundel@twilio.com % github/dkundel Dominik Kundel | @dkundel | #nodejsberlin #nodebots #porgjs #coffeejs