Raspberry y GPIO
Material requerido.
Una Raspberry Pi 3, aunque valen la 2 y la 1
|
La Computación física
Resulta sorprendente si os paráis a pensarlo. Hubiera sido bastante sencillo dotar una pequeña caja con digamos un par de docenas de conectores tipo los de Arduino y conectarlo por USB a la CPU y se hubiera abierto un mundo de posibilidades nuevas. Pero hasta donde yo conozco o a nadie se le ocurrió o nunca tuvo éxito la idea y sin embargo nuestros Arduinos son precisamente eso. Un sistema que nos permite leer el mundo exterior e influir en el mediante señales y los adaptadores adecuados (Como transistores, relés o motores) y se abrió una nueva área en las ciencias de computación: Lo que ha venido en llamarse Computación física. Es una manera de decir que el resultado de una computación no es necesariamente un dato, calculado o buscado en una base de datos, ni tampoco una imagen en nuestro desplay, sino simpe y llanamente una acción que se ejerce sobre el mundo exterior físico. Y esto queridos amigos ha sido una idea revolucionaria que ha generado todo el movimiento Makers pero que va mucho más allá. Desde otro punto de vista, al pasar de considerar el mundo exterior como ajeno e incluirlo en nuestros programas, se ha generado una cultura nueva que incluye el mundo real en la computación y que ha llevado a la sorprendente idea de que ahora no solo computamos con bits, sino que se ha abierto la posibilidad de computar con átomos (From bits to atoms) Es decir que el resultado de nuestros cálculos afectan al mundo exterior ¿Y porque no vamos entonces a construir componentes en el mundo real como resultados de estos cálculos? Esto implica la impresión 3D, sí, pero no solo. ¿Por qué no diseñar directamente encimas que se fabrican como resultado en el mundo real? Arduino puede estar orgulloso, abrió el camino hace ya casi 10 años y cada vez más equipos se unen a esta tendencia. Y una de las más interesantes, que no la última, son las Raspberry Pi que ahora nos ocupan. Del mismo modo que Arduino disponía de una serie de pines que podíamos conectar al mundo exterior para leer o escribir, nuestra Raspberry dispone de otra serie de pines homólogos que en la jerga habitual de la RPI se llaman GPIO (General Purpose Input Output) El objetivo de este humilde capitulo es presentar a los pines GPIO y cómo usarlos en Python, que es la manera más sensata de usarlos, y para ello tendremos que empezar hablando de los varias versiones que ha habido y de cómo numerarlos (Que hay todo un lio con el tema) Nuestro propósito es empezar a enredar con los GPIO y de alguna manera aprender a programar en Python jugando con los pines de la misma forma que lo hicimos con Arduino porque de algún modo, siempre es más interesante ver el resultado en forma de motores que giran o LED que se iluminan, que con números e impresiones en pantalla.
Raspberry Pi GPIO
Ha fecha de hoy hay al menos tres revisiones mayores de la Raspberry Pi y cada una de ellas con varias versiones menores. En el momento de escribir estas líneas la última es una Raspberry Pi 3 modelo B.
La cantidad de pines disponibles en el GPIO ha variado de unas versiones a otras, manteniendo la compatibilidad con las versiones anteriores para evitar problemas, y a grandes rasgos ha habido dos versiones de GPIO.
La gran variación fue de la Raspi 1 a la Raspi 2 que aumentó el número de pines disponibles y que básicamente podéis ver aquí:
Como podéis ver el número de pines disponibles pasó de 26 a 40 para tener más disponibilidad. La forma de referirse a los pines debería ser sencilla: Tengo impares a un lado y los pares al otro. Así pues los voy numerando consecutivamente de acuerdo con su orden y no habría dudas, más o menos como en Arduino.
A esta forma de numerar se le suele conocer como modo GPIO, Pero claro, que ya sabéis que las cosas rara vez son así de sencillas y siempre hay gente que le gusta complicar todo y surgió una nube de gente diciendo que prefiere la forma de numerar no de acuerdo a la posición de los pines en la salida, sino a la posición de los pines correspondientes en el chip Broadcom que es la CPU de la Raspberry, y a esta segunda manera se la llama modo BCM.
Por ese motivo podéis encontraros con dos formas distintas de referirse a los pines, GPIO según los números del conector externo o BCM según los pines del chip que revuelven las posiciones. No tiene por qué ser mejor una que otra (Aunque me rechinen los dientes al decirlo) pero es importante asegurarse de cuál de las dos estáis usando o la cosa acabará yendo a la tienda comprar una Raspberry nueva. Volveremos sobre esto pronto.
Aquí os paso una imagen de ambos GPIO y de sus equivalencias:
La Raspi 1 solo disponía de los 26 primeros conectores, mientras que la 2 y la 3 van “full equipe” disponen de los 40 completos.
Fíjate también, que los pines se numeran de forma consecutiva en el modo GPIO, mientras que están bastante revueltos en el modo BCM, pero que le vamos a hacer.
Como la cosa no estaba suficientemente revuelta y liosa, la fundación Raspberry Pi decidió colaborar alegremente con la confusión, eliminándo la numeración de los pines de los GPIO en las serigrafías de la placa, con lo que si antes ya había lío, después abundan los gritos.
Para que lo tengáis claros el pin numero 1 es el que está más cerca de la tarjeta SD. Toda esa fila son los impares y la otra fila son los pares claro está.
Es importante que comprendáis este pequeño follón, porque cuando vayamos a programar pines en el GPIO con Python, tendremos que empezar diciéndole cual de los dos sistemas de descripción de pines vamos a a usar
ALGUNAS ADVERTENCIAS
Todos hemos quedado algún Arduino (Yo unos cuantos) pero de algún modo, Arduino es notablemente tolerante con las meteduras de pata. Puedes equivocarte bastante sin que se queme nada y por regla general hay que empeñarse para fundir uno.
Pero la Raspberry funciona a 3.3V y es mucho menos amiga de bromas. Cuando vayáis a utilizar los GPIO tenéis que aseguraros de que no hay errores en la conexión y de que no habéis hecho ninguna tontería, porque el chip Broadcom se quema a la primera de cambio y recordad que son 40 euritos de nada.
Basta con que conectes 5V tranquilamente aun pin de tu Raspi y tienes muchos boletos para la rifa de una nueva. No tiene ninguna gracia quemar una Raspberry y además aunque baratas, te cuesta lo que una cena en un sitio regular. Es importante asegurarse de donde pinchas el cable.
Tu Raspberry funciona como ya dijimos a 3.3V (Toda la nueva electrónica va a 3.3V iros acostumbrando) y en muchas ocasiones tenemos elemento que son de 5V que intentamos conectar alegremente. Mucho ojo con esto o de lo contrario os ganareis un ruidito raro con olor a quemado.
También es importante saber que Arduino puede proporcionar unos 40 mA por pin, pero tu Raspi da un máximo de 3mA. Más que suficiente para que hagamos brillar un led, pero muy poco más. Por ejemplo nada de conectar relés directamente sin estar seguros, y mucho menos motores a un pin.
Este tipo de bromas os costaran 40 € y una visita a la web a comprar la nueva Raspberry (Si tienes la Raspi 1, puede ser una buena forma de que te animes a cambiarla)
También aparece aquí otra cuestión. Si te fijas en la descripción de los pines GPIO, veras que la Raspberry dispone de una puerta serie y además un puerto SPI y otro I2C, con los que hemos jugado largo y tendido en los tutoriales de Arduino para conectar desde relojes a pantallas LCD
Además hay disponibles una serie de pines digitales para Input / Output e incluso alguno de ellos disponen de capacidad PWM (De la ya hablamos en Arduino y volveremos más adelante). Pero por más que busques no encontraras ningún puerto o convertidor Analógico a digital, ni la inversa.
No hay y punto.
Llegados que es cuando empiezan los gritos y gemidos. ¿Cómo que no hay puertos analógicos? ¿No puede ser? ¿Y cómo leemos los sensores analógicos? Repito: No hay.
Si queremos leer un sensor que nos devuelve un valor analógico proporcional al valor medido, vamos a necesitar un convertidor externo, que puede ser un chip o nuestro venerable Arduino, pero tendremos que usar un hardware externo porque la Raspi no lo incluye.
Tranquilos que no es demasiado grave. Lo supliremos con facilidad, normalmente usando un Arduino adicional, pero es importante que tengáis esto claro, .
Además hay otra cuestión que es importante despejar desde ya aquí: el tema de la velocidad.
La velocidad de respuesta de Raspberry Pi
Un Arduino UNO funciona con un reloj de 16 Mhz mientras que la nueva Raspberry 3 viene con un clock a 1.2 Ghz. Es decir:
1.2 Ghz / 16 Mhz = 1.200.000.000 / 16.000.000 = 75 veces más rápida.
Por tanto la Raspberry correrá como en galgo para la leer los GPIO comparado con la velocidad de tu Arduino ¿No? Parece claro.
Pues de nuevo, podéis encontraros con alguna sorpresa en esto y acabar llegando a la conclusión que para ciertas cosas tu Arduino es más rápido y sobre todo mucho más confiable.Veamos.
Si te has acostumbrado a Arduino, es posible de que no te hayas dado cuenta de que Arduino no tiene sistema operativo. Es decir que cuando le vuelcas un programa, se dedica a ejecutarlo en cuerpo y alma y no hace ninguna otra cosa, por lo que puedes medir cuánto tarda en hacer algo y cada cuanto tiempo va a volver a pasar por el loop para asegurarte de que una tarea se efectúa cada cierto tiempo.
Pero la Raspberry corre un sistema operativo Linux llamado Raspbian, que aunque lo han aligerado de cosas, en cualquier momento tienes corriendo varias docenas de tareas diferentes pudiendo llegar a varios cientos, cada una con sus propios problemas y objetivos y además con distintos niveles de prioridad.
En la práctica esto significa que no podrás predecir cada cuanto tiempo pasar tu Raspberry a hacer una instrucción en concreto que coloques en el loop, porque depende de las otras tareas que estén arrancadas (Muchas de las cuales ni siquiera llegarás a ver en tu vida, pero que son imprescindibles para la gestión del sistema operativo)
Por ese mismo motivo correr un loop en Raspberry puede tardar 2 mili segundos cien veces seguidas hoy y sin embargo tardar 18 ms mañana y si tu chisme se quema para entonces es problema tuyo. A esto se le dice que Linux no es un sistema de tiempo real (RTS) mientras que Arduino si lo es (Porque no hay nadie más)
Todo esto nos lleva a esa vieja cuestión de si es mejor Arduino o Raspberry y si son competencia o más bien se complementan.
Yo soy decididamente partidario de esa segunda opinión, No montaría un servidor de correo en Arduino pero tampoco montaría el control de un robot industrial en Raspberry. Hay veces que necesitamos la seguridad y la rapidez de un Arduino para responder a un evento o interrupción a la máxima velocidad posible, y otras veces necesitamos un PC que me permita usar Python cómodamente y montar un gráfico con los valores analógicos que ha leído Arduino y enviarlos a una página web.
En las próximas sesiones iremos avanzando en esta idea de colaboración entre ambas plataformas porque creo que es con mucho la mejor opción disponible, y porque al final cada plataforma brilla en ciertas cosas. Porque iba a renunciar a una pudiendo tener a las dos.
Resumen de la sesión