Wiring PI y Raspberry PI (3da. parte)

Standard

Hola amigos en esta ocasión me ha tocado platicarle un nuevo tema.  Seguiremos con la tercera parte para aprender a programar y utilizar  nuestra Raspberry, en primer lugar veremos  como se manejan los diferentes tipo de comunicaciones (UART y SPI )  con la cual podremos  hablarles a otros dispositivos o sensores.

Primero la explicación  de cada uno de ellos:

UART:

  • Son las siglas en inglés de Universal Asynchronous Receiver-Transmitter, en español: Transmisor-Receptor Asíncrono Universal, es el dispositivo que controla los puertos y dispositivos serie. Se encuentra integrado en la placa base o en la tarjeta adaptadora del dispositivo.

maxresdefault

Es de los más utilizados actualmente por ejemplo las conexiones USB, simplemente son un tipo de uart

I2C

  • El bus I2C, un estándar que facilita la comunicación entre microcontroladores, memorias y otros dispositivos con cierto nivel de “inteligencia”, sólo requiere de dos líneas de señal y un común o masa. Fue diseñado a este efecto por Philips y permite el intercambio de información entre muchos dispositivos a una velocidad aceptable, de unos 100 Kbits por segundo, aunque hay casos especiales en los que el reloj llega hasta los 3,4 MHz.

descarga

Ya sabiendo un poco de que va cada uno, veremos como por el medio de nuestra bibloteca WiringPi los podemos utilizar:

El primero uart primero tendremos que entender para que sirve cada función:

  • int serialOpen (char *device, int baud); abre la comunicación del dispositivo.
  • void serialClose (int fd) ; Cierra la comunicación con el dispositivo.
  • void serialPutchar (int fd, unsigned char c) ; envía un byte único al dispositivo receptor.
  • void serialPuts (int fd, char *s) ; envía una cadena terminada en un caracter nulo.
  • void  serialPrintf (int fd, char *message, …) ; envia un mensaje o un caracter por el puerto serial
  • int serialDataAvail (int fd) ; devuelve el numero de caracteres disponible para su lectura.
  •  int serialGetchar (int fd) ; lee el carácter disponible en el dispositivo.
  • void serialFlush (int fd) ; descarta los datos recibidos en espera.

Una vez aclarado, simplemente tenemos que hacer una conexión con nuestro dispositivo, y es tan sencillo como esto:

uart raspberry

Ahora seguiremos con  I2C:

Lo primero, es entender un poco más a fondo como funciona el Protocolo I2C.

Ocurre en un bus I2C es que el dispositivo maestro envía una secuencia de inicio. Esto alerta a los dispositivos esclavos, poniéndolos a la espera de una transacción. Éstos quedan atentos para ver si se trata de una solicitud para ellos. A continuación el dispositivo maestro envía la dirección de dispositivo. El dispositivo esclavo que posee esa dirección continuará con la transacción y los otros ignorarán el resto de los intercambios, esperando la próxima secuencia de inicio.

  • Escritura en un dispositivo esclavo:
  1. Enviar una secuencia de inicio.
  2. Enviar la dirección de dispositivo con el bit de lectura/escritura en bajo.
  3. Enviar el número de registro interno en el que se desea escribir.
  4. Enviar el byte de dato.
  5. [Opcionalmente, enviar más bytes de dato].
  6. Enviar la secuencia de parada.

I2C

Nuestros dispositivos los conectaremos a nuestros pines de SDA Y SCL.

gpio-pinout

Primero habilitamos la función de  I2C  escribiendo lo siguiente:

  • sudo nano /etc/modprobe.d/raspi-blacklist.confI2C
  • sudo nano /etc/modulesI2C
  • Instalamos esta app con la cual podemos verificar el estado de  nuestros dispositivos:

ls -la /dev/i2c-0

sudo apt-get update

sudo apt-get install i2c-tools

  • Y con este comando detectaremos cualquier  dispositivo en nuestra red I2C:

sudo i2cdetect -y 0

  • Ahora  lo primero es  saber que a nuestro código le agregaremos la siguiente biblioteca:

#include “wiringPiI2C.h“

  • Y lo segundo será nuestras funciones que tendremos a disposición:

int wiringPiI2CSetup (int devId) ;

  • ID  Del dispositivo a comunicar

wiringPiI2CRead (int fd) ;
funcion para leer directamente del dispositivo

wiringPiI2CWrite (int fd, int data) ;

funcion para escribir directamente al dispositivo

wiringPiI2CWriteReg8 (int fd, int reg, int data) ;

funcion para escribir un registro especifico de 8 bits

wiringPiI2CWriteReg16 (int fd, int reg, int data) ;

funcion para escribir un registro especifico de 16 bits

 wiringPiI2CReadReg8 (int fd, int reg) ;

funcion para leer un registro de de 8 bits

wiringPiI2CReadReg16 (int fd, int reg) ;

funcion para leer un registro de 16 bits

 

Espero les sea de utilidad.

Saludos

 

Leave a Reply

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