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.
- Pines digitales: http://www.arduino.cc/en/Tutorial/DigitalPins, pueden configurarse como entrada (para leer, sensores) o como salida (para escribir, actuadores)
- Pines analógicos de entrada: https://www.arduino.cc/en/Tutorial/AnalogInputPins, usan un conversor analógico/digital y sirven para leer sensores analógicos como sondas de temperatura.
- Pines analógicos de salida (PWM): https://www.arduino.cc/en/Tutorial/PWM, la mayoría de Arduino no tienen conversor digital/analógico y para tener salidas analógicas se usa la técnica PWM. No todos los pines digitales soportan PWM.
- Puertos de comunicación: USB, serie, I2C y SPI
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.
Bibliografía:
http://forum.arduino.cc/index.php?topic=200585.0
No hay comentarios:
Publicar un comentario