Cómo programar un Arduino con JavaScript

    Introducción

    Como probablemente sepa (o haya escuchado), Arduino es una gran plataforma para aprender y piratear la electrónica que de otra manera sería muy difícil 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, a pesar de que Arduino es una mejora con respecto a la forma tradicional de trabajar con la electrónica, todavía puede ser un poco abrumador escribir el código tipo C. Entonces, ¿qué pasaría si pudiera utilizar 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 punteros y asignación de memoria, que pueden ser 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

    los Johnny cinco La biblioteca 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 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 en serie. Para algunas aplicaciones, esto es un factor decisivo ya que no pueden tener esta atadura física en su proyecto (como en un dron), pero para otras puede que no sea 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 el ajuste perfecto. Después de todo, su enfoque principal es la robótica, por lo tanto el nombre.

    La biblioteca funciona aprovechando las Protocolo Firmata, que es una forma de comunicarse con 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 utilizará el protocolo Firmata para indicar el Arduino para realizar el IO específico.

    El código a continuación, por ejemplo, simplemente 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.

    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 (asumiendo que su placa está conectada a través de USB), haga clic en Subir.

    Para ejecutar la parte Johnny-Five del código, navegue hasta el directorio del proyecto, asegúrese de haber ejecutado npm instally luego ejecutar 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. Puede encontrar una gran 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 vería en una aplicación Node típica, así como también un código Johnny Five para ayudar a la interfaz con una pantalla LCD. Pensé que serviría como un buen ejemplo para mostrarte 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 el request-promise biblioteca y Hacker News ‘ API para recuperar los títulos de los 10 enlaces principales (o ‘historias’ como los llaman), que se devuelven como una matriz.

    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 la placa ‘listo’, 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 utilizando las funciones incorporadas de la pantalla LCD Johnny-Five.

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

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

     

    Los 3 principales títulos de enlaces de HN del 19/9/15.

    Si tuviera que esforzarme más en el proyecto, lo siguiente que podría hacer es programar esto para que se ejecute cada 5 o 10 minutos usando el cron biblioteca. De esa manera, no tiene que ejecutarlo manualmente (lo que frustra el propósito). Otra cosa que podría querer 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 deba obtener una pantalla más grande 🙂

    Solución de problemas

    Cada vez que programa con hardware, las cosas no siempre van tan bien como con un servidor de nivel superior o una aplicación de escritorio (e incluso entonces hay una gran cantidad de solución de problemas), por lo que pensé que sería útil brindar ayuda. a los problemas más comunes que enfrentan las personas. Si recibe un error cuando ejecuta el programa por primera vez (no se puede conectar o se agota el tiempo de espera de la conexión), pruebe una de estas soluciones.

    ¿Cargó el firmware?

    Tan simple como suena, he cometido este error varias veces. Intentaría ejecutar una aplicación Johnny Five, solo para darme cuenta de que no se conecta porque olvidé cargar el firmware 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.

    ¿Su hardware es compatible?

    La primera vez que intenté usar Johnny Five estaba usando un Arduino Duemilanove y seguía recibiendo un error de “Tiempo de conexión agotado”. Después de solucionar algunos problemas básicos, finalmente verifiqué la lista de compatibilidad para ver que Duemilanove no estaba en la lista. Pensé que, dado que es tan similar al Uno, funcionaría, pero aparentemente no.

    ¿Estás usando Windows?

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

    npm install johnny-five --msvs_version=2012
    

    Constrúyalo usted mismo

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

    • Arduino Uno
    • Pantalla LCD (2×16, 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 alrededor y una forma de pelar la carcasa de plástico en cada extremo. Acabo de enumerarlos porque son más convenientes.

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

    Conclusión

    Con suerte, a partir de este artículo y los ejemplos que he mostrado, tienes 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 embebida, pero con bibliotecas como Johnny Five y el protocolo Firmata, puede sumergirse fácilmente en el uso de herramientas familiares y prototipos incluso más rápido que antes.

    Asegúrate de dirigirte a Johnny Five documentación aprender más. Hay algunos excelentes tutoriales y guías de solución de problemas para cuando se quede atascado.

    ¿Hay algún proyecto o ejemplo que le gustaría que se hiciera con Johnny Five? ¡Háznoslo saber en los comentarios!

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *