viernes, 2 de junio de 2017

Control de GPIO con Python

Una gran fuente de posibilidades de nuestra Raspberry Pi es el conector de entradas y salidas, GPIO. 

Su control desde Python es relativamente fácil. Debemos saber el funcionamiento de cada pin antes de hacer nuestro diseño, ya que hay algunos destinados a la comunicación, etc. La única deficiencia es que no tienen ninguna entrada de lectura analógica. 


Como podemos ver, contamos con dos pines de alimentación de 5V, otros tantos de 3.3V (limitados a 50mA) y cinco de tierra (GND). 

Por otra parte  tenemos 17 pines digitales cuyo estado puede ser HIGH (un voltaje entre 2 y 3.3) o LOW (entre 0 y 0.8). Los voltajes entre 0.8 y 2 serán obviados. 

Tenemos que tener en cuenta que estamos trabajando con un dispositivo que maneja niveles lógicos de hasta 3.3V, esto significa que en ningún caso deberemos alimentar ninguno de los pines digitales con un voltaje superior.

Interfaz GPIO

  • Los niveles de voltaje GPIO son de 3,3 V y no tolera 5 V. No hay protección de sobre-voltaje en la placa.
  • Todos los pines GPIO pueden ser reconfigurados para proporcionar funciones alternas, SPI, PWM, I²C y así sucesivamente.
  • Todos los pines UART, SPI e I2C pueden reconfigurarse como GPIO si fuese necesario.
  • Para el uso del I2C, los pines 5 y 3 (SCL0 y SDA0) deberán de tener una pullup de 1K8 Ohm.
  • Cada pin GPIO puede generar una interrupción por cambio de nivel “raising/falling”.
  • La histéresis (Schmitt trigger) de entrada en los GPIO, puede estar ON/OFF.
  • El slew rate de salida puede ser rápido o limitarse.
  • La corriente de salida puede configurarse entre 2mA y 16mA.
  • Habrá que poner atención a los cambios simultáneos en las salidas (SSO). Para evitar interferencias, las corrientes de salida deben mantenerse lo más bajas posible.
  • El uso de la UART, de fábrica viene configurado como un puerto de "consola" para monitorear el funcionamiento del RasPI a 115200 bits/s.
  • El uso de muchos pines I/O simultáneamente puede hacer que suba la tensión de GND.
  • Debemos seleccionar siempre la GND más cercana al pin que estemos usando.
  • Los pull down internos no funcionan del todo bien (se activan las entradas con ruido).
Sistemas de numeración de pines

Hay 2 sistemas de numeración de los pines GPIO: BCM y BOARD: 

  • El sistema BCM usa el número de pin GPIO correspondiente. 
  • En el sistema BOARD la numeración se basa en el orden de los pines de arriba hacia abajo de la placa. 
En esta imagen se aprecia mejor la diferencia entre los dos sistemas:


Configuración

Para el control de los pines I/O, la cabecera del programa deberá configurar esas entradas y salidas. 

GPIO.setmode(GPIO.BCM) # Establecemos el sistema de numeración de pins BCM GPIO.setwarnings(False) # Deshabilita los avisos

Los comandos para las entradas  (podemos añadir Pull_up o Pull_down):

GPIO.setup(btnStop, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(btnBajar, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

Los comandos para las salidas (podemos seleccionar el estado inicial):

GPIO.setup(outSubir, GPIO.OUT, initial=GPIO.HIGH) 
GPIO.setup(outBajar, GPIO.OUT, initial=GPIO.LOW)


Cerrar procesos:

Es común cuando trabajamos con el módulo GPIO, que por un error del programa, el canal se quede en ejecución al no ser cerrado adecuadamente, generando un error. Esto permite que el programa se ejecute, pero no se pueda acceder al puerto. Para solucionarlo, deberemos cerrar el proceso. 

Podemos comprobar si tenemos algún GPIO activo con el siguiente comando:

ls /sys/class/gpio

En caso de haber alguno activo y querer cerrarlo, debemos buscar el número del proceso:

ps aux | grep python

Cuando hayamos identificado el proceso que queremos "matar", lo finalizaremos con la siguiente instrucción:

sudo kill -9 xxxx

Donde xxxx se corresponde con el número de dicho proceso. 

Para que no suceda esto, debemos utilizar en todos los programas las siguientes líneas:

try:
     main
except: KeyboardInterrupt:
     GPIO.cleanup()


El comando "try" engloba todo el programa (main) y se interrumpe si ocurre alguna excepción.

El comando "except" hace que lo que está a continuación se ejecute cuando ocurra una excepción.


No hay comentarios:

Publicar un comentario