Está en la página 1de 37

Agenda

● Comunicación serial.
● Protocolos.
● Lectura de datos.
https://www.electricaltechnology.org/wp-content/uploads/2020/05/Difference-Between-Serial-Parallel-Communication.png
https://www.youtube.com/watch?v=u1pKHLy4yxk
Comunicación serial
La comunicación entre humanos es vital, de manera similar lo es en sistemas
digitales que comparten y transmiten datos, mediante algún protocolo común.
En general existen dos categorías: paralelo o serial.

Paralelo: Serial:
- Transmiten múltiples bits al mismo tiempo. - Transmiten un bit a la vez.
- Necesita de buses de datos con varios - Necesita de un solo cable, generalmente no
cables. más de cuatro.
- Los datos se transmiten en enormes - Los datos se transmiten a menor velocidad.
cantidades de 0s y 1s, a gran velocidad.

Tipos de comunicación serial: síncrona y asíncrona


Comunicación serial asíncrona
Reglas mínimas: Empaquetado de datos
● Bits de datos.
● Bits de
sincronización
● Bits de paridad
● Velocidad de 9600 8N1: 9600 baudios, 8 bits de dato, sin paridad, 1 bit de parada

transmisión en
baudios: 9600 bps

https://learn.sparkfun.com/tutorials/serial-communication/rules-of-serial
Protocolos
● RS-232
● SPI
● I2C
● …

https://techgeekbuzz.com/blog/iot-applications/
TTL, RS-232

https://learn.sparkfun.com/tutorials/serial-communication
https://www.youtube.com/watch?v=G7aQB6x0LHc
TTL serial

RS-232
Comunicación Serial I2C (Inter-Integrated Circuit)

• I2C (Inter-Integrated Circuit) utlizado para


comunicar circuitos integrados
• Desarrollado por Phillips
2K para • Velocidad: 100KHz, 400KHz, 3.4MHz (no
400Kbps soportado por Arduino
• Dos líneas para transmitir la información: Una
10K para para los datos (SDA) y otra para el reloj (SCL)
Serial Data (SDA) 100Kbps está última proporcionado por el maestro.
• Utiliza direccionamiento, cada dispositivo
Serial Clock (SCL) conectado al bus I2C tiene una única dirección
• El maestro y el esclavo envían datos por el
mismo cable (half duplex)
• Múltiples esclavos pueden compartir el bus
con un Maestro. No es necesario que el
maestro siempre sea el mismo dispositivo.
I2C también se conoce • Las resistencias Pullup son imperativas, ya
como TWI (Two Wire
que el bus es activo bajo (Esto es, la señal
Interface)
activa es un 0, no un 1)

Casi 128 (112) dispositivos usando direcciones de 7 bits


Casi 1024 (1008) dispositivos usando direcciones de 10 bits

http://howtomechatronics.com/tutorials/arduino/how-i2c-communication-works-and-how-to-use-it-with-arduino/ 8
I2C y SPI sobre Arduino

SPI pins:
• SCK = serial clock (13)
• MISO = master in, slave out(12) Serial Peripheral Interface (SPI)
• MOSI = master out slave in (11)
• SS = slave select (10)
I2C pins:
• SDA = data line (A4) ICSP (In Chip Serial Programmer)
• SCL = clock line (A5) 9
I2C sobre Arduino Función Detalle

Wire.begin() Inicia la librería Wire y especifica si es master o


Wire.begin(address) slave. Si no se especifica address, se une al Bus
I2C como master, si se especifica address, se une
• La librería para manejar el al Bus I2C bus como slave (usualmente invocado
en setup)
bus I2C en Arduino es Wire.requestFrom(address, quantity) Usado por el maestro para solicitar datos del

“Wire.h”. Esta librería Wire.requestFrom(address, quantity, stop)


Wire.beginTransmission(address)
esclavo. Solicita bytes (quantity) from slave
Comenzar transmisión con esclavo.
permite comunicar con
Wire.endTransmission(address) Finaliza la transmisión que comenzó con un
I2C/TWI al Arduino con esclavo y transmite los bytes en cola.

otros dispositivos, ya que Wire.write(byte)


Wire.write(bytes,length)
Escribe un byte o length bytes desde un esclavo
como respuesta a una petición del maestro o pone
contiene las funciones en cola la transmisión de un maestro.
Wire.available() Devuelve el número de bytes disponibles para leer
necesarias para controlar el
Wire.read() Lee un byte transmitido desde un esclavo a un
hardware integrado. maestro (precedido por Wire.requestFrom) o
viceversa.
Wire. onReceive(myhandler) Llama a una función cuando un esclavo recibe
Nota: Se debe incluir la librería
myhandler: la función a llamar cuando el una transmisión de un maestro. La función
Wire
esclavo recibe datos llamada toma un solo parámetro int: el número de
#include <Wire.h>
bytes leídos del maestro y no devuelve nada, por
ejemplo: void myHandler (int numBytes)
Nota: No es necessario utilizar Wire. onRequest(myhandler) Llama a una función cuando un maestro solicita
pinMode () cuando se usa I2C sobre myhandler: la función a llamar cuando el datos de un esclavo. La función a invocar, no
los pines A4 y A5. maestro solicita datos de un esclavo toma parámetros y no devuelve nada, por
10
ejemplo: void myHandler ()
Acelerómetro
Un sensor es un dispositivo capaz de dar una respuesta eléctrica
(voltios) a estímulos físicos externos. Micro-electro-
mechanical Systems
Si hablamos concretamente de un sensor acelerómetro, nos estamos (MEMS)
refiriendo a aquel dispositivo que convierte aceleraciones (m/s2)
cambios de velocidad, en una señal eléctrica.

La manifestación más común y sencilla del acelerómetro la encontramos en el


airbag de los coches. Cuando frenas de forma brusca, ese sensor detecta una
aceleración muy fuerte y hace que el airbag se despliegue para salvar tu vida.

El acelerómetro permite responder una


El acelerómetro permite que el
llamada si agitas el celular. Apaga en
celular detecte la orientación y rote
menos de un segundo si el celular se te 11
la interfaz.
cae.
Giroscopio
El giroscopio es importante para los sistemas de navegación: Piloto
automático en los aviones y barcos. La realidad virtual y el visionado
de la misma (también imágenes y vídeos en 360 grados) es la función
clave para apreciar el trabajo que realiza el giroscopio. Otro de los
aspectos clave para el uso del giroscopio son los juegos de consola y
en un smartphone.

El giroscopio es importante para situar el móvil en el espacio. Es la


combinación del giroscopio y del acelerómetro (sensor capaz de
captar la inclinación del dispositivo y la aceleración de dicho
movimiento) lo que permite al smartphone saber en qué plano del
espacio se encuentra, cuál es su aceleración con respecto al punto de
partida y si el dispositivo está girando sobre el plano o inclinándose.
Combinados, detectan el movimiento en sus seis ejes.

El giroscopio mide la velocidad angular usando el Efecto Coriolis.


Cuando una masa se mueve en una dirección particular con una
velocidad particular y cuando se aplica una velocidad angular
externa como se muestra con la flecha verde, se producirá una
fuerza, como se muestra con la flecha azul, que causará el
desplazamiento perpendicular de la masa. Este desplazamiento
causará un cambio en la capacitancia que se medirá, procesará y
corresponderá a una velocidad angular particular. El giroscopio mide
la velocidad angular (grados / segundo)
12
MPU6050: Acelerómetro y Giroscopio
EL MPU6050 es una unidad de medición inercial o IMU (Inertial Measurment Units) de 6
grados de libertad (DoF) pues combina un acelerómetro de 3 ejes y un giroscopio de 3 ejes.
Este sensor es muy utilizado en navegación, goniometría, estabilización, etc.

La dirección de los ejes está indicado en el módulo el cual hay que tener en cuenta para no
equivocarnos en el signo de las aceleraciones.

Los rangos de valores con los que está configurado nuestro MPU6050 pueden ser
2g/4g/8g/16g para el acelerómetro y 250/500/1000/2000(°/s) para el giroscopio. Los rangos
por defecto son 2g y 250°/s

Variable valor mínimo valor central valor máximo

Lectura MPU6050 -32768 0 +32767

Aceleración -2g 0g +2g

Velocidad angular -250°/s 0°/s +250°/s

Para trabajar con el dispositivo se utiliza la Tenemos dos direcciones I2C para poder
siguiente librería: trabajar:
https://github.com/jrowberg/i2cdevlib/tree/master/
Pin AD0 Dirección I2C
Arduino/MPU6050
Esta librería trabaja con una librería adicional
AD0=HIGH (5V) 0x69
para la comunicación I2C:
https://github.com/jrowberg/i2cdevlib/tree/master/
Arduino/I2Cdev AD0=LOW (GND o NC) 0x68 13
Escaner I2C para el MPU6050
• Cada componente que conectamos al bus I2C tiene una dirección única. Para establecer la
comunicación es necesario conocer esa dirección. Si no fuera posible conocerla (no hay
datasheet) existe un programa para Arduino, que nos informa, de lo que hay en nuestro bus y
con qué dirección.

14
MPU6050: Lectura de Valores

15
Ejercicio: MPU6050 + Servo
Se controla un servomotor utilizando el sensor MPU6050
(acelerómetro y giroscopio). Al mover el sensor hacia arriba/ abajo,
nos da valores de -17000 a 17000. Vamos a asignar estos de 0 a
180 para mover el servomotor. Cuando movemos el sensor hacia
arriba, la salida del sensor será 180. Cuando movemos el sensor
hacia abajo, la salida del sensor será 0.

16
Comunicación entre Arduinos por I2C

I2C pins:
• SDA = data line (A4)
• SCL = clock line (A5)

17
Comunicación serial SPI
• SPI (Serial Peripheral Interface Bus) utilizado para
comunicar circuitos integrados
• Desarrollado por Motorola, ahora freescale
• Velocidad=1-100 MHz (limitado por el reloj/dispositivo)
• Bus de 4 líneas: SCLK, MOSI, MISO, SS.
• Utiliza un pin de chip select, que conecta o desconecta la
operación del dispositivo con el que uno desea
comunicarse. no es necesario usar direccionamiento
SCLK o SCK : Serial Clock • El maestro y el esclavo envían datos por cables
diferentes (full duplex)
MISO(Master Input Slave • Múltiples esclavos pueden compartir el mismo bus (pero
Output) cada uno necesita un SS dedicado)
MOSI Master Output Slave
Input)
SS o CS: Chip Select o Slave
Select

SCLK o SCK : Señal de reloj del bus. Esta señal rige la velocidad a la que se transmite cada bit.
MISO: Es la señal de entrada a nuestro dispositivo, por aquí se reciben los datos desde el otro integrado.
MOSI: Transmisión de datos hacia el otro integrado.
SS o CS: Habilita el integrado hacia el que se envían los datos.

18
Proceso de comunicación Serial SPI
• Se habilita el chip al que hay que enviar la
información mediante el SS (Opcional).
• Se carga en el buffer de salida el byte a enviar.
• La línea de Clock empieza a generar la señal
cuadrada donde normalmente por cada flanco de
bajada se pone un bit en MOSI.
• El receptor normalmente en cada flanco de subida
captura el bit de la linea MISO y lo incorpora en el
buffer.
• Se repite el proceso 8 veces y se ha transmitido
un byte. Si se ha terminado de transmitir se vuelve
a poner la linea SS en reposo.
• Hay que tener en cuenta que a la vez que el
Master está enviando un dato también lo recibe
así que si el Slave ha depositado algún byte en el
buffer de salida, este también será enviado y
recibido por el Master, comunicación full-duplex.
• La señal de reloj es generada por el master y la
línea SS normalmente se mantiene HIGH y se
activa con LOW, lo que despierta al esclavo
seleccionado. Cuando se termina la transferencia
la línea se levanta a HIGH y el esclavo se
desactiva.
19
Comunicación serial SPI sobre arduino
Instrucción Función
• La librería para manejar el
SPI.begin() Inicializa el bus SPI, configurando los pines SCK, MOSI y SS como
bus SPI en Arduino es salidas, establece los pines SCK y MOSI en bajo y el pin SS en

“SPI.h”. Esta librería alto.

SPI.end() Deshabilita el bus SPI (sin cambiar el modo de los pines). En caso
permite comunicar con SPI de que necesite usar los pins 10-13 nuevamente

al Arduino con otros SPI.setBitOrder(order) Configura el orden de los bits enviados como el menos significativo
dispositivos, ya que primero o el más significativo primero.
order = {LSBFIRST, MSBFIRST}
contiene las funciones SPI.setClockDivider(divider) Configura del divisor de reloj en el bus SPI. ES decir configura la
necesarias para controlar el velocidad del bus.
divider = {2, 4, 8, 16, 32, 64, 128}
hardware integrado. SPI clock speed = 16 MHz/divider

SPI.setDataMode(mode) Configura el modo de datos del bus SPI, es decir, polaridad y fase
del reloj.
mode = {SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3}
Nota: Se debe incluir la librería SPI SPI_MODE0: clock normalmente LOW, muestreo en flanco subida
#include <SPI.h> SPI_MODE1: clock normalmente LOW, muestreo en flanco bajada
SPI_MODE2: clock normalmente HIGH, muestreo en flanco subida
SPI_MODE3: clock normalmente HIGH, muestreo en flanco bajada
Nota: No es necessario utilizar pinMode ()
cuando se usa SPI. Es automáticamente byteIn = SPI.transfer(byteOut) Transfiere un byte sobre el bus SPI, tanto de envío como de
recepción. Devuelve el byte recibido
configurado con SPI.begin().
SPI.attachInterrupt(función) Activa la interrupción SPI y conecta la función que será ejecutada
cuando se complete la transferencia SPI 20
Serial Peripheral Interface (SPI)

https://www.electronicshub.org/basics-serial-peripheral-interface-spi/
Servidor Web con Arduino

22
Servidor Web con Arduino

23
Servidor Web con Arduino - Código

24
Lectura de datos.
Función

Serial

https://youtu.be/WD0na5tTUnM?t=120
SerialEvent

Lectura de
datos
ingresados
por el
Función
serialEve
nt()
Lectura
de
carácte
r
ingresa
do por https://youtu.be/HW85aErntnU?t=31
Comunicación serie con
sensor de proximidad y visualizador
LCD

https://www.tinkercad.com/things/ir14p3Zqm0S-sensor-de-distancialcd
Analo
g
Read
Serial
Otro ejemplo
Read Analog
Voltage.

Leer una entrada


analógica e
imprimirla en el
Monitor Serial.
https://docs.arduino.cc/built-in-examples/basics/ReadAnalogVoltage
Read
Anal
og
Volta
Ejemplo detallado

https://www.youtube.com/watch?v=LoyOqPAblVg
Trabajo en equipo
● Informe de investigación sobre el uso del Monitor Serie
del IDE de la plataforma Arduino en la lectura de señales
digitales, utilizando un ejemplo real.

https://docs.arduino.cc/built-in-examples/

También podría gustarte