viernes, 4 de diciembre de 2015

Módulo gpio


Un GPIO (General Purpose Input/Output)  es un pin que podemos usar como interfaz con el mundo exterior.

Podemos usar un pin GPIO como entrada (input) al presionar un botón o como salida (output) para iluminar un led.

El módulo GPIO contiene las instrucciones para el uso de los pines de entrada y salida.


gpio.mode()

Descripción

Establece el modo en que se comportará un puerto GPIO, indicando si va a ser de entrada o salida. Esta instrucción es la primera que necesitamos especificar cuando queremos usar un pin GPIO

Sintaxis

gpio.mode(pin, mode, pullup)

Parámetros

pin: 0~12
mode: gpio.OUTPUT (salida), gpio.INPUT (entrada) o gpio.INT (modo interrupción que se ejecutará cada vez que cambia el valor del pin)
pullup: gpio.PULLUP or gpio.FLOAT, por defecto: gpio.FLOAT.

Devuelve

nil

Ejemplo

-- establece gpio 0 como salida.
gpio.mode(0, gpio.OUTPUT)
Nota
No existe una relación directa entre el número de pin (Dx) y el GPIO en la placa. En el siguiente esquema se puede apreciar esta relación.


pins.jpg
Por ejemplo el pin D0 corresponde al GPIO16.

gpio.read()

Descripción

Lee el valor de un pin.

Sintaxis

gpio.read(pin)

Parámetros

pin: 0~12

Devuelve

número: 0 - nivel bajo, 1 - nivel alto

Ejemplo

-- Lee el valor de GPIO 0
gpio.read(0)

gpio.write()

Descripción

Establece el valor de un pin

Sintaxis

gpio.write(pin,level)

Parámetros

pin: 0~12
level: gpio.HIGH o gpio.LOW

Devuelve

nil

Ejemplo

-- set pin index 1 to GPIO mode, and set the pin to high.
pin=1
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, gpio.HIGH)

gpio.trig()

Descripción

Establece la función que se ejecutará cuando se produce una interrupción, o sea, un cambio del valor de un pin.

Sintaxis

gpio.trig(pin, type, function(level))

Parámetros

pin: 1~12 (el pin D0 no soporta interrupciones)
type: "up", "down", "both", "low", "high". Esto indica cuando se produce la señal si durante la bajada o subida de la señal o cuando adquiere un valor determinado. Si se utiliza este último parámetro la interrupción se producirá repetidamente mientras se encuentre en el nivel configurado.
function(level): función que será llamada cuando se produzca la interrupción. Level es el parámetro

Devuelve

nil

Ejemplo

-- usamos el pin 0 como entrada para un contador de pulsos
pulse1 = 0
du = 0
gpio.mode(1,gpio.INT)
function pin1cb(level)
    du = tmr.now() – pulse1
    print(du)
    pulse1 = tmr.now()
    if level == 1 then gpio.trig(1, "down") else gpio.trig(1, "up")  
    end
end
gpio.trig(1, "down",pin1cb)
Nota:
Supresión de rebotes
Si conecta simplemente un pulsador a la entrada para generar una interrupción, es posible que se produzcan efectos indeseados debido a que al pulsar un botón no se produce una señal “limpia” y eso podría ocasionar efectos no deseados.


Este efecto se puede mitigar de dos formas: por hardware y por software.
Por hardware utilizando un circuito antirebote como el indicado en el siguiente esquema:
Pulsador-Interruptor-Sin-Rebote.png
Por software la forma más sencilla para mitigar este rebote es ignorar eventos para un corto período de tiempo después de producirse un cambio en el estado.   A continuación se muestra un ejemplo:

local pin = 4 --> GPIO2
function debounce (func)
    local last = 0
    local delay = 200000
    return function (...)
         local now = tmr.now()
         if now - last < delay then return
         end
         last = now return func(...)
    end
end
function onChange ()
    print('The pin value has changed to '..gpio.read(pin))
end
gpio.mode(pin, gpio.INT)
gpio.trig(pin, 'both', debounce(onChange))

La función debounce() toma una función como argumento y lo envuelve en otro. Cuando la función externa se llama, a continuación llama a la función interna, pero sólo si no se ha llamado en los últimos 5000us (5ms).


Fuentes:


jueves, 3 de diciembre de 2015

Hola Mundo con NodeMCU

En este tipo de sistemas, el típico Hola Mundo se representa con la ejecución de un programa que haga parpadear un led. Para ello, utilizamos un led y una resistencia de 330 ohmios. El esquema sería el siguiente:

esquema.png


El código que vamos a cargar en el módulo es el siguiente:

pin=0 -- correspondiente al GPIO16
gpio.mode(pin,gpio.OUTPUT)
aux=0
function blink ()
    if aux==0 then
       gpio.write(pin,gpio.HIGH)
       aux=1
    else
       gpio.write(pin,gpio.LOW)
       aux=0
    end
end
tmr.alarm(0,1000,1,blink) -- Timer 0 como intervalo de 1s

Primero, declaramos una variable que denominamos pin y le damos el valor de 0.

Luego configuramos el pin 0 (D0 que corresponde a GPIO16) como salida utilizando la instrucción gpio.mode(pin, mode, pullup)

A continuación creamos nuestra función que va alternando el estado de una nueva variable denominada aux que nos indica si el led está apagado (0) o encendido (1). Para cambiar el estado del led utilizamos la función gpio.write(pin,level).

Por último, creamos un timer para que se ejecute la función blink() cada segundo utilizando tmr.alarm(id, interval, repeat, function do())

Para ejecutar el programa hacemos click en Save to ESP.

Fuentes:


Arduino Create: El IDE de Arduino online

Los chicos de Arduino han anunciado la versión beta de su IDE Online para que unos pocos puedan probarla mediante invitación. El Arduino Create permite programar cualquier placa Arduino directamente desde el navegador sin necesidad de instalar nada (salgo un pluggin para el navegador).


Según indican en el la publicación oficial, seguirán desarrollando la versión offline y eso es de agradecer ya que no siempre se dispone de una conexión a Internet para programar.


Visto en bricogeek

miércoles, 2 de diciembre de 2015

Introducción a NodeMCU

Recientemente he adquirido en k-electrónica un módulo NodeMCU basado en el ESP8266-12-E del fabricante LoLin, en su versión 3 que integra GPIO , PWM , CII , 1-Wire y ADC todo en una única tarjeta enfocada principalmente al mercado  IoT.

 
Su desarrollo en Código Abierto se fundamenta en NodeMCU, un firmware con soporte Lua basado en el proyecto eLua para esp8266 wifi-soc (System on a Chip), incorporando una interesante y completa API.
 
Tiene un tamaño de 5,8cm x 3cm x 0.5cm, y su pinout es el siguiente:
 
Esta versión 3 es exclusiva de este fabricante e incorpora, con respecto a la versión 2 de otros fabricantes como AMICA, un puerto USB mejorado al utilizar el chip CH340 en vez del chip CP2102 de la versión 2. Además utiliza un par de pins reservados en la versión 2 para salida de alimentación USB (USB power output) y otro para una tierra (GND).

Antes de conectar el módulo al PC, vamos a instalar el driver del conversor USB/Serial CH340 (en mi caso utilizo Windows 7 y si lo conectamos sin instalar el driver Windows no lo reconoce).

Descargamos el fichero CH341SER.exe y lo ejecutamos:

 


Pulsamos sobre Install y, una vez instalado, conectamos el módulo al PC. Después de unos instantes nos indica que se ha instalado el controlador en el puerto COM6:
 
 
 
En el administrador de dispositivos de Windows no aparece este controlador:
 

 
Para programar el módulo utilizaremos el programa ESPlorer que un software de código abierto desarrollado en Java por lo que es multiplataforma(debemos tener instalada la versión 7 o superior). Descomprimimos el fichero y hacemos click en ESPlorer.jar y se nos abre el IDE.
 
 
En la parte derecha superior nos indica el puerto al que está conectado (en este caso COM6) y hacemos click en Open.

PORT OPEN 9600
Communication with MCU...
Got answer! AutoDetect firmware...
NodeMCU firmware detected.
=node.heap()
34360
>

Si hacemos click en Reset nos indica la versión del firmware. En mi caso:

NodeMCU 0.9.6 build 20150704  powered by Lua 5.1.4

Fuentes: