Raspberry Pi y GPIO (1) 11

ENGLISH VERSION

 

Vamos a abordar una de las facetas mas interesantes de nuestra tarjeta: su comunicación con el mundo exterior. Para ello, vamos a describir – de una manera sencilla – la forma en que la Raspi hace uso de su

puerto de señales de propósito general, más conocido como GPIO.

Nota: esta entrada se basa en el harware Raspberry Pi y en el software Raspbian (p.ej. Wheezy)

Vamos a comentar en este primer artículo – y de la manera más didáctica posible – el hardware asociado al citado puerto, asi como la forma en que Linux controla el mismo, para finalizar manejando una tarjeta I/O “educativa” (XUE-001) que permite el control desde la Raspberry de una señal de salida y otra de entrada,  o dicho de otra manera : hacer que Raspbian controle un hardware externo vía software.

El resumen de lo que comentaremos a continuación es:

(1)    Descripción (muy) básica del puerto GPIO.
(2)    Algo de teoría sobre entradas y salidas.
(3)    Hardware I/O para Raspi: la tarjeta XUE-001
(4)    Cómo “ve” Linux el puerto GPIO de la Raspberry Pi.
(5)    Primer programa (sencillo) de prueba: lectura y escritura vía GPIO.

1 – Descripción (muy) básica del puerto GPIO

La tarjeta Raspberry Pi puede comunicarse con dispositivos externos mediante el conector GPIO incorporado. En dicho conector se integran patillas de alimentación ( +5 y +3.3 V) , masa, y entradas/salidas capaces de implementar diferentes protocolos.

Como quiera que hay 2 versiones de Raspberry a nivel hardware (rev. 1 y 2) las asignaciones de puertos también varían.  Sin entrar – de momento – en detalles de protocolos, las dos posibles versiones de nuestra Raspberry hacen que nos encontremos  a su vez con dos posibles escenarios hardware.  Vemos aquí un esquema comparativo de la numeración de patillas.

pic_gpio1_00

Es importante tener en cuenta que – a nivel software – tenemos que saber con que patilla queremos comunicarnos, y por tanto, en esta y en posteriores entradas vamos a optar por utilizar patillas comunes a ambas releases.

Además de las patillas correspondientes a +5, +3.3 y masa, tenemos varios pines de uso genérico donde podemos conectar dispositivos hardware. En este artículo, de momento, vamos a explicar la forma de utilizar una patilla como entrada (INPUT) y otra como salida (OUTPUT).

Es muy importante comentar que cualquier manipulación errónea, conexionado equivocado o descarga estática sobre las patillas GPIO puede dañarlas de forma permanente. Por esta razón aconsejamos seguir fielmente las recomendaciones dadas al respecto.

2 – Algo de teoría sobre entradas y salidas..

Cuando un ordenador, un microprocesador o cualquier dispositivo microcontrolado efectua un control vía I/O el software se comunica con un dispositivo hardware externo, y las posibilidades de hacerlo son, típicamente, dos:

OUTPUT : genera una salida lógica (escribe) en una patilla configurada como SALIDA.
INPUT : obtiene un entrada lógica (lee) en una patilla configurada como ENTRADA.

En esta entrada vamos a tomar un par de patillas para efectuar las correspondientes lecturas/escrituras y conseguir así controlar un dispositivo externo, es decir, activar o desactivar mediante la patilla de salida y recibir una señal lógica mediante la patilla de entrada.

En nuestro ejemplo, vamos a utilizar la tarjeta XUE-001 de la firma Webtronika

pic_gpio1_01

y las patillas utilizadas por la misma son:

Patilla 8 (GPIO14) : salida digital
Patilla 24 (GPIO8) : entrada digital

Dado que el “nivel lógico” que maneja la Raspberry es de 3.3 V, las posibilidades y relaciones entre el software y el hardware son:

Para la ENTRADA (Patilla 24):

> leeremos un nivel lógico 1 (software) cuando tengamos 3.3 V en la misma (hardware)
> leeremos un nivel lógico 0 (software) cuando tengamos 0 V en la misma (hardware)

Para la SALIDA (Patilla 8):

> escribiremos un 1 lógico (software)  para conseguir tener 3.3 V en la misma (hardware)
> escribiremos un 0 lógico (software)  para conseguir tener 0 V en la misma (hardware)

pic_gpio1_02b

En entradas posteriores ahondaremos en configuraciones tales como protocolos, resistencias de pull-up, etc. pero – de momento – podemos continuar sin utilizar estos parámetros.

4 – Cómo “ve” Linux el puerto GPIO de la Raspberry Pi.

Linux, como ya muchos conocen, referencia casi todo lo que maneja en forma de “fichero”, y las patillas del puerto GPIO no iban a ser una excepción. No es preciso que seamos unos “expertos” en Linux y conocer exactamente su gestión interna, pero lo que si conviene saber es que el “nucleo” de Linux ya sabe de la existencia de dicho puerto, pero no así el resto del sistema Linux, razón por la que tendremos que “informar” a nuestra tarjeta ( vía software) de la presencia del puerto GPIO para que la Raspi “vea” el mismo.

Para realizar esta operación tendremos que “exportar” la información I/O desde el núcleo Linux antes de poder acceder al puerto tal y como si de un fichero más se tratase. Para ello hemos de efectuar los comandos destinados a “crear” el acceso al hardware vía ficheros, y una vez efectuados tendremos el acceso en /sys/class/gpio.

Nota: la operativa de exportación ha de hacerse como root (su)

Si damos un vistazo a dicho directorio antes de “mapear” puerto alguno vemos que el contenido es :

pic_gpio1_03

Ahora adquirimos privilegios de root para efectuar los comandos mediante

sudo -i

y efectuamos en primer lugar el comando para exportar la patilla gpio14 como salida mediante

pic_gpio1_04

echo “14” >  /sys/class/gpio/export

le damos permisos totales

chmod 777 -R /sys/class/gpio/gpio14

fijamos la dirección en la patilla como “salida”

echo “out” > /sys/class/gpio/gpio14/direction

Si ahora vemos de nuevo el contenido de /sys/class/gpio/ tenemos :

pic_gpio1_05

por lo que ya comprobamos que gpio14 está “exportado”

Debemos repetir un proceso homólogo con la patilla que usaremos como entrada (gpio8), así :

echo “8”  >  /sys/class/gpio/export
chmod 777 -R /sys/class/gpio/gpio8
echo “in” >  /sys/class/gpio/gpio8/direction

y podemos comprobar luego el efecto en el directorio /sys/class/gpio/

pic_gpio1_06

En este punto las patillas que utilizaremos con la tarjeta XUE-001 ya están listas, por lo que solo tendremos que elegir el lenguaje de programación que más nos plazca y proceder a su control desde la Raspberry Pi.

5 – Primer programa (sencillo) de prueba: lectura y escritura vía GPIO.

Controlar la tarjeta XUE-001 no es complejo si seguimos las instrucciones aquí comentadas. La forma más sencilla de controlar las salidas a GPIO es mediante comandos del propio sistema operativo. Su manejo mediante lenguajes de alto nivel será comentado en entradas posteriores.

Los pasos a seguir para ello son:

(A) – Conectamos la tarjeta XUE-001 al puerto GPIO de la Raspberry mediante el cable plano que acompaña a la tarjeta.

pic_gpio1_13

Nota : efectuamos esta conexión con la tarjeta Raspberry Pi sin alimentar esta y prestando especial cuidado a la posición correcta de inserción del conector, tanto en la Raspberry como en la XUE-001.

pic_gpio1_07b

(B) – Conectamos el cable alimentador USB a la tarjeta XUE-001. Es un conector típico en formato USB-B (hembra) y que coincide con los utilizados para conectar impresoras USB.

Nota: el cable USB-B no está incluido en el kit recibido al adquirir la tarjeta XUE-001

pic_gpio1_08c2

(C ) – Alimentamos la tarjeta Raspberry y dejamos que el sistema arranque. Si el proceso es correcto se debe iluminar el LED amarillo nada mas arrancar la Raspberry (señal POWER de Raspberry) y el verde (SALIDA).

Nota: si se han “exportado” previamente los puertos GPIO el LED verde estará apagado

El rojo (ENTRADA) debe permanecer apagado (salvo que pulsemos el micro-switch de TEST).

 

pic_gpio1_09

(D) – En la Raspberry Pi efectuamos la exportación de puertos ( gpio14 como salida y gpio8 como entrada ) tal y como hemos comentado en el punto anterior.

Ahora ya estamos listos para leer y escribir en el puerto GPIO de nuestra Raspi. ¡Vamos alla! …

— Controlando la salida de la Raspberry Pi —

El conector [OUTPUT] de la tarjeta XUE-001 incorpora un conector de 3 tomas (tornillos), a saber :

* NC – Contacto normalmente cerrado
* Co – Contacto común
* NO – Contacto normalmente abierto

estas provienen de un relé el cual, a su vez, es gestionado por la señal que llega a la tarjeta XUE-001 desde la Raspberry Pi y que es optoacoplada para añadir una máxima seguridad y aislamiento hardware a nuestra Raspi.

Si hemos realizado la “exportación” (y antes de enviar comando alguno desde la Raspi) deberá estar activo solo el LED amarillo (POWER). En este momento el relé mantiene cerrados los contactos “Co” y “NC”.

Para cambiar el estado de la salida – y por tanto el del relé, el LED verde indicador y cualquier dispositivo conectado a través del mismo – ejecutamos:

echo “1” > /sys/class/gpio/gpio14/value

activando la salida y haciendo conmutar al relé. En este instante los contactos “Co” y “NO” deben haberse cerrado y el LED verde deberá activarse.

para desactivar la salida ejecutamos

echo “0” > /sys/class/gpio/gpio14/value

Ahora los contactos “Co” y “NC” deben haberse cerrado y el LED verde deberá apagarse.

pic_gpio1_10

Podemos controlar mediante los contactos del relé un dispositivo externo desde nuestra Raspi. ¿ Cual ? …  eso ya dependerá de nuestra imaginación.

Nota : el consumo controlado desde el relé no debe sobrepasar los 750 mA (1A max).

— Controlando la entrada a la Raspberry Pi —

Vemos que la tarjeta XUE-001 incorpora un micro-interruptor etiquetado como “TEST“, el cual nos permite efectuar una verificación rápida del estatus de la señal de entrada. Esto resulta muy interesante ya que podemos verificar que la Raspi lee correctamente la señal de entrada antes de conectarle cualquier señal o sensor a la misma.

pic_gpio1_11c

Cuando pulsemos el citado micro-interruptor se iluminará el LED rojo, momento en que se envía – también de forma optoacoplada – una señal de nivel lógico “1” al puerto GPIO de la Raspi. Cuando el micro-interruptor no está pulsado (LED rojo apagado) la señal que recibe la Raspi es un “0” lógico.

Para “leer” esta entrada (suponemos ya mapeado / exportado el puerto gpio8) hemos de ver el valor (0/1) que hay en el fichero exportado anteriormente, por lo que efectuamos el comando

more /sys/class/gpio/gpio8/value

vemos que el valor obtenido depende de que pulsemos (1) o no (0) el micro-interruptor de “TEST”. De esta forma podemos crear un software que actúe dependiendo del estado de nuestra entrada …

pic_gpio1_12

La tarjeta XUE-001 incorpora como entrada dos diferentes posibilidades, a saber:

Entrada A – Modo (switch) => se activa cerrando los contactos (SW-SW)

Entrada B – Modo (signal) => se activa por nivel [ 5 a 12 V ] en contactos (+ -)

pic_gpio1_14

podemos probar la entrada A cortocircuitando las entradas etiquetadas como SW-SW y ver que se activa el LED rojo. Para la entrada B deberemos conectar cualquier sensor (respetando la polaridad) que nos suministre un nivel entre 5 y 12 V.

En una próxima entrada comentaremos cómo controlar el puerto GPIO usando otras interesantes opciones … ahora  a DIVERTIRSE

 

 

11 thoughts on “Raspberry Pi y GPIO (1)

  1. Reply rodrigo Abr 15, 2013 5:08 am

    osea amigo se puede colocar cualquier tipo de hardware a la raspberry pi??, lo que quiero es colocarle dispositivos eletronicos como una sintonizadora de tv pero al puertp gpio, se podria

  2. Reply Txus Abr 15, 2013 8:00 am

    Ridrigo, el puerto GPIO permite controlar señales lógicas mediante diferentes protocolos, es decir, ver estatus de una determinada señal o actuar una señal para que interaccione con la electrónica que tu le conectes.
    Respecto a la sintonizadora de TV lo mejor es utilizar el puerto USB e instalar un dispositivo DVB-TDT USB. En DIVERTEKA vamos a abordar en breve este tema… y con opciones muy interesantes. Puedes “permanecer atento a nuestra página” .. 😉

    Un saludo

    Txus

  3. Reply ulysess Abr 15, 2013 9:24 am

    Como siempre, soberbio. ¿Puedo poner un enlace a la noticia en mi web?

  4. Reply Txus Abr 16, 2013 12:13 am

    Hola ulyses, por supuesto que puedes. Tu recopilación es un referente para muchos aficionados a la Rasperry Pi ,incluido yo mismo.

    Un saludo

    Txus

  5. Reply Daniel Alvares Abr 18, 2013 6:19 pm

    Buen Dia!
    Una pregunta podria manipular la entrada de la RasPi con un sensor, l oque estoy haciendo es una alarma al momento de interrumpir la señal con una led infrarojo se debe activar una alarma por medio de la RasPi!

  6. Reply Txus Abr 18, 2013 7:39 pm

    Hola Daniel, veo posible que puedas hacerlo. ¿el sensor genera un contacto o un nivel de tensión?. Ambas tipos de sañal puedn ser controladas como se muestra en el artículo (via tarjeta XUE-001), y respecto a la salida el relé puede controlar la alarma que mencionas…. tan solo hay que programar un poquito. Si tienes más dudas puedes contactarnos en el mail info@diverteka.com

  7. Reply omar valdez Abr 18, 2013 8:14 pm

    Buen día!
    Tengo una pregunta, espero puedas ayudarme. Como puedo estar testeando un puerto gpio? es decir, puedo guardar “/sys/class/gpio/gpio3/value” en una variable?

  8. Reply Txus Abr 19, 2013 11:44 am

    Hola Omar, en principio tendrías que crear un pequeño script con un bucle para guardar la variable que comentas. No obstante, en breve vamos a postear un nuevo artículo que incluya – entre otras cosas – la gestión de interrupciones, y dada tu pregunta vamos a intentar crear un ejemplo que te sirva de ayuda, bien via loop o interrupt …. ¡¡ stay tuned !!

    Un saludo

    Txus

  9. Reply luis Jul 25, 2013 6:48 am

    Hola que tal soy nuevo en el mundo de la raspberry y me gustaria saber si podrias ayudarme!

    tengo un proyecto que consiste principalmente en la comunicacion entre la raspberry y un dispositivo movil por medio de una red wifi se que el raspberry no cuenta con wifi integrado pero tenemos la intencion de poder proporcionarcelo atravez de una pequeña antena conectada al puerto usb.

    mi punto es saber que plataforma para la rasbperry me recomiendas entre linux o pidora, rics. para que me sea un poco mas accesible poder progrmaar los puertos gpio
    espero tu respuesta

    gracias

  10. Reply Harry Ago 29, 2013 4:28 pm

    Hola! Soy nuevo en esto de las raspberry Pi y me prenguntaba si podria ser posible usar la raspberry pi para procesar una señal de video que luego mandaria por el puerto RCA a un TV. Mi idea es hacer un manificador de CCTV con la ayuda de la raspi.

  11. Reply David Oct 20, 2015 10:32 pm

    Hola! Saludos a todos. Gracias por explicar el tema del GPIO. Actualmente estoy diseñando un robot y necesito controlar 3 motores paso a paso y 3 microservos. He visto que puedo controlar los servos añadiendo a la Pi una placa Adafruit Servo Hat, y que hay otra placa que permite controlar dos (o tres, no recuerdo) motores paso a paso, aunque ahora no recuerdo bien su nombre. Mi pregunta es: ¿puedo controlar los motores paso a paso con la Servo Hat? Si no, ¿puedo apilar las placas para conseguir controlar todos los motores?

    Gracias!!

Leave a Reply

  

  

  

  Bitcoin Currency Converter
Amount of BTC to convert
To currency:
1BTC =