MyBlog

API GPIO en una Beaglebone Black

Maximiliano Valencia- 04 marzo, 2018

Repositorio del código

En este post vamos a hacer una API usando Javascript para controlar los LEDs de la Beaglebone Black.

Primero, requerimos los módulos necesarios para crear el servidor y para accesar a los GPIOs:

#!/usr/bin/env node
var http = require('http')
var b = require('bonescript')
var url = require('url')

La librería http se utiliza para crear un servidor. La librería bonescript es utilizada para controlar el estado de los LEDs. La librería url se utiliza para obtener los parámetros de las peticiones de los clientes

Primero, se inicializan los GPIOs de los LEDs como salidas y escribimos un valor de LOW:

var state = [b.LOW, b.LOW, b.LOW, b.LOW]
var leds = ["USR0", "USR1", "USR2", "USR3"]

for (var i in leds) {
    b.pinMode(leds[i], b.OUTPUT)
    b.digitalWrite(leds[i], state[i])
}

El siguiente código crea un servidor y define la funciones que va a manejar las conexiones, también, indica al servidor que abra el puerto 3001 para conexiones con el cliente. Cuando un cliente se conecta se obtiene la ruta de la petición en la variable urlReq que indica cuál LED se quiere operar y la consulta en la variable query que tiene el dato state que indica el estado del LED que se va a operar.

http.createServer(function (req, res) {
    var urlReq = url.parse(req.url, true).pathname
    var query = url.parse(req.url, true).query
    switch(urlReq) {
        case '/USR0':
            res.writeHead(200, {'Content-Type': 'text/html'})
            setState(0, query.state) // Set state received from query
            break
        case '/USR1':
            res.writeHead(200, {'Content-Type': 'text/html'})
            setState(1, query.state) // Set state received from query
            break
        case '/USR2':
            res.writeHead(200, {'Content-Type': 'text/html'})
            toggle(2) // Toggle the LED USR2
            break
        default:
            res.writeHead(404, {'Content-Type': 'text/html'})
            res.write(req.url + ' Not Found!')
    }
    res.end()
}).listen(3001)

Definimos las funciones para escribir a los GPIOs y creamos una función periódica de 1 segundo para saber que nuestro programa está corriendo.

setInterval( () => {
    toggle(3)
}, 1000)

// Function used to toggle a LED state
function toggle(led) {
    state[led] = state[led] == Gpio.LOW ? Gpio.HIGH : Gpio.LOW
    Gpio.digitalWrite(leds[led], state[led])
}

// Function used to set a value to a LED
function setState(led, value) {
    state[led] = value == 1 ? Gpio.HIGH : Gpio.LOW
    Gpio.digitalWrite(leds[led], state[led])
}

Para cambiar el estado de un LED se pueden utilizar los siguientes comandos:

# Apagar LED USR0
curl -v "<DIRECCION_IP_BEAG>:3001/USR0?state=0"
curl -v "beaglebone.local:3001/USR0?state=0"
# Encender LED USR0
curl -v "<DIRECCION_IP_BEAG>:3001/USR0?state=0"
curl -v "beaglebone.local:3001/USR0?state=1"

# Apagar LED USR1
curl -v "<DIRECCION_IP_BEAG>:3001/USR0?state=0"
curl -v "beaglebone.local:3001/USR1?state=0"
# Encender LED USR1
curl -v "<DIRECCION_IP_BEAG>:3001/USR0?state=0"
curl -v "beaglebone.local:3001/USR1?state=1"

# Invertir estado LED USR2
curl -v "<DIRECCION_IP_BEAG>:3001/USR0?state=0"
curl -v "beaglebone.local:3001/USR2"

El LED USR2 está configurado para que en cada petición se invierta su estado.

Si no tienes curlinstalado puedes hacer conexión con el servidor utilizando un navegador web y conectandote a la siguiente dirección <DIRECCION_IP_BEAG>:3001/USR0?1 o si la Beaglebone Black está conectada a tu computadora por el puerto USB puedes utilizar la siguiente dirección beaglebone.local:3001/USR0?1.