Está en la página 1de 43

Secretaría de Educación Pública

TECNOLÓGICO NACIONAL DE MÉXICO


INSTITUTO TECNOLÓGICO DE VERACRUZ

Trabajo de equipo

-USART
- EIA232
- EIA485
- Circuito de interconexión entre dos
arduinos con adaptadores 485
- Programas de aplicación de ejemplo
transmisor - receptor

MECATRÓNICA
Equipo 6:
ALUMNOS:
Croda Tejeda Sergio E15020996
Gutiérrez Simbrón Luis Enrique E15020185
Hernández Arroyo Erick Iván E17020334
Hernández Vega Alberto E15021030
Huerta Tiburcio Bogarth Enrique E15021035
Velazquez Segundo Rogelio Alfredo E17020320
CATEDRÁTICO

JOSE HUGO PEREZ CASANOVA

H. VERACRUZ, VER Abril 2020


USART
En los sistemas con microcontroladores puede existir la necesidad de conectarse
con el mundo exterior, y esto se logra mediante las comunicaciones seriales y
paralelas. En este documento se presentan las consideraciones generales que
deben ser tenidas en cuenta para la configuración del puerto serial (USART).

USART (Universal Synchronous/Asynchronous Receiver Transmitter ó Transmisor-


Receptor Síncrono/Asíncrono Universal) es un protocolo empleado en
comunicaciones duales, es decir que está en la capacidad de recibir y transmitir
simultáneamente. Es una forma de comunicación entre dispositivos que tengan esta
capacidad, donde los datos pueden ser enviados en grupos de 5, 6, 7, 8 o de 9 bits
pero bit por bit, esto es en serie, por eso se dice que esta es una comunicación
serial, dicha comunicación permite establecer un enlace de comunicación tipo Full.
¿USART Ó UART?

En ciertas circunstancias, la intercambiabilidad de estos términos puede ser


apropiada, pero en muchos casos es un error.

Con un UART: un receptor / transmisor asíncrono universal. Es un periférico de


microcontrolador que convierte los bytes de datos entrantes y salientes en un flujo
de bits en serie. Un bit de inicio inicia el flujo de bits en serie y un bit de parada (o
dos) completa la palabra de datos. Un UART también tiene la opción de agregar un
bit de paridad al flujo para ayudar a detectar si se produce un error de bit durante la
transmisión.

Un USART: un receptor / transmisor sincrónico / asíncrono universal, es un


periférico con microcontrolador que convierte los bytes de datos entrantes y
salientes en un flujo de bits en serie. La definición de un USART es idéntica a la de
un UART, pero con "síncrono" agregado al término.
Diferencias USART - UART

 La forma en que se pueden sincronizar los datos en serie:


Un UART: Genera su reloj de datos internamente al microcontrolador
y sincroniza ese reloj con el flujo de datos utilizando la transición de bit de
inicio. No hay una señal de reloj entrante asociada con los datos, por lo que
para recibir correctamente el flujo de datos, el receptor debe saber de
antemano cuál debe ser la velocidad en baudios.

Un USART: Puede configurarse para ejecutarse en modo síncrono. En


este modo, el periférico emisor generará un reloj que el periférico receptor
puede recuperar del flujo de datos sin conocer la velocidad en baudios antes
de tiempo. Alternativamente, el enlace utilizará una línea completamente
separada para transportar la señal del reloj.

 La cantidad de protocolos que puede admitir el periférico.


Un UART: es simple y solo ofrece algunas opciones desde su formato base,
como el número de bits de parada y paridad par o impar.

Un USART: es más complejo y puede generar datos en una forma


correspondiente a muchos protocolos estándar diferentes, como IrDA, LIN,
tarjeta inteligente, habilitación de controlador para RS-485interfaces, y
Modbus, por nombrar algunos. Un USART también tiene las mismas
capacidades asíncronas que un UART, es decir, un USART puede generar
el mismo tipo de datos en serie.

Nota: “Un USART generalmente tiene más capacidades que un UART


estándar y la capacidad de generar datos sincronizados permite que el
USART funcione a velocidades de transmisión mucho más allá de las
capacidades de un UART.”
Funcionamiento del USART

Cuenta con dos conexiones, RX y TX. Lo que nos indica los modos de comunicación
que puede manejar, Full-duplex, Duplex y Simplex. Además, podemos considerar
como su principal ventaja a la sencillez de su protocolo de comunicación.

 Full dúplex: Significa que puede recibir y enviar información


digital simultáneamente.
 Duplex o Half-duplex: Es cuando sólo podemos transmitir o
recibir información, una cosa a la vez.
 Simplex: Cuando sólo podemos ya sea recibir o transmitir.

Aunque no se tiene un emisor de reloj existe un estándar a seguir llamado BAUND


RATE (cantidad de bits por segundo a transmitir), para que exista comunicación
entre dos dispositivos tienes que estar en el mismo BAUND RATE, esto se define
en el código del microcontrolador o por el fabricante al momento de realizar el
integrado.

Para una correcta Transmisión/Recepción y sin pérdida de datos, es necesario


configurar correctamente el Baud-Rate a través de los registros SPBRGH y SPBRG.
En la siguiente tabla se muestra las ecuaciones para los modos Síncronos y
Asíncronos.
Vamos a realizar un ejemplo para despejar un poco nuestras dudas. Si tenemos
una 𝐹𝑜𝑠𝑐=48Mhz y queremos unos Baudios de 9600 bps. Calcularemos el valor que
debemos escribir en el registro SPBRG en modo 8 bits y baja Velocidad; 𝐵𝑅𝐺=0 y
𝐵𝑅𝐺16=0, con la fórmula vista anteriormente.

Antes de trasmitir el microcontrolador se encuentra en estado de reposo o HIGH


(estado alto ó 5v) el bit de inicio va de HIGH a LOW (0v) en este momento empieza
la comunicación, ya que se inicia la comunicación se mandan los 8 bits de datos por
último se manda el bit de paridad y se lleva a HIGH para indicar que la comunicación
ha terminado (figura 4)

Figura 4
Es importante saber que al momento de realizar la conexión para la comunicación
tipo USART se realiza una conexión cruzada, se conecta el TX de uno al RX del
otro y por el contrario (Figura 5) ya que por un pin que transmite no se puede recibir
datos.

Figura 5

Ventana protocolo USART

El formato de envío en el protocolo se basa en ventanas o frames, cada frame posee


los siguientes elementos:

 Un bit de parada
 Bits de datos (5,6,7,8 o 9 según la configuración)
 Uno o dos bits de parada
 Las ventanas pueden incluir bits de paridad para la detección y
corrección de errores

Importante: Con el propósito de establecer una comunicación asincrónica entre dos


agentes es necesario acordar la tasa de transmisión de bytes (baudios) entre ambas
partes.
EIA232
RS-232 (Recommended Standard 232, en
español: “Estándar Recomendado 232”), también
conocido como EIA/TIA RS-232C es una interfaz
que designa una norma para el intercambio de
datos binarios serie entre DTE “date terminal
equipment”, como por ejemplo una computadora y
un DCE “date communication equipament”, por
ejemplo, un modem. Existen otros casos en los
que también se utiliza la interfaz RS-232. Una
definición equivalente publicada por la UIT, se
denomina v.24.

En particular, existen ocasiones en que interesa conectar otro tipo de equipamentos,


como pueden ser computadoras.
Evidentemente, en el caso de interconexión entre los mismos, se requerirá la
conexión de un DTE con tro DTE. Para ello se utiliza una conexión entre dos DTE
sin usar modem, por ello se llama modem nulo.

Conector RS-232 (DB-9hembra)


El RS-232 consiste en un conector tipo DB-25 (de 25 pines) aunque es normal
encontrar la versión de 9 pines (DE-9, o popularmente mal denominados DB-9), mas
barato e incluso mas extendido para cierto tipo de periféricos (como el ratón serie
de la PC).

Tarjeta PCI con conectores RS-32 macho


La primera especificación de esta interfaz se publicó en 1962 y desde entonces se
ha ido revisando frecuentemente. Una de las revisiones más extendidas fue la EIA-
232-C.
El primer nombre que recibió esta interfaz fue RS-232, nombre que aún hoy se
utiliza ampliamente, a pesar de que dicho estándar lo adoptaría la organización de
estandarización norteamericana EIA (Electronic Industries Alliance, o hasta
1997 Electronic Industries Association) cambiando su nombre al actual EIA-232.

Asignaciones de voltaje de estado de señal


Los voltajes de de -3v a -25v con respecto a la tierra de la señal (pin 7) se consideran
lógicos “1” (la condición de marcado), mientras que los voltajes de +3v a +25v se
consideran lógicos “0” (la condición de espacio). El rango de voltajes entre -3v y +3v
se considera una región de transición para la cual no se asigna un estado de señal.

Generalmente, cuando se requiere conectar un microcontrolador (con señales


típicamente entre 3,3 y 5 V) con un puerto RS-232 estándar, se utiliza un driver de
línea, típicamente un MAX232 o compatible, el cual mediante dobladores de tensión
positivos y negativos, permite obtener la señal bipolar (típicamente alrededor de +/-
6V) requerida por el estándar.
Para los propósitos de la RS-232 estándar, una conexión es definida por un cable
desde un dispositivo al otro. Hay 25 conexiones en la especificación completa, pero
es muy probable que se encuentren menos de la mitad de éstas en una interfaz
determinada. La causa es simple, una interfaz full duplex puede obtenerse con
solamente 3 cables.
Existe una cierta confusión asociada a los nombres de las señales utilizadas,
principalmente porque hay tres convenios diferentes de denominación (nombre
común, nombre asignado por la EIA, y nombre asignado por el CCITT).
En la siguiente tabla se muestran los tres nombres junto al número de pin del
conector al que está asignado (los nombres de señal están desde el punto de vista
del DTE (por ejemplo para Transmit Data los datos son enviados por el DTE, pero
recibidos por el DCE):

pin EIA CCITT/V.24 E/S FUNCION DTE-DCE


1 CG AA 101 Tierra del chasis

2 TD BA103 Salida Datos transmitidos

3 RD AA 104 Entrada Datos recibidos

4 RTS CA 105 Salida Solicitud de envio

5 CTS CB 106 Entrada Listo para enviar

6 DSR CC 107 Entrada Equipo de datos listo

7 SG AB 102 ------ Tierra de señal

8 DCD CF 109 Entrada Portadora detectada

9* Entrada Test de voltaje


positivo
10* Entrada Test de voltaje
negativo
11 (no se usa)
12+ SCDC SCF 122 Entrada Portadora
detectada-
secundario
13+ SCTS SCB 121 Entrada Listo para enviar –
secundario
14+ SBA Salida Datos transmitidos –
118 secundario
15# TC DB 114 Entrada Reloj de transmisión
16+ SRD SB 119 Entrada Datos recibidos-
secundarios
17# RC DD 115 Entrada Reloj de recepción
18 (no se usa)
19+ SRTS SCA 120 Salida Solicitud de envio
secundario
20 DTR CD 108,2 Salida Terminal de datos
listo
21* SQ CG 110 Entrada Calidad de señal
22 RI CE 125 Entrada Indicador de timbre
23 DRS CH 111 Salida Equipo de datos listo
24* XTC DA 113 Salida Reloj de transmisión
externo
25* Salida ocupado

En la tabla, el carácter que sigue al número de pin:

 (*) raramente se usa.


 (+) usado únicamente si se implementa el canal secundario.
 (#) usado únicamente sobre interfaces sincrónicas.
También, la dirección de la flecha indica cuál dispositivo (DTE o DCE) origina cada
señal, a excepción de las líneas de tierra (---).
Sobre los circuitos, todas las tensiones están con respecto a la señal de tierra.
Las convenciones que se usan son las siguientes:
Los valores de tensión se invierten con respecto a los valores lógicos. Por ejemplo,
el valor lógico positivo corresponde a la tensión negativa. También un 0 lógico
corresponde a la señal de valor verdadero ó activado. Por ejemplo, si la línea DTR
está al valor 0 lógico, se encuentra en la gama de tensión que va desde +3 a +15 V,
entonces DTR está listo
El canal secundario a veces se usa para proveer un camino de retorno de
información más lento, de unos 5 a 10 bits por segundo, para funciones como el
envío de caracteres ACK o NAK, en principio sobre un canal half duplex. Si el
módem usado acepta esta característica, es posible para el receptor aceptar o
rechazar un mensaje sin tener que esperar el tiempo de conmutación, un proceso
que usualmente toma entre 100 y 200 milisegundos.
EIA485
RS-485, también conocido
como TIA-485 (-A) o EIA-485, es
un estándar que define las
características eléctricas de los
controladores y receptores para su
uso en sistemas
de comunicaciones en serie . La
señalización eléctrica
es equilibrada y se admiten
sistemas multipunto . El estándar
es publicado conjuntamente por
la Asociación de la Industria de
Telecomunicaciones y la Alianza
de Industrias Electrónicas (TIA /
EIA). Las redes de
comunicaciones digitales que
implementan el estándar se pueden usar de manera efectiva a largas distancias y
en entornos eléctricamente ruidosos . Se pueden conectar múltiples receptores a
dicha red en un bus lineal multipunto. Estas características hacen que el RS-485
sea útil en sistemas de control industrial y aplicaciones similares.
RS-485 admite redes locales económicas y enlaces de comunicaciones multipunto ,
utilizando la misma señalización diferencial sobre par trenzado que RS-422 . En
general, se acepta que RS-485 se puede utilizar con velocidades de datos de hasta
10 Mbit / s ] o, a velocidades más bajas, distancias de hasta 1.200 m (4.000 pies).
Como regla general , la velocidad en bit / s multiplicada por la longitud en metros no
debe exceder 10 8. Por lo tanto, un cable de 50 metros no debe indicar más rápido
que 2 Mbit / s.
A diferencia del RS-422, que tiene un circuito de controlador que no se puede
desconectar, los controladores RS-485 utilizan una lógica de tres estados
que permite desactivar transmisores individuales. Esto permite que RS-485
implemente topologías de bus lineal utilizando solo dos cables. El equipo ubicado a
lo largo de un conjunto de cables RS-485 se llama indistintamente nodos,
estaciones o dispositivos. La disposición recomendada de los cables es como una
serie conectada de nodos punto a punto (multipunto), es decir, una línea o bus , no
una estrella , anillo, o red múltiple conectada. No se recomiendan las topologías de
estrella y anillo debido a reflexiones de señal o impedancia de terminación
excesivamente baja o alta.
Si una configuración en estrella es inevitable, hay disponibles repetidores
especiales RS-485 que escuchan bidireccionalmente los datos en cada tramo y
luego retransmiten los datos en todos los otros tramos.
Idealmente, los dos extremos del cable tendrán una resistencia de
terminación conectada a través de los dos cables. Sin resistencias de terminación,
los reflejos de la señal en el extremo no terminado del cable pueden causar
corrupción de datos. Las resistencias de terminación también reducen la
sensibilidad al ruido eléctrico debido a la menor impedancia. El valor de cada
resistencia de terminación debe ser igual a la impedancia característica del
cable (típicamente, 120 ohmios para pares trenzados). La terminación también
incluye resistencias pull up y pull down para establecer a prueba de fallas / sesgo
para cada cable de datos para el caso cuando las líneas no están siendo
controladas por ningún dispositivo. De esta manera, las líneas estarán sesgadas a
voltajes conocidos y los nodos no interpretarán el ruido de las líneas no controladas
como datos reales; sin resistencias de polarización, las líneas de datos flotan de tal
manera que la sensibilidad al ruido eléctrico es mayor cuando todas las estaciones
de dispositivos están en silencio o sin energía.
Red de polarización típica junto con terminación. Los valores de polarización y terminación
no se especifican en el estándar RS-485.

Estándar
El EIA una vez etiquetó todos sus estándares con el prefijo "RS" ( Estándar
Recomendado ), pero el EIA-TIA reemplazó oficialmente "RS" con "EIA / TIA" para
ayudar a identificar el origen de sus estándares. El EIA se ha disuelto oficialmente
y el estándar ahora es mantenido por el TIA como TIA-485, pero los ingenieros y las
guías de aplicaciones continúan usando la designación RS-485. La edición inicial
de EIA RS-485 fue fechada en abril de 1983.
RS-485 solo especifica las características eléctricas del generador y el receptor:
la capa física . No específica ni recomienda ningún protocolo de
comunicaciones ; Otros estándares definen los protocolos para la comunicación a
través de un enlace RS-485. El prólogo de las referencias estándar El Boletín de
Sistemas de Telecomunicaciones TSB-89 que contiene pautas de aplicación,
incluida la velocidad de señalización de datos frente a la longitud del cable, la
longitud del cable auxiliar y las configuraciones.
La Sección 4 define las características eléctricas del generador (transmisor o
controlador), receptor, transceptor y sistema. Estas características incluyen:
definición de una unidad de carga, rangos de voltaje, voltajes de circuito abierto,
umbrales y tolerancia transitoria. También define tres puntos de interfaz del
generador (líneas de señal); A, B y C. Los datos se transmiten en A y B. C es una
referencia de tierra. Esta sección también define los estados lógicos 1 (apagado) y
0 (encendido), por la polaridad entre los terminales A y B. Si A es negativo con
respecto a B, el estado es binario 1. La polaridad invertida (A +, B -) es binaria 0. El
estándar no asigna ninguna función lógica a los dos estados.
Arreglo maestro-esclavo
A menudo, en una disposición maestro-esclavo , cuando un dispositivo, el maestro,
inicia toda la actividad de comunicación, el dispositivo maestro proporciona el
sesgo. En esta configuración, el dispositivo maestro generalmente está ubicado
centralmente a lo largo del conjunto de cables RS-485, con dos dispositivos
esclavos ubicados en los extremos físicos de los cables que proporcionan
la terminación .
Operación full duplex
RS-485, como RS-422, se puede hacer full-duplex utilizando cuatro cables. Dado
que RS-485 es una especificación multipunto, sin embargo, esto no es necesario ni
deseable en muchos casos. RS-485 y RS-422 pueden interactuar con ciertas
restricciones.
Convertidores, repetidores y topología en estrella
Los convertidores entre RS-485 y RS-232 están disponibles para permitir que
una computadora personal se comunique con dispositivos remotos. Mediante el uso
de repetidores se pueden formar redes RS-485 muy grandes. TSB-89A, Pautas de
aplicación para TIA / EIA-485-A no recomienda el uso de topología en estrella.
Aplicaciones
Las señales RS-485 se utilizan en una amplia gama de sistemas informáticos y de
automatización. En un sistema informático, SCSI -2 y SCSI-3 pueden usar esta
especificación para implementar la capa física para la transmisión de datos entre un
controlador y una unidad de disco.
RS-485 se utiliza para comunicaciones de datos de baja velocidad en el bus de
vehículos de cabinas de aviones comerciales. Requiere un cableado mínimo y
puede compartir el cableado entre varios asientos, lo que reduce el peso.
Estos se utilizan en controladores lógicos programables y en fábricas. RS-485 se
utiliza como la capa física que subyace a muchos protocolos de automatización
estándar y patentados que se utilizan para implementar sistemas de control
industrial , incluidas las versiones más comunes de Modbus y Profibus . DH 485 es
un protocolo de comunicaciones patentado utilizado por Allen-Bradley en su línea
de unidades de control industrial. Utilizando una serie de dispositivos de interfaz
dedicados, permite que las PC y los controladores industriales se
comuniquen. Como es diferencial, resiste interferencias electromagnéticas de
motores y equipos de soldadura.
En salas de teatro y espectáculos, las redes RS-485 se utilizan para controlar la
iluminación y otros sistemas que utilizan el protocolo DMX512 . RS-485 sirve como
capa física para la interconexión de audio digital AES3 .
El RS-485 también se usa en la automatización de edificios, ya que el simple
cableado del bus y la larga longitud del cable son ideales para unir dispositivos
remotos. Puede usarse para controlar sistemas de videovigilancia o para
interconectar paneles y dispositivos de control de seguridad, como lectores de
tarjetas de control de acceso.
También se usa en el Control de Comando Digital (DCC) para ferrocarriles
modelo . La interfaz externa a la estación de comando DCC es a menudo RS-485
utilizada por controladores portátiles o para controlar el diseño en un entorno de PC
en red. Los conectores modulares 8P8C se utilizan en este caso.
Protocolos
RS-485 no define un protocolo de comunicación ; simplemente una interfaz
eléctrica. Aunque muchas aplicaciones usan niveles de señal RS-485, la velocidad,
el formato y el protocolo de transmisión de datos no están especificados por RS-
485. La interoperabilidad de dispositivos incluso similares de diferentes fabricantes
no está garantizada por el cumplimiento solo de los niveles de señal.
Señales

La línea diferencial RS-485 consta de dos señales:


 A, que es bajo para la lógica 1 y alto para la lógica 0 y,

 B, que es alto para la lógica 1 y bajo para la lógica 0.

Debido a que una condición de marca (lógica 1) se representa tradicionalmente (por


ejemplo, en RS-232) con un voltaje negativo y el espacio (lógica 0) representado
con uno positivo, A puede considerarse la señal no inversora y B como
inversora. Los estados estándar RS-485 (parafraseados):
 Para un estado apagado, marca o lógica 1, el terminal A del conductor es
negativo en relación con el terminal B.

 Para un estado encendido, espacio o lógica 0, el terminal A del controlador


es positivo en relación con el terminal B.

Las tablas de verdad de los dispositivos más populares, comenzando con el


SN75176, muestran las señales de salida invertidas. Esto está de acuerdo con los
nombres A / B utilizados, incorrectamente, por la mayoría de los fabricantes de
transceptores diferenciales, que incluyen:
 Intersil , como se ve en su hoja de datos para el transceptor ISL4489

 Maxim , como se ve en su hoja de datos para el transceptor MAX483

 Tecnología lineal , como se ve en su hoja de datos para LTC2850, LTC2851,


LTC2852

 Dispositivos analógicos , como se ve en su hoja de datos para ADM3483,


ADM3485, ADM3488, ADM3490, ADM3491

 FTDI , como se ve en su hoja de datos para el USB-RS485-WE-1800-BT


Todos estos fabricantes son incorrectos (pero consistentes) y su práctica es de uso
generalizado. El problema también existe en las aplicaciones de controlador lógico
programable. Se debe tener cuidado al usar el nombre A / B. La nomenclatura
alternativa se usa a menudo para evitar la confusión que rodea al nombre A / B:
 TX + / RX + o D + como alternativa para B (alto para la marca, es decir,
inactivo)

 TX− / RX− o D− como alternativa para A (bajo para la marca, es decir,


inactivo)

Además de las conexiones A y B, puede existir una tercera conexión opcional (el
estándar TIA requiere la presencia de una ruta de retorno común entre todos los
circuitos de tierra a lo largo de la línea balanceada para una operación
adecuada) llamada SC, G o referencia, la tierra de referencia de señal común
utilizada por el receptor mide los voltajes A y B. Esta conexión puede usarse para
limitar la señal de modo comúneso puede quedar impresionado en las entradas del
receptor. El voltaje de modo común permitido está en el rango de −7V a + 12V, es
decir, ± 7V en la parte superior del rango de señal de 0-5V. Si no se mantiene dentro
de este rango, se producirá, en el mejor de los casos, corrupción de la señal y, en
el peor, daños en los dispositivos conectados.
Se debe tener cuidado de que una conexión SC, especialmente en tramos largos
de cable, no resulte en un intento de conectar tierras dispares juntas; es aconsejable
agregar algo de limitación de corriente a la conexión SC. Las tierras entre edificios
pueden variar en un voltaje pequeño, pero con una impedancia muy baja y, por lo
tanto, la posibilidad de corrientes catastróficas, lo suficiente como para derretir
cables de señal, trazas de PCB y dispositivos transceptores.
RS-485 no especifica ningún conector o pinout. Los circuitos pueden terminarse
en terminales de tornillo , conectores D-subminiatura u otros tipos de conectores.
El estándar no trata el apantallamiento del cable, pero hace algunas
recomendaciones sobre los métodos preferidos para interconectar la referencia de
señal común y los motivos de la carcasa del equipo.
Conexión RS-485 de 3 hilos

Ejemplo de forma de onda


El siguiente diagrama muestra los potenciales de los pines A (azul) y B (rojo) de una
línea RS-485 durante la transmisión de un byte (0xD3, el bit menos significativo
primero) de datos utilizando un método asíncrono de inicio-parada .
Circuitos de interconexión entre dos arduinos con
adaptadores 485
Comunicación RS485 con Arduino

Explicaremos como utilizar los Módulos RS485 e implementaremos varios ejemplos


para comunicar 2 Arduinos a través de RS485, desarrollaremos la comunicación
simplex, full duplex y half duplex.
El estándar industrial RS485 o también conocido como EIA-485 es un estándar de
capa física según el modelo OSI. Es decir, no pone normas ni restricciones sobre el
contenido, forma, o codificación de los mensajes enviados. Utilizando RS485 como
capa física es posible implementar un bus de campo industrial tipo MODBUS para
comunicación entre equipos industriales o DMX para el control de luces entre otras
aplicaciones. El estándar RS485 es ampliamente utilizado por su robustez, fácil
implementación y buenas prestaciones.
En este tutorial trabajaremos el tema de Comunicación Serial a sobre RS485 con
Arduino.
RS485 está definido como un sistema de comunicación
en bus diferencial multipunto, es ideal para transmitir a
velocidades medianas sobre largas distancias (35
Mbit/s hasta 10 metros y 100 kbit/s en 1200 metros) y
a través de canales ruidosos, ya que al emplear voltajes
diferenciales reduce los ruidos eléctricos que aparecen
en la línea de transmisión. El medio físico de
transmisión (cableado) es el cable par trenzado que
admite hasta 32 estaciones en 1 solo bus, con una
longitud máxima de 1200 metros operando entre 300 y
19200 bit/s bajo comunicación half-duplex
(semiduplex).
Para la implementación de los ejemplos del tutorial utilizaremos los Módulos RS485
a Serial TTL.
El módulo tiene acceso a todos los pines del chip MAX485 y tiene todos los
componentes adicionales para su correcto funcionamiento. Los pines "A" y "B" se
pueden conectar también desde la bornera.
Los pines A y B son por donde se envían y reciben los datos, B es la negación en
voltaje de A, se envían los mismos datos pero en la línea B están negados, de esta
forma se pueden restar ambas señales y eliminar el ruido y quedarnos solo con la
señal de datos. El encargado de esta transmisión diferencial es el chip MAX485.
Desde el punto de vista del microcontrolador o Arduino, la comunicación se trabaja
como una comunicación serial, trabajamos con los pines RX y TX; y dependiendo
del tipo de conexión se puede usar un pin más para especificar si estamos enviando
o recibiendo datos.
Usar le módulo RS485 como transmisor
En esta configuración el módulo solo trabaja como transmisor, para que el módulo
sepa que las salidas A B se van a comportar como salida de datos, se tiene que
conectar a 5V los pines RE y DE. Desde el Arduino se envían los datos hacia el pin
DI (Data Input) del módulo y este transmitirá los datos por los pines AB
Usar el módulo RS485 como receptor
Al conectar los pines RE y DE el módulo se comporta como Receptor, y los datos
recibidos por AB estarán presentes en el pin RO(Receiver Output), conectando el
pin RO del módulo al RX de nuestro Arduino podemos leer los datos recibidos.

Ej 1. Comunicación Simplex entre dos Arduinos por RS485


Una comunicación simplex es una comunicación unidireccional, en este caso un
Arduino se comporta solo como transmisor y el otro solo como receptor, a nivel de
programación es como si estuviéramos trabajando con una comunicación serial,
pero en un solo sentido. Uno envía y el otro solo recibe datos.
Veamos un ejemplo:
Desde un Arduino a través de un potenciómetro moveremos un servomotor que
estará conectado en otro Arduino, solo dos cables (salidas A y B del RS485) unirán
a los Arduinos, si la distancia es larga se recomienda usar cable trenzado.
El código del transmisor es el siguiente:
void setup()

Serial.begin(9600);

void loop()

int lectura = analogRead(0);//leemos el valor del potenciómetro (de 0 a 1023)

byte angulo= map(lectura, 0, 1023, 0, 180); // escalamos la lectura a un valor de ángulo (entre 0 y 180)

Serial.write(angulo); //enviamos el ángulo correspondiente

delay(50);

El código del Arduino receptor es el siguiente:

#include <Servo.h>

Servo myservo; // creamos el objeto servo

void setup()

Serial.begin(9600);

myservo.attach(9); // asignamos el pin 9 para el servo.

void loop()

if (Serial.available()) {

int angulo = Serial.read(); //Leemos el dato recibido

if(angulo<=180) //verificamos que sea un valor en el rango del servo

myservo.write(angulo); //movemos el servomotor al ángulo correspondiente.

}
Como se observa es una simple comunicación serial, en el Arduino transmisor se
hace la lectura del potenciómetro se lo escala y se lo envía serialmente, en el
receptor recibimos el dato y movemos el servomotor.

De esta forma podemos realizar una comunicación entre dos Arduino pero en una
sola dirección, para hacerlo en dos direcciones tenemos dos formas, half-duplex y
full-duplex.

Ej 2. Comunicación full dúplex entre dos Arduinos


En este caso necesitamos agregar otro par de líneas más, en total unirían a los
Arduino 4 líneas, un par son para transmitir (TX) y otro par para recibir (RX).
En el siguiente ejemplo desde un Arduino no solo enviaremos datos para mover un
servomotor sino también recibiremos datos de un sensor, usaremos un
potenciómetro para simular el sensor.
Las conexiones serían las siguientes:
Al Arduino de la izquierda, lo llamaremos Maestro, pues es el Arduino principal y
quien administrara todas las órdenes, mientras que el segundo Arduino lo
denominaremos Esclavo; esta no es específicamente la definición de
Maestro/Esclavo en una comunicación RS485 pero usaremos estas
denominaciones para saber a qué Arduino nos estamos refiriendo.
El código del Arduino Maestro.

const int ledPin = 13; // Numero del pin para el Led

void setup()

Serial.begin(9600);

pinMode(ledPin, OUTPUT);//inicializamos el pin del Led como salida

void loop()

if(Serial.available())

if(Serial.read()=='i') //si recibimos el inicio de trama

int dato=Serial.parseInt(); //recibimos valor numérico

if(Serial.read()=='f') //Si el fin de trama es el correcto

funcion(dato); //Realizamos la acción correspondiente

int lectura = analogRead(0);//leemos el valor del potenciómetro (de 0 a 1023)

int angulo= map(lectura, 0, 1023, 0, 180); // escalamos la lectura a un valor de ángulo


(entre 0 y 180)

//---enviamos el ángulo para mover el servo------

Serial.print("I"); //inicio de trama

Serial.print("S"); //S para indicarle que vamos a mover el servo

Serial.print(angulo); //ángulo o dato


Serial.print("F"); //fin de trama

//----------------------------

delay(50);

//---solicitamos una lectura del sensor----------

Serial.print("I"); //inicio de trama

Serial.print("L"); //L para indicarle que vamos a Leer el sensor

Serial.print("F"); //fin de trama

//------------------------------------------------

delay(50);

//esta función puede variar de acuerdo a su necesidad

void funcion(int dato)

if(dato>500)

digitalWrite(ledPin, HIGH);

else

digitalWrite(ledPin, LOW);

Código del Arduino Esclavo:

#include <Servo.h>

Servo myservo; // creamos el objeto servo

void setup()

Serial.begin(9600);

myservo.attach(9); // asignamos el pin 9 para el servo.

void loop()
{

if(Serial.available()>0)

if(Serial.read()=='I') //Si recibimos el inicio de trama

char funcion=Serial.read(); //leemos el carácter de función

//---Si el carácter de función es una S entonces la trama es para mover el motor-----------

if(funcion=='S')

int angulo=Serial.parseInt(); //recibimos el ángulo

if(Serial.read()=='F') //Si el fin de trama es el correcto

if(angulo<=180) //verificamos que sea un valor en el rango del servo

myservo.write(angulo); //movemos el servomotor al ángulo correspondiente.

//---Si el carácter de función es L entonces el maestro está solicitando una lectura del
sensor

else if(funcion=='L')

if(Serial.read()=='F') //Si el fin de trama es el correcto

int lectura = analogRead(0); //realizamos la lectura del sensor

//----enviamos la respuesta-----

Serial.print("i"); //inicio de trama

Serial.print(lectura); //valor del sensor

Serial.print("f"); //fin de trama

//-----------------

delay(10);

}
Como se observa se ha establecido una trama para la comunicación:
[Inicio de trama][Función][Valor][Fin de trama]
En nuestro caso el inicio de trama es el carácter ‘A’ , la función es el carácter S o L
para indicar que vamos a mover el servo o solicitar una lectura del sensor, el [valor]
solo estará presente cuando la función necesite enviar una dato, y el fin de trama
que usamos es el carácter F. Unos ejemplos de esta trama serian:
“IS90F”,”IS120F”,”ILF”, etc.
El esclavo interpreta esta trama y realiza la función correspondiente, si es una
función que necesite responder, la trama de respuesta es:
[Inicio de trama][Valor][Fin de trama] , como por ejemplo “i865f”, “i64f”

Ej 3. Comunicación half dúplex entre dos Arduinos


En una comunicación half dúplex utiliza un solo canal para comunicarse, en un
momento por el canal se transmiten datos y en otro momento se reciben datos, pero
nunca podremos transmitir y recibir a la vez.
Para realizar esta comunicación los pines DE y RE del módulo RS485 deben ir
conectados al Arduino, con esto desde el programa podemos establecer al módulo
como transmisor o receptor
El siguiente ejemplo hace lo mismo que el ejemplo anterior solo que esta vez se usa
un módulo rs485 por Arduino y un par de cables para comunicarse.
Las conexiones serían las siguientes:

Al igual que en el caso anterior el Arduino de la izquierda será el maestro y el de la


derecha será el esclavo.
Código del Maestro:
const int ledPin = 13; // Numero del pin para el Led

const int EnTxPin = 2; // HIGH:TX y LOW:RX

void setup()

Serial.begin(9600);

Serial.setTimeout(100);//establecemos un tiempo de espera de 100ms

//inicializamos los pines

pinMode(ledPin, OUTPUT);

pinMode(EnTxPin, OUTPUT);

digitalWrite(ledPin, LOW);

digitalWrite(EnTxPin, HIGH);

}
void loop()

int lectura = analogRead(0);//leemos el valor del potenciómetro (de 0 a 1023)

int angulo= map(lectura, 0, 1023, 0, 180);// escalamos la lectura a un valor de ángulo


(entre 0 y 180)

//---enviamos el ángulo para mover el servo------

Serial.print("I"); //inicio de trama

Serial.print("S"); //S para indicarle que vamos a mover el servo

Serial.print(angulo); //ángulo o dato

Serial.print("F"); //fin de trama

//----------------------------

delay(50);

//---solicitamos una lectura del sensor----------

Serial.print("I"); //inicio de trama

Serial.print("L"); //L para indicarle que vamos a Leer el sensor

Serial.print("F"); //fin de trama

Serial.flush(); //Esperamos hasta que se envíen los datos

//----Leemos la respuesta del Esclavo-----

digitalWrite(EnTxPin, LOW); //RS485 como receptor

if(Serial.find("i"))//esperamos el inicio de trama

int dato=Serial.parseInt(); //recibimos valor numérico

if(Serial.read()=='f') //Si el fin de trama es el correcto

funcion(dato); //Realizamos la acción correspondiente

digitalWrite(EnTxPin, HIGH); //RS485 como Transmisor

//----------fin de la respuesta-----------

void funcion(int dato)


{

if(dato>500)

digitalWrite(ledPin, HIGH);

else

digitalWrite(ledPin, LOW);

Código de Esclavo:
#include <Servo.h>

Servo myservo; // creamos el objeto servo

const int EnTxPin = 2;

void setup()

Serial.begin(9600);

myservo.attach(9); // asignamos el pin 9 para el servo.

pinMode(EnTxPin, OUTPUT);

digitalWrite(EnTxPin, LOW); //RS485 como receptor

void loop()

if(Serial.available())

if(Serial.read()=='I') //Si recibimos el inicio de trama

char funcion=Serial.read();//leemos el carácter de función

//---Si el carácter de función es una S entonces la trama es para mover el motor---


--------

if(funcion=='S')

int angulo=Serial.parseInt(); //recibimos el ángulo


if(Serial.read()=='F') //Si el fin de trama es el correcto

if(angulo<=180) //verificamos que sea un valor en el rango del servo

myservo.write(angulo); //movemos el servomotor al ángulo correspondiente.

//---Si el carácter de función es L entonces el maestro está solicitando una lectura


del sensor---

else if(funcion=='L')

if(Serial.read()=='F') //Si el fin de trama es el correcto

int lectura = analogRead(0); //realizamos la lectura del sensor

digitalWrite(EnTxPin, HIGH); //rs485 como transmisor

Serial.print("i"); //inicio de trama

Serial.print(lectura); //valor del sensor

Serial.print("f"); //fin de trama

Serial.flush(); //Esperamos hasta que se envíen los datos

digitalWrite(EnTxPin, LOW); //RS485 como receptor

delay(10);

}
Como se observa el código cada vez que vamos a escribir o leer datos activamos o
desactivamos respectivamente el pin que va conectado a DE y RE del módulo
RS485.
EL maestro siempre tiene activo la línea como transmisión pudiendo escribir en
cualquier momento, mientras que el esclavo siempre está en modo recepción,
escuchando los datos que le lleguen. Cuando el maestro necesite una respuesta
por parte del esclavo, después de enviar la consulta, debe cambiar a modo de
receptor para que el esclavo puede usar el canal para transmitir los datos, finalizado
la respuesta, el maestro nuevamente debe tener libre el canal para transmitir.
Programas de aplicación transmisor – receptor
Arduino: Comunicación inalámbrica con NRF24L01
La función de este artículo es ofrecer una explicación sobre cómo establecer una
comunicación inalámbrica entre dos placas Arduino usando el módulo transceptor
NRF24L01.

La primera comunicación inalámbrica que explicaré será básica: enviar un simple


mensaje de texto, tipo «Hola Mundo», de un Arduino a otro.

A continuación, podremos extender este ejemplo de comunicación al envío de


comandos de texto —usando el mismo circuito y estructura de programa— para
controlar un sistema cualquiera ubicado en el extremo receptor.

Más adelante ofreceré un artículo con un ejemplo de comunicación bidireccional


entre placas Arduino. Un Arduino tiene conectado un potenciómetro con el que se
controla un servo en el segundo Arduino. Y en el otro sentido, unos interruptores en
el segundo Arduino servirán para controlar LEDs en el primero.
Módulo transceptor NRF24L01

En la imagen se observa el módulo transceptor NRF24L01. Utiliza la banda de 2,4


GHz y puede operar con velocidades de transmisión de 250 kbps hasta 2 Mbps. Si
se usa en espacios abiertos y, con menor velocidad de transmisión, su alcance
puede llegar hasta los 100 metros. Para mayores distancias, hasta 1000 metros,
existen módulos provistos con una antena externa en lugar de una antena trazada
sobre la misma placa, como se observa en la imagen.

El módulo puede usar 125 canales diferentes, lo que da la posibilidad de tener una
red de 125 módems que funcionen con independencia uno de otro en un solo lugar.
Cada canal puede tener hasta 6 direcciones, es decir, cada unidad puede
comunicarse con hasta otras 6 unidades al mismo tiempo.
Una vez conectados los módulos NRF24L01 a las placas Arduino, llegará el
momento de escribir los programas para el transmisor, y para el receptor.
Conexionado para utilizar Arduinos Uno R3 en ambos lados de la
comunicación:

Código para los Arduino


Primero debemos descargar e instalar la librería RF24.
Aquí están los dos códigos para la comunicación inalámbrica y abajo, en los
archivos, hay amplias explicaciones. He puesto la mayor parte de las explicaciones
dentro del programa, como comentarios.
Código del Transmisor
Código del receptor

Una vez cargados ambos programas, podemos abrir el monitor serie en el Arduino
receptor y observaremos la aparición del mensaje «Hola Mundo» cada 1 segundo.
OTRO PROGRAMA EJEMPLO
Montaje 2: Conectar dos Arduinos
El proceso es parecido al bluetooth. Aquí queremos que una Arduino envíe
(MAESTRO) y que otra reciba (ESCLAVO), así que cada una correrá un programa
distinto.
Podemos hacer también que ambas tarjetas envíen y reciban datos, para ello, la
modificación sobre lo que expongo aquí serían muy sencillas, (básicamente copiar
y pegar los trozos de código intercambiados).
Conexiones:
Usaremos los pines estándar de comunicación serie de Arduino:
 0 : RX (pin por el que RECIBE los datos serie)
 1 : TX (pin por el que ENVÍA los datos serie)
Para comunicación en 2 direcciones: los 2 pueden enviar / recibir. Las conexiones
TX/RX se intercambian (lo que uno envía -TX- tiene que entrar en el otro -RX-).
Cualquiera de las 2 puede ser Maestro o Esclavo. IMPORTANTE: Conectar ambas
GND de las placas.

En el siguiente ejemplo , el maestro, cada 3 segundos envía un carácter al esclavo.


 Si envía una "r", el esclavo hará parpadear su led (d13) rápido.
 Si envía una "l", el esclavo hará parpadear su led (d13) lento.

El programa para el Arduino MAESTRO es:


////////////////////// ARDUINO MAESTRO /////////////////
void setup(){
Serial.begin(9600);
}
void loop()
{ Serial.write("r");
delay(3000);
Serial.write("l");
delay(3000);
}

El programa para el Arduino ESCLAVO es:

////////////// ARDUINO ESCLAVO /////////


void setup(){
pinMode(13,OUTPUT);
Serial.begin(9600);
}
void loop(){
char dato= Serial.read();//Guardamos en la variable
dato el valor leido
switch(dato){ //Comprobamos el dato
case 'r': //Si recibimos una 'r' ...
for(int i=0; i<20; i++){
digitalWrite(13,HIGH);
delay(80);
digitalWrite(13,LOW);
delay(80);
}
break;
case 'l': //si recibimos una 'l' ...
for(int i=0; i<10; i++){
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
}
break;
default:
digitalWrite(13,LOW);
break;
}
}
OTRO EJEMPLO CON LEDS
Vamos a tener que cargar dos códigos, un código al que hace de master y otro
código al que hace de esclavo (slave). En los dos casos haremos uso de la librería
Wire, que nos proporcionará todos los métodos y propiedades para poder utilizar el
protocolo I2C de una forma sencilla.
Empecemos con el código del master. El objetivo de la aplicación es encender los
LEDs conectados a los pines 0, 1, 2, 3, 4 con un retardo de un segundo.

El código del esclavo es diferente. Lo primero que hay que destacar es que
tendremos un evento que se disparará cuando reciba un dato del dispositivo master.
La primera parte leerá un entero (int) y la segunda parte leerá un carácter (char).
Dependiendo de si el carácter es H o L pondrá en estado alto (H) o bajo (L).

También podría gustarte