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:


No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.