Wiringpi y raspberry pi

Standard

Hola a todos de nuevo,  otra vez tengo la oportunidad de compartir con ustedes un pequeño espacio, y en esta ocasión seguiremos con la biblioteca llamada “Wiring Pi” para Raspberry PI, como habíamos dado una pequeña introducción anteriormente (Primera parte aqui )

Recordando un poco:

WiringPi es una biblioteca escrita en C y liberada bajo 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 GPIO, o 40 dependiendo de la placa.”

Lo primero de todo es comenzar instalando como todo (o la mayoría) en Linux, lo instalaremos por medio de la terminal, una vez en la terminal, escribiremos:

sudo apt-get install git-core

Pero en caso de marcar algún error, la mayoría de las veces es debido a que necesitas  actualizar tu Raspberry.

sudo apt-get update
sudo apt-get upgrade

Después bajaremos del git nuestra biblioteca:

git clone git://git.drogon.net/wiringPi

Una vez terminada la operación anterior, daremos:

cd wiringPi
git pull origin

Y por ultimo:

cd wiringPi
./build

Ya con esto tendremos actualizado e instalada nuestra biblioteca Wiring PI

Una vez instalado podremos comenzar a programar en C nuestros gpio sin mayor complicaciones, gracias a su facilidad.

Para acceder a ella en nuestro editor basta con agregar:

#include <wiringPi.h>

Aunque también  tenemos algunas otras bibliotecas para usos específicos como son:

#include <wiringSerial.h>

La cual se encarga de controlar las comunicaciones seriales como puede ser el USB, de una forma sencilla y cómoda para  el usuario.

#include <wiringPiSPI.h>

Del mismo modo biblioteca para  la comunicación ISP

#include <wiringPiI2C.h>

También tenemos para  el protocolo I2C.

Como algunas otras, para mas información haga click aquí (informacion en ingles)

Nota: aveces puede dar error  por lo que tal vez necesites hacer esto:

-I/usr/local/include -L/usr/local/lib -lwiringPi

Ahora antes que todo, hay que saber que “Wiring PI” utiliza su propia nomenclaturas para los GPIOS de la Raspberry:

En caso de la placa Raspberry pi:

gpio1

Y en caso de  la placa Raspberry PI2 :

gpio21

Ya teniendo en cuenta lo anterior, haremos un ejemplo sencillo y básico, como es el Blink

El código seria el siguiente:

#include <wiringPi.h>
int main (void)
{
  wiringPiSetup () ;
  pinMode (0, OUTPUT) ;
  for (;;)
  {
    digitalWrite (0, HIGH) ; delay (500) ;
    digitalWrite (0,  LOW) ; delay (500) ;
  }
  return 0 ;
}

Y nuestra conexión sera la siguiente:

blink1

Al compilar y ejecutar nuestro led debería encenderse y apagarse.

#gcc –o blink -l wiringPi blink.c
# ./blink

Ahora explicaremos paso por paso el código:

  1. En nuestra cabecera tendremos el llamado a la biblioteca “#include<wiringPi.h>”
  2. Después tendremos nuestro inicio de nuestro loop principal “int main(void)”
  3. Proseguimos con “wiringPiSetup(void)” encargado de iniciar la biblioteca “wiringpi” (estas y otras funciones las explicaré posteriormente).
  4. Comenzaremos a configurar nuestro GPiO  con la función “pinMode” que para los que hayan utilizado antes arduino, hace una función similar el primer valor corresponde al pin que vamos a utilizar, y el segundo valor corresponde al modo  OUTPUT (salida) INPUT(entrada)
  5. Por ultimo tenemos un ciclo for, el cual contiene la función “digitalwrite” encargada del control de los pines digitales (muy parecido a su implementan en arduino) contiene  el primer valor, el cual es el pin a modificar o manejar y un segundo valor, el cual es su estado HIGH (para tener 1 lógico o 5v) y LOW ( para obtener 0 logico o 0v)

Seguido de un delay para  que el cambio sea observable por el usuario.

Lo anterior ha sido una implementación clásica y sencilla de la biblioteca.

Funciones básicas que manejamos en Wiring PI:

  • 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).
  • 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).
  • 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.
  • 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 establecen microsegundos.
  • 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.
  • 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.

Y esas son las funciones generales de “Wiring PI” junto con su sencilla explicación,   y en un siguiente post, aprenderemos a utilizar algunas de ella más a fondo.

Saludos a todos y que tengan un grandioso día.

 

Leave a Reply

Your email address will not be published. Required fields are marked *