LIBRERIA WIRINGPI. Programa en tu Raspberry Pi como si fuera un Arduino y en C

WirinPi es una librería escrita en C y liberada baja licencia GNU LGPLv3, que puede ser empleada en varios lenguajes de programación, además de C y C++, con alguna pequeña modificación en forma de adaptación.

Su principal uso es en la programación de periféricos a través de los 26 pines de General Purpose Input Output (GPIO).
WiringPi, además, ofrece un comando que permite programar y configurar los pines de la GPIO, pudiendo efectuar la lectura y escritura de los pines desde la línea de comandos o incluso, incorporándola en un Shellscript.
Instalación utilizando GIT
Git es un software de control de versiones, libre y de código abierto, diseñado para manejar todo tipo de proyectos, desde pequeños a grandes con rapidez y eficiencia.
En caso de no estar instalado GIT se debería instalar. Para ello en primer lugar hay que actualizar los repositorios y posteriormente instalarlo.
sudo apt-get update sudo apt-get install git-core
Posteriormente hay que obtener la libreria mediante GIT
git clone git://git.drogon.net/wiringPi
Una vez descargado, hay que ir al directorio donde se encuentra y obtener una versión actualida.
cd wiringPi
git pull origin
A continuación, se debe ejecutar el script de creación e instalación en el directorio de WiringPi.
./build
El nuevo script se encarga de compilar y ejecutar todo, sin que sea necesaria la intervención del usuario. 
Descargando la librería.
Se va a proceder a descargar la aplicación en el directorio temporal /tmp.
cd /tmp
wget http://project-downloads.drogon.net/files/wiringPi.tgz
A continuación hay que desempaquetar el fichero.
tar xfz wiringPi.tgz
En este momento, se va a proceder a instalar las librerías relacionadas con wiringPi.
cd wiringPi/wiringPi
make
sudo make install
A continuación, se va a instalar la herramienta gpio, que permite en línea de comandos trabajar con los pines.
cd ../gpio make sudo make install
Finalmente, se van a instalar los ejemplos.
cd ../examples
make
Utilización
Para poder utilizar esta librería es necesario indicar que se va a emplear, en la primera parte del programa se incorpora la cabecera de la librería (#include<wiringPi.h ) y en la compilación se especifica que utilice la misma (gcc –o pruebas -l wiringPi pruebas.c).
Principales constantes y funciones de la librería
Funciones constructoras
Hay tres funciones constructoras que permiten trabajar con la librería Wiring Pi, todas ellas devuelven -1 en caso de que se produzca un error.
  • int wiringPiSetup(void) : Inicializa Wiring Pi y emplea el convenio de numeración de Wiring Pi.
A continuación se muestra la tabla resumen de los pines GPIO para la versión 1.
Ping wiringPi BCM GPIO Name Header Name BCM GPIO Ping wiringPi
3.3v 1 | 2 5v
8 R1:0/R2:2 SDA0 3 | 4 DNC
9 R1:1/R2:3 SCL0 5 | 6 0v
7 4 GPIO7 7 | 8 TxD 14 15
DNC 9 | 10 RxD 15 16
0 17 GPIO0 11 | 12 GPIO1 18 1
2 R1:21/R2:27 GPIO2 13 | 14 DNC
3 22 GPIO3 15 | 16 GPIO4 23 4
DNC 17 | 18 GPIO5 24 5
12 10 MOSI 19 | 20 DNC
13 9 MISO 21 | 22 GPIO6 25 6
14 11 SCLK 23 | 24 CE0 8 10
DNC 25 | 26 CE1 7 11
Para la revisión 2
Ping wiringPi BCM GPIO Name Header Name BCM GPIO Ping wiringPi
5v 1 | 2 3.3v
17 28 GPIO8 3 | 4 GPIO9 29 18
19 30 GPIO10 5 | 6 GPIO11 31 20
0v 7 | 8 0v
  • int wiringPiSetupGpio(void) : Idéntica a la anterior, pero utiliza la numeración de pines de Broadcom (BCM GPIO).
  • int wiringPiSetupSys(void) : En este caso utiliza la interfaz /sys/class/gpio, en vez de trabajar directamente sobre el Hardware.
Funciones generales
  • void pinMode(int pin, int mode) : Sirve para especificar el pin (primer argumento) y modo (segundo argumento), que puede ser entrada (INPUT), salida (OUTPUT) o salida PWM (PWM_OUTPUT).
  • void digitalWrite(int pin, int value) : Se utiliza para poner un pin, que previamente ha sido configurado como OUTPUT a dos posibles valores 1 (HIGH) o 0 (LOW).
  • void digitalWriteByte(int value) : Permite escribir en los 8 pines de la GPIO un valor.
  • void pwmWrite(int pin, int value) : Escribe el valor del registro PWM (segundo argumento) al pin indicado (primer argumento). El valor suministrado debe estar comprendido entre 0 y 1024, además, hay que tener en cuenta que sólo soporta PWM el pin BCM_GPIO 18.
  • int digitalRead(int pin) : devuelve el valor leído en el pin indicado (único argumento), que puede ser 1 (HIGH) o 0 (LOW).
  • void pullUpDnControl(int pin, int pud) : establece sobre el pin indicado (primer argumento) el modo de tensión o resistencia, elevar a 3v3 ( PUD_UP), tirar a tierra (PUD_DOWN) o ni elevar ni disminuir (PUD_OFF).
Funciones de control PWM
Las siglas PWM corresponden a pulse-width modulation, en castellano, Modulación por ancho de pulsos, consistente en cambiar el ciclo de una señal periódica. No se pueden utilizar cuando se trabaja en modo sistema (mode sys).
  • void pwmSetMode(int mode) : El generador puede trabajar en dos modos balanceado ( PWM_MODE_BAL ), que es el que utiliza por defecto Raspberry Pi o marca espacio (PWM_MODE_MS) .
  • void pwmSetRange(unsigned int range) : Establece el valor máximo del rango del registro PWM, establecido por defecto a 1024.
  • void pwmSetClock(int divisor) : Sirve para establecer el divisor del reloj PWM.
Funciones de tiempo
  • unsigned int millis(void) : Devuelve el numero de milisegundos que han transcurrido desde que se ha invocado a una función Wiring Pi.
  • void delay(unsigned int howLong) : Provoca la pausa del programa durante al menos howLong milisegundos.
  • void delayMicroseconds(unsigned int howLong) : Análogo al anterior, pero en este caso se estabecen microsegundos.
Program/Thread Priority
  • int piHiPri(int priority) : sirve para establecer la prioridad del programa o thread, que oscila entre 0 ,valor establecida por defecto y 99 valor máximo y permite la planificación en tiempo real. El valor devuelto es 0 en caso de éxito y -1 en caso de error. Sólo los programas ejecutados como root pueden cambiar su prioridad.
Funciones de interrupciones
  • int waitForInterrupt(int pin, int timeOut) : permite establecer un tiempo de espera en milisegundos (segundo argumento) para una interrupción definida sobre un pin ( primer argumento), en el caso de definir como timeOut -1 esperará indefinidamente. El valor devuelto es 0 en caso de éxito y -1 en caso de error. Esta función está obsoleta y se recomienda utilizar la que se presenta a continuación.
  • int wiringPiISR(int pin, int edgeType,  void (*function)(void)) : mediante esta function se puede establecer un manejador sobre un pin, además se debe especificar si se detecta mediante un flanco de bajada (INT_EDGE_FALLING) , un flanco de subida (INT_EDGE_RISING ), en ambos flancos (INT_EDGE_BOTH) o el pin no ha sido inicializado (INT_EDGE_SETUP). El valor devuelto es 0 en caso de éxito y -1 en caso de error.
Funciones de programación concurrente
Wiring Pi permite la utilización de hilos POSIX, así como mecanismos de exclusión mutua (mutex).
  • int piThreadCreate(void * (* fn) (void *) : Crea un Thread de una función que ha sido declarada previamente mediante PI_THREAD. La declaración sería similar a PI_TREAD(miThread){ código } y posteriormente, esta función será el argumento de la función. El valor devuelto es 0 en caso de éxito y -1 en caso de error.
  • void piLock(int keyNum) : bloquea una clave (keyNum) cuyo valor va de 0 a 3, cuando otro thread intenta bloquear a la clave, queda a la espera de que sea liberado.
  • void piUnlock(int keyNum) : Permite desbloquear una clave definida como en la función anterior.
Otras funciones
  • int piBoardRev(void) : indica la versión de la placa sobre la que se está trabajando.
  • int wpiPinToGpio(int wPiPin) : transforma el número de pin según el convenio de Wiring Pi al convenio de BCM GPIO.
  • void setPadDrive(int group, int value) : establece la “fuerza” de los drivers para un grupo de pins. 

Related Articles

Este espacio lo he creado pensando en los entusiastas como tú, para compartir y centralizar documentación sobre temas que me apasionan: Arduino, impresoras 3D, Raspberry Pi, y mucho más.

Además, he querido fusionarlo con mi canal de YouTube, donde exploramos retro-informática, Raspberry Pi, consolas retro, electrónica y otras maravillas del mundo tecnológico. Este es tu sitio si disfrutas aprendiendo, creando y reviviendo lo mejor de la tecnología de ayer y hoy.

¡Bienvenido!