Conector GPIO de Raspberry Pi

En este post te vamos a mostrar el conector GPIO de Raspberry Pi 3, detallaremos los pines y procederemos al manejo básico de los pines I/O usando la shell.

 

¿Qué es GPIO?

General Purpose Input Output (GPIO) es un sistema de entrada y salida de propósito general, es decir, consta de una serie de pines o conexiones que se pueden usar como entradas o salidas para múltiples usos. Estos pines están incluidos en todos los modelos de Raspberry Pi aunque con diferencias.

 

 
 
 

Tipos de puerto GPIO según modelos

Todas las placas y revisiones no disponen de esquemas GPIO iguales. Aquí te ofrecemos todos los esquemas de las diferentes placas que existen por el momento. En las siguientes imágenes podemos apreciar los distintos layouts de los modelos existentes por el momento.

Como puedes comprobar, existen tres esquemas básicos. Los de la revisión 1.0 del modelo B, los incluidos en la revisión 2.0 del modelo A y B, y los modernos A+, B+, 2, 3B, 3B+ y las Zero que comparten el mismo esquema de conexiones.

 

 

La placa base

La Rasberry PI, es un dispositivos de bajo coste (Low Cost Single Board Computers), que quiere decir que es un ordenador completo, de bajo consumo, con características modestas que está contenido en una placa un poco mayor que una tarjeta de crédito. Hay de varias marcas, distintos precios y diseños. El más común es de marca Raspberry. Fue también el primero en tener una acogida masiva. Hay otras marcas como ODroid o Banana Pi, cada uno con sus características y sus precios.

Conector GPIO de Raspberry Pi
Pines del conector GPIO de la Raspberry Pi 3

La versión de Rasberry Pi con la que vamos a trabajar es la 3, salió en febrero de 2016 y cuenta con WiFi incorporada, Ethernet, varios puertos USB, HDMI y conectores para cámara, display, etc. Está basada en el BCM2837, evolución del BCM2835, un SoC (System on Chip) de Broadcom bien conocido. Un System on Chip no es más que un procesador, GPU y demás funciones integradas en un sólo componente. Se parece mucho a la electrónica de un smartphone. Este modelo es un ARM de 64bits a 1.2GHz, quad core y con 1Gb de RAM.

De la arquitectura no puedo contar mucho, ya que Raspberry no es Open Hardware. Hay disponibles versiones reducidas del esquema eléctrico, pero por hasta la fecha no hay intención de liberar el esquema completo. Por tanto muchos de los resultados se basan en la experimentación.

El chip que controla los puertos USB y la conexión Ethernet es el mismo, un LAN9514 de Microchip, produciendo un cuello de botella. Tened esto en cuenta si planeáis usarlo como NAS. Dado el precio del integrado y el uso general al que se destina el producto me parece una decisión de diseño más que razonable.

Lo importante es que todas las versiones cuentan con una conexión GPIO (General Purpose Input Output) triestado. Es decir salida nivel alto, bajo y alta impedancia -input-, como las de un microcontrolador. Al fin y al cabo son los mismos pines del BCM expuestos para nosotros. Eso sí, importante, funcionan a 3.3v y no a 5v y carecen de cualquier tipo de protección. No suele haber problema en conectarlas a 5v con una resistencia, pero es algo que el datasheet prohíbe expresamente, así que allá vosotros.

 

 

Equipamiento

El adaptador, para un uso ocasional sirve perfectamente con un cargador de móvil de 5v. Eso sí, en cuanto queráis conectar un disco duro externo, por ejemplo, se os va a venir abajo. Recomiendan un cargador de 3 amperios, que también os puede servir para cargar un móvil que soporte carga rápida.

¿Disipador? No es malo pero tampoco lo necesita. Si queréis ponerlo tened en cuenta que las cajas como la de arriba sólo están preparadas para poner disipador en el chip principal.

El sistema operativo va en una tarjeta Micro SD, el tamaño no importa siempre que quepa el sistema operativo y el software que queráis instalar, el mínimo sin entorno gráfico diría que una de 2Gb.

Otros accesorios que considero muy útiles son un latiguillo de cable de red Ethernet para conectarla al router o al PC y un conector USB-Serie sobre todo para los que uséis portátil. Veremos por qué más adelante.

 

 

Primeros pasos

El SO probado es Raspbian. Hay versión con entorno gráfico y versión sin él. Como sólo me conecto por ssh puedo instalar la versión ligera.

Para instalar el sistema operativo basta descomprimirlo y copiar la imagen en una SD. Viene preconfigurada con un cliente dhcp y el demonio Avahi habilitado con el nombre raspberrypi.local. Lo cual, si usáis linux, os va permitir acceder a ella con ese nombre por ssh en cuanto la conectéis a la red cableada. ¿Y si uso Windows? Bueno pues Windows no soporta de manera nativa el protocolo mDNS (DNS por multicast) así que no reconocerá el nombre. Podéis mirar en el router para saber qué IP le ha asignado en la red.

Si el SSH no funciona o se estropea por lo que sea, o si no tenemos cable de red y sólo podemos conectarla por wifi nos quedan aún dos opciones para comunicarnos con la Raspberry. Una obvia es conectar un teclado por USB y un monitor HDMI.

La otra, si sólo tenemos portátil y no disponemos de teclado o de monitor HDMI. En ese caso sólo nos queda una opción: la consola serie. La versión de raspbian que he probado tiene habilitada la consola serie por defecto. Para eso os recomendaba antes contar con un conector usb-serie. La configuración serie es 115200-8N1.

 

 

Pinout GPIO

El chip BCM2835 tiene una serie de registros que son los que controlan las entradas y salidas de propósito general (gpio). Por hardware, esos registros se mapean en un rango de memoria accesible por el sistema operativo. De esta forma podemos interactuar con ellos desde nuestro programa.

Habitualmente el acceso a memoria sólo se podría hacer como root, sin embargo hay un driver llamado gpiomem, que se encarga de mapear ese rango concreto de forma que sea accesible por el usuario.

La conexión gpio de este modelo tiene 40pin, con un conector igual al que usaban los discos duros IDE hace tiempo. Venden cables para conectarlos con una protoboard, pero no os lo recomiendo a menos que sólo vayáis a usar la Raspberry para experimentar porque estas clavijas una vez encajadas cuesta mucho quitarlas y se rompen con facilidad. En su lugar es preferible que compréis cables con conectores Dupont hembra-hembra y también macho-hembra.

Conector GPIO de Raspberry Pi
Identificación de los pines dela Rasberry PI 3

Entre los 40 terminales tenemos

 

  • 24 terminales de entrada / salida de propósito general, con pull up y pull down independientes programables por software.
  • Un módulo UART, entrada y salida.
  • Dos canales PWM con DC independiente y dos modos de operación.
  • Un bus I2C.
  • Dos buses SPI.

 

Lógicamente todas estas funciones se pueden emular también por software en caso necesario, por supuesto con menor rendimiento que con el hardware nativo. Muchas librerías para Raspberry lo incluyen.

Por contra hemos de decir que no tenemos otros extras que incorporan algunos microcontroladores tales como entradas analógicas o comparadores accesibles desde el software.

 

 

Detalles de los pines:

 

Terminales de +5V. Van conectados a la alimentación, detrás del fusible térmico de protección. Hay una cosa curiosa y es que pasado el fusible, las pistas de 5V de alimentación y de USB van unidas, por lo que técnicamente podríais alimentar la Raspberry desde el USB o desde GPIO. No se recomienda ya que habréis anulado el fusible de protección y cualquier corto que ocasionéis podría tener graves consecuencias. El fusible es de 2.5A en los modelos modernos (de tipo MF-MSMF250), por lo que restando el consumo de la Raspberry que son unos 600mA, podemos consumir más de 1A de estos pines. Siempre y cuando el adaptador de red lo dé, claro está.

Terminales de +3.3V. En las versiones anteriores a la 3 esta tensión la proporcionaba el propio chip por lo que no podía suministrar más de 50mA y eso es lo que leeréis en multitud de foros. Sin embargo en las más modernas se utiliza un conversor conmutado PAM2306, el cual según su datasheet podría proporcionar hasta 1A. Es el mismo conversor al que va conectado el chip así que tened cuidado y no abuséis de él.

Terminales de GPIO. Es la conexión para periféricos del BCM.

Equivalente electrónico de un terminal GPIO

En general cada pin se puede configurar individualmente para funcionar como una salida o entrada de alta impedancia, con posibilidad de tener pull-up y pull-down ambas de 50kohm.

La tensión aplicada a una entrada no debería nunca ser superior ni inferior a la tensión de alimentación del integrado. Es decir, debe estar entre 0 y 3.3V. Los diodos que veis apenas llevan corriente y no serán capaces de mitigar una sobretensión en las entradas.

En caso de usar la patilla como salida, tendrá un nivel de entre 0 y 3.3V. Las especificaciones dicen que no debemos exceder los 50mA de consumo entre todas las salidas. Se refiere a cuando consumamos corriente de una salida que esté a nivel 1, por ejemplo alimentando un LED con el otro terminal a masa. La restricción no aplica cuando hablamos de nivel 0 y lo que hacemos es drenar corriente hacia masa, por ejemplo si el LED estuviera conectado entre el positivo y una salida GPIO. Esto es porque la pista interna del procesador que lleva la tensión positiva de 3.3V es mucho más débil que los mosfets que drenan la corriente hacia masa. La realidad es que estos chips suelen ser bastante resistentes, pero no olvidéis que carecen de protección.

Cada patilla, además de I/O puede tener funciones alternativas tal como I2C, UART o PWM.

El primer punto problemático es la numeración.

 

Básicamente hay 3 sistemas:

 

  • El etiquetado que sigue el BCM2837. Es decir los nombres GPIO4, GPIO7, etc. Es el que se indica en la caja Pibow.
  • El número de terminal físico del conector de 40 pin.
  • La numeración de wiringPi, que usa numeración propia pero a diferencia de las anteriores no varía entre versiones de Raspberry Pi.

Así pues, tenemos el GPIO7, que en numeración de BCM es el 4, corresponde al pin 7 del conector y lleva la numeración WiringPi 7.

O también tenemos el terminal número 3 del conector, cuyo nombre es SDA. En la revisión 1 de Raspberry fue GPIO0 y en la siguiente versión fue el 2. Mientras que en WiringPi se numera como 8.

Sí, es un jaleo sobre todo en nuestros primeros proyectos. Cuando utilicéis código de ejemplo de alguna página debéis estar atentos a la numeración que siguen porque será vuestra principal fuente de errores.

 

 

I/O directo

La forma más sencilla de activar y desactivar un puerto, o de leer el estado es utilizando el acceso a la memoria que nos expone gpiomem en forma de sistema de ficheros bajo la jerarquía /sys/class/gpio.

Dependiendo de la distribución de linux y su configuración podremos hacer este procedimiento como usuario o necesitaremos ser root.

Lo primero que haremos es “exportar” la patilla que queramos manejar. Así por ejemplo si queremos utilizar la GPIO11 (llamada SCLK, que corresponde al terminal número 23, y al WiringPi 14) ejecutaremos el comando:

 

echo 11 > /sys/class/gpio/export

 

Si ahora listamos el directorio /sys/class/gpio nos habrá creado un subdirectorio llamado /sys/class/gpio/gpio11. Si queremos que GPIO11 actúe como una entrada usaremos

 

echo in > /sys/class/gpio/gpio11/direction

 

Y leeremos su valor reflejado en el fichero value:

 

$ cat /sys/class/gpio11/value 0

 

Mientras que si queremos que sea una salida, usaremos

 

echo out > /sys/class/gpio/gpio11/direction

 

y escribiremos el valor donde antes lo leíamos:

 

echo 1 > /sys/class/gpio/gpio11/value

 

 

I/O básico con ayuda de gpio

El método anterior es muy sencillo para probar aunque está bastante limitado. No se puede activar la resistencia de pull up o pull down por hardware, por ejemplo.

La siguiente manera más sencilla es utilizando la interfaz por línea de comandos de WiringPi gpio. En Raspbian basta instalar el paquete llamado wiringpi. Incluye la línea de comandos y también las cabeceras C que usaremos en otros artículos. Hay más librerías, pero de momento los ejemplos los haremos con WiringPi.

La idea es tener una herramienta por linea de comandos, que sin programar nos permita hacer uso de ciertas características avanzadas de GPIO, tal como pull up/down, detección de flanco de subida/bajada, i2c, spi, etc.

Veamos cómo se haría para encender y apagar un LED a intervalos regulares (el programa equivalente a Hello World pero en electrónica). Sería fijar un pin como salida, ponerlo a 1, esperar un momento, ponerlo a 0, esperar un momento y repetir.

 

gpio mode 25 out
while (true)
do
   gpio write 25 0
   sleep 0.5
   gpio write 25 1
   sleep 0.5
done

 

En el ejemplo hemos elegido el pin 25, que equivale al 26 según la numeración del BCM, que también es la GPIO26 (aunque en algunos sitios también aparece como GPIO25) y que en el conector físico es el pin número 37.

Leer el estado es igual de fácil, fijando la patilla como entrada y configurando el pull up o pull down:

 

$ gpio mode 25 in
$ gpio mode 25 up
$ gpio read 25
1

$ gpio mode 25 down
$ gpio read 25
0

 

Quizá una de las características más útiles es leer el estado de toda la interfaz GPIO y mostrarlo en forma de tabla; además nos sirve como tabla de equivalencia entre las diferentes numeraciones:

Tabla de equivalencia obtenida al ejecutar gpio readall

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies