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
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
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
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
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.