Cómo programar un Arduino con JavaScript

Como probablemente sepas (o hayas escuchado), Arduino es una gran plataforma para aprender y hackear dispositivos electrónicos que de otro modo serían muy difíciles de usar para un principiante...

Introducción

Como probablemente sepa (o haya escuchado), arduino es una gran plataforma para aprender y piratear dispositivos electrónicos que, de otro modo, serían muy difíciles de usar para un principiante. Es una gran introducción a la programación, la electrónica y la ingeniería en general. Pero incluso entonces, por mucho que Arduino sea una mejora con respecto a la forma tradicional de trabajar con la electrónica, todavía puede ser un poco desalentador escribir el código tipo C. Entonces, ¿qué pasaría si pudiera usar un lenguaje de nivel superior como JavaScript en su lugar?

Con lenguajes como JavaScript, no necesita preocuparse por los detalles de bajo nivel de cosas como los punteros y la asignación de memoria, que pueden resultar confusos para los principiantes. En cambio, puede concentrarse en la lógica de la aplicación y utilizar los cientos de miles de bibliotecas de código abierto para brindarle a su proyecto todo tipo de funcionalidad con solo unas pocas líneas de código.

Johnny Cinco

La biblioteca johnny cinco es lo que le permite controlar un Arduino (o Raspberry Pi, Beaglebone, Photon y muchos más) con JavaScript.

Ahora, como muchas cosas buenas, hay una pequeña trampa. El código JavaScript en realidad no se ejecuta directamente en el Arduino, en realidad debe ejecutarse en una computadora host y comunicar sus instrucciones en tiempo de ejecución al dispositivo a través de un cable USB o algún otro protocolo/medio serial. Para algunas aplicaciones, esto es un factor decisivo ya que no pueden tener esta conexión física en su proyecto (como en un dron), pero para otras podría no ser un gran problema. Por ejemplo, si todo lo que necesita hacer es controlar un brazo robótico en su escritorio, Johnny Five podría ser la opción perfecta. Después de todo, su enfoque principal es la robótica, de ahí el nombre.

La biblioteca funciona aprovechando el protocolo firmata, que es una forma de comunicarse con los microcontroladores desde el software en una computadora host (o teléfono inteligente/tableta, etc.). Esto significa que puede ejecutar toda la lógica del programa en su computadora, pero cada vez que necesite hacer cualquier IO en el dispositivo, como leer un pin GPIO, enviar datos a través de SPI, etc., el programa de escritorio usará el protocolo Firmata para decirle el Arduino para realizar el IO específico.

El siguiente código, por ejemplo, solo hace parpadear el LED en el pin 13. Entonces, la única vez que se comunica con el Arduino es cuando quiere encender o apagar el LED; de lo contrario, el Arduino simplemente se sienta allí y espera recibir instrucciones del host. computadora.

1
2
3
4
5
6
7
8
var five = require('johnny-five');

var board = new five.Board();

board.on('ready', function() {
    var led = new five.Led(13);
    led.blink(500);
});

Para ejecutarlo, primero debe cargar el código Arduino Firmata en la placa. Haga esto abriendo el IDE de Arduino y luego haciendo clic en Archivo->Ejemplos->Firmata->StandardFirmata. Esto abrirá el código en la ventana del editor. Finalmente (suponiendo que su placa esté conectada a través de USB), haga clic en Cargar.

Para ejecutar la parte del código de Johnny-Five, navegue hasta el directorio del proyecto, asegúrese de haber ejecutado npm install y luego ejecute node index.js, asumiendo que el archivo se llama `index. js'.

Lo bueno de Johnny Five es que, al estilo típico de Node, hay una biblioteca para casi todo. El autor ya ha escrito todo el código que necesita para realizar tareas típicas de robótica, como girar motores, leer entradas de sensores, interactuar con dispositivos de comunicación y más. Puedes encontrar una enorme lista de ejemplos útiles aquí.

Ejemplo: Johnny Five + Arduino + Hacker News

Este ejemplo tiene una buena combinación de programación API de alto nivel, como la que vería en una aplicación típica de Node, así como algo de código de Johnny Five para ayudar a interactuar con una pantalla LCD. Pensé que sería un buen ejemplo para mostrarles cómo dos plataformas muy diferentes pueden trabajar juntas.

El proyecto que creé recupera los 10 enlaces principales de Hacker News y los muestra en una pantalla LCD controlada por un Arduino Uno.

Empecé usando la biblioteca petición-promesa y la API de Hacker News. para recuperar los títulos de los 10 enlaces principales (o 'stories' como los llaman), que se devuelven como una matriz.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var util = require('util');
var Promise = require('bluebird');
var request = require('request-promise');

var topPostsLink = 'https://hacker-news.firebaseio.com/v0/topstories.json';
var storyLinkTemplate = 'https://hacker-news.firebaseio.com/v0/item/%s.json';

var retrieveHnTitles = function() {
    return request(topPostsLink).then(function(json) {
        var ids = JSON.parse(json);
        ids = ids.splice(0, 10);

        var storyRequests = [];
        ids.forEach(function(id) {
            var storyUrl = util.format(storyLinkTemplate, id);
            storyRequests.push(request(storyUrl));
        });

        return Promise.all(storyRequests);
    }).then(function(stories) {
        stories = stories.map(JSON.parse);

        var titles = stories.map(function(story) {
            return story.title;
        });

        return titles;
    }).catch(console.error);
};

Cuando se activa el evento de tablero 'ready', llamamos a la función anterior, construimos una cadena que contiene todos los títulos de HN que acabamos de recibir y luego la enviamos a la pantalla LCD usando las funciones integradas de Johnny-Five LCD.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
board.on('ready', function() {
    var lcd = new five.LCD({ 
        controller: 'PCF8574'
    });

    retrieveHnTitles().then(function(titles) {
        var titlesString = '';
        for (var i = 0; i < titles.length; i++) {
            var title = titles[i];
            var spaces = '';
            if (title.length > 32) title = title.substring(0, 29) + '...';
            if (title.length < 32) spaces = new Array(32 - title.length + 1).join(' ');
            titlesString += title + spaces;
        }

        lcd.autoscroll().print(titlesString);
    });
});

La función autoscroll() es muy conveniente aquí ya que tenemos una cadena muy larga. Los 10 títulos principales de las historias deben desplazarse por la pantalla, con solo una historia en la pantalla a la vez.

Enlaces HN en pantalla LCD
Los 3 mejores títulos de enlaces HN del 19/09/15.

Si tuviera que esforzarme un poco más en el proyecto, lo siguiente que podría hacer es programar esto para que se ejecute cada 5 o 10 minutos usando la biblioteca cron . De esa manera, no tienes que ejecutarlo manualmente (lo que anula el propósito). Otra cosa que quizás quieras hacer es mostrar la cantidad de votos a favor que tiene cada enlace, o tal vez la cantidad de comentarios. Pero entonces es posible que necesite obtener una pantalla más grande :)

Solución de problemas

Siempre que programa con hardware, las cosas no siempre salen tan bien como lo hacen con un servidor de nivel superior o una aplicación de escritorio (e incluso entonces hay muchas soluciones de problemas), por lo que pensé que sería útil proporcionar algo de ayuda para los problemas más comunes que enfrentan las personas. Si obtiene un error cuando ejecuta el programa por primera vez (no se puede conectar o se agotó el tiempo de espera de la conexión), pruebe una de estas soluciones.

¿Cargó el firmware?

Tan simple como suena, yo mismo he cometido este error varias veces. Intentaría ejecutar una aplicación de Johnny Five, solo para darme cuenta de que no se conectará porque olvidé cargar el firmware de Firmata en el Arduino. Cuando cambio entre proyectos a menudo, me encuentro con esto mucho, y generalmente es lo primero que se debe considerar cuando no se puede conectar con un dispositivo.

¿Es compatible su hardware? {#essuhardware es compatible}

La primera vez que intenté usar Johnny Five estaba usando un Arduino Duemilanove y seguía recibiendo un error de "Se agotó el tiempo de conexión". Después de una solución de problemas básica, finalmente revisé la lista de compatibilidad para ver que Duemilanove no estaba en la lista. Había pensado que, dado que es tan similar al Uno, funcionaría, pero aparentemente no.

¿Está utilizando Windows?

Sí, Windows es compatible, sin embargo, a veces los sistemas Windows no pueden compilar las dependencias nativas. Para solucionar esto, intente instalar Johnny Five con el siguiente comando:

1
npm install johnny-five --msvs_version=2012

Constrúyelo tú mismo

Este es un proyecto bastante barato para construir usted mismo. Aquí está la lista de piezas de todo lo que usé:

-Arduino Uno

  • Pantalla LCD (2x16, I2C)
  • Cables Dupont macho a hembra
  • Cable USB tipo A a tipo B

Probablemente pueda salirse con la suya sin comprar los cables Dupont siempre que tenga algún otro cable simple sentado y una forma de pelar la carcasa de plástico en cada extremo. Acabo de enumerar estos porque son más convenientes.

También puede usar una pantalla LCD diferente, pero Johnny Five solo admite oficialmente los controladores PCF8574, PCF8574A y JHD1313M1 I2C a paralelo. Dependiendo de la implementación de I2C, otros controladores también pueden funcionar.

Conclusión

Con este artículo y los ejemplos que he mostrado, espero que tenga una mejor idea de lo que es posible usar Johnny Five/JavaScript con Arduino, Raspberry Pi, Beaglebone, etc. Claro, C/C++ puede dominar el campo de la electrónica integrada. pero con bibliotecas como Johnny Five y el protocolo Firmata, puede sumergirse fácilmente usando herramientas y prototipos familiares incluso más rápido que antes.

Asegúrese de visitar la documentación de Johnny Five para obtener más información. Hay excelentes tutoriales y guías de solución de problemas para cuando te quedes atascado.

¿Hay algún proyecto o ejemplo que te gustaría ver hecho con Johnny Five? ¡Cuéntanos en los comentarios!