miércoles, 25 de enero de 2017

Comunicación con Arduino - USB, serie, I2C y SPI


Arduino y en general los microcontroladores tienen puertos de entrada y salida y de comunicación. En Arduino podemos acceder a esos puertos a través de los pines.




Dentro de la comunicación serie tenemos:

UART (recepción-transmisión asíncrona universal) es uno de los protocolos serie más utilizados. La mayoría de los micro-controladores disponen de hardware UART. Usa una línea de datos simple para transmitir y otra para recibir datos. Comúnmente, 8 bits de datos son transmitidos de la siguiente forma: un bit de inicio, a nivel bajo, 8 bits de datos y un bit de parada a nivel alto.
UART se diferencia de SPI y I2C en que es asíncrono y los otros están sincronizados con señal de reloj. La velocidad de datos UART está limitada a 2Mbps.

SPI es otro protocolo serie. Un maestro envía la señal de reloj, y tras cada pulso de reloj envía un bit al esclavo y recibe un bit de éste. Los nombres de las señales son por tanto SCK para el reloj, MOSI para el Maestro Out Esclavo In, y MISO para Maestro In Esclavo Out. Para controlar más de un esclavo es preciso utilizar SS (selección de esclavo).
el uso de este protocolo que viene por defecto en las placas Arduino (puerto ICSP o In-Circuit Serial Programming) y otras placas para programar chips AVR, bien sea como ISP (sin boooader) o bien sea para instalar el bootloader, que es lo mismo ya que el bootloader es un programa que permite programar el chip vía los pines RX y TX.

El bus SPI se define mediante 4 pines:
  • SCLK o SCK : Señal de reloj del bus. Esta señal rige la velocidad a la que se transmite cada bit.
  • MISO(Master Input Slave Output): Es la señal de entrada a nuestro dispositivo, por aquí se reciben los datos desde el otro integrado.
  • MOSI(Master Output Slave Input): Transmisión de datos hacia el otro integrado.
  • SS o CS: Chip Select o Slave Select, habilita el integrado hacia el que se envían los datos. Esta señal es opcional y en algunos casos no se usa.
Ventajas de SPI sobre I2C.
  • I2C No permite envíos y recepciones al mismo tiempo (Full-Duplex).
  • I2C un poco más complejo que SPI.
  • I2C no tiene control de errores, por ejemplo mediante paridad etc. Aunque si se puede realizar por Software.
  • Velocidades de comunicación relativamente elevadas. En el caso de Arduino de hasta 8 MHz
  • Completo control sobre la trama de bits al no exigir direccionamiento ni ACK.
Desventajas de SPI:
  • No hay control del flujo por hardware.
  • No hay confirmación de la recepción como si ocurre en I2C con el ACK. Es decir no sabemos si el mensaje ha llegado al destino.
  • Usa más pines que otros buses, ya que necesita uno por cada esclavo. Eso implica que no hay direccionamiento en la propia trama. A menos que se diseñe por software.
  • Funcionamiento a distancias cortas

Ventajas del Bus SPI
  • Comunicación Full Duplex. Envía y recibe a la vez lo que aumenta la velocidad.
  • Más rápido que el I2C y que el puerto Serie asíncrono normal
  • El tamaño de los mensajes puede ser arbitrariamente grande
  • Se requiere un hardware sencillo (Léase barato)
  • Requiere un menor consumo y menor electrónica de conexión que el I2C
  • Como el Clock lo proporciona el master, los esclavos no necesitan osciladores ( O sea, otra vez más barato)

Las desventajas son:
  • Necesita más pines que el I2C o el Puerto serie normal.
  • Las comunicaciones tiene que estar perfectamente establecidas de antemano. No puedes enviar mensajes de diferentes longitudes cuando te convenga.
  • No hay señal de conforme del esclavo, se espera que obedezca y punto.
  • Master único y casi sin posibilidad de master múltiple
  • Funciona solo en distancias muy cortas
  • Normalmente necesita un pin adicional por cada esclavo y si el número de esta creces puede acabar siendo un problema.


Para programar los ATTiny, el bootloader de los chips de Atmel, y los chips de Atmel sin usar el bootloader se utiliza un protocolo de comunicacón llamado Serial Peripheral Interface o SPI.
Esta es una conexión en serie y se realiza mediante un bus de 4 hilos y permite la conexión de uno o mas chips (esclavos) a uno llamado amo o maestro que controla a los demás.
Por tanto se disponen de 4 conexiones, mas luego las conexiones de energía (por lo general 5V y GND si no se suministran de otro modo). Un ejemplo es el puerto ICSP del Arduino UNO con 6 pines en 3 columnas, y que identifica los 4 pines de SPI y 2 de energía.
Este tipo de comunicación se basa en la existencia de un maestro y uno o varios esclavos. En el caso se haber varios esclavos, lo normal es que solo haya un esclavo activo (escuchando) en cada momento y que el amo se encargue de decidir con qué chip está hablando. Se pueden conexiones en las que todos funcionan a la vez y el amo se comunica con el primero, comunicándose este con el siguiente, etc. En programación de chips es poco útil usar varios esclavos

Las conexiones (o pines) son:

SCK (Serial ClocK, reloj serie): indica el tren de pulsos que marca la frecuencia a la que funciona la comunicación. Esta señal la emite el amo y los esclavos la usan para sincronización.
    • En un ArduinoUNO (para utilizarlo como un programador ISP) el pin D13 es el SCK.
    • En un Arduino Mega 2560 corresponde con el pin D52.
·         MOSI (Master Output, Slave Input): en este canal el amo habla y los esclavos escuchan. Sirve para que el amo se comunique con los esclavos.
·         En un Arduino el pin D12.
·         En un Arduino Mega el pin D51.

·         MISO (Master Input, Slave Output): en este canal el amo escuha al esclavo activo en el momento. Sirve para que los esclavos respondan al amo. La comunicación solo la realiza el esclavo activo en ese momento (o al menos sólo debería, por lo general cuando un chip está activo no debería escuchar).
·         En el Arduino el D11.
·         En un Arduino Mega el pin D50

Slave Select o SS, línea de control que indica a un esclavo que el mensaje que viene es para él, o bien que se reclama que envié una respuesta a una petición del master.


Ejemplo de comunicación por el protocolo SPI: El acceso a la tarjeta SD es mediante el bus SPI.













I2C es un protocolo síncrono. I2C usa solo 2 cables, uno para el reloj (SCL) y otro para el dato (SDA). Esto significa que el maestro y el esclavo envían datos por el mismo cable, el cuál es controlado por el maestro, que crea la señal de reloj. I2C no utiliza selección de esclavo, sino direccionamiento.
Dos o más señales a través del mismo cable pueden causar conflicto, y ocurrirían problemas si un dispositivo envía un 1 lógico al mismo tiempo que otro envía un 0. Por tanto el bus es “cableado” con dos resistencias para poner el bus a nivel alto, y los dispositivos envían niveles bajos. Si quieren enviar un nivel alto simplemente lo comunican al bus.
La principal característica de I²C es que utiliza dos líneas para transmitir la información: una para los datos y otra para la señal de reloj. También es necesaria una tercera línea, pero esta sólo es la referencia (masa). Como suelen comunicarse circuitos en una misma placa que comparten una misma masa esta tercera línea no suele ser necesaria.
Las líneas se llaman:
  • SDA: datos
  • SCL: reloj
  • GND: tierra
I2C también se conoce como TWI (Two Wire Interface) y no dispone de un conector estandarizado.
El protocolo del I²C es por definición bastante simple, pero a la vez muy susceptible a las interferencias. Este hecho limita su uso únicamente a entornos de poca interferencia, en los cuales no se ha de esperar ningún tipo de ruido, problemas de compatibilidad electromagnética o diafonías, ni problemas de contacto (clavijas, enchufes). Asimismo, no es adecuado como puente entre grandes distancias.
I²C (también lo verás escrito como I2C) suelen comunicarse con circuitos en una misma placa que comparten una misma masa, esta tercera línea no suele ser necesaria. En la mayoría de las placas Arduino, SDA (línea de datos) está en el pin analógico 4, y SCL (línea de reloj) está en el pin analógico 5. En Arduino Mega, SDA está en el pin digital 20 y SCL en el 21. 

Con el protocolo I2C podemos ampliar nuestro numero de entradas digitales e incluso comunicar varios arduinos entre sí. Usando nuestro LCD por I2C también ahorraremos muchos pines.

Arduino tiene de serie una librería para la comunicación sobre este protocolo. Esta es la librería Wire.h .


En la siguiente imagen se puede comprobar la diferencia entre conexión I2C y SPI.





El puerto de comunicación I2C, también nos puede servir para conectar Arduino a otros períféricos como CPUs o SBCs como la Raspberry Pi








Bibliografía:
http://forum.arduino.cc/index.php?topic=200585.0

No hay comentarios:

Publicar un comentario