Vous êtes sur la page 1sur 13

LABORATORIO – COMUNICACIÓN SERIAL ENTRE DISPOSITIVOS

UNIVERSIDAD DE SAN BUENAVENTURA


FACULTAD INGENIERIA
BOGOTA

Andrés Felipe García


Juan David Bueno Erazo

ABSTRACT

Serial communication is a type of communication used in the digital world to transmit information
between two and more devices, this information travels through a single channel. The concept of
serial communication is easy to understand, the serial port, whether <Tx> Transmitter or <Rx>
receiver sends or receives bytes of information at a certain rate, one bit at a time. Although this is
slower than parallel communication, which allows the transmission of one complete byte at a time,
depending on the resolution, this communication method is simpler and can reach greater
distances. For example, in the standard in parallel communication it determines that the length of
the cable for the equipment cannot be more than 20 meters, with no more than 2 meters between the
connections of the devices; on the other hand, using serial communication the cable length can
reach 1200 meters.
i. INTRODUCCION  Tierra (Ground)
 Transmitir (Tx)
La comunicación serial como su nombre lo  Recibir (Rx)
indica es un tipo de comunicación usada en
el mundo digital para transmitir a. Comunicación serie sincrónica
información entre dispositivos, esta Este tipo de información es aquella en la
información viaja por un solo canal. El que los usuarios, a través de una red,
concepto de comunicación serial es fácil de coinciden en el tiempo y se comunican
comprender, el puerto serial, sea entre sí mediante texto, audio o vídeo.
Transmisor <Tx> o receptor <Rx> envía o Por ejemplo, en una vídeo llamada, los
recibe bytes de información a una interlocutores implicados conversan al
velocidad determinada, un bit a la vez. Aun mismo tiempo, siendo necesario que,
y cuando esto es más lento que la tanto emisor, como receptor se
comunicación en paralelo, que permite la encuentren conectados al mismo tiempo.
transmisión de un byte completo por vez,
dependiendo de la resolución, este método b. Comunicación asincrónica.
de comunicación es más sencillo y puede En la comunicación asincrónica los
alcanzar mayores distancias. Por ejemplo, participantes utilizan el sistema de
en la norma en la comunicación en paralelo comunicación en tiempos diferentes. Un
determina que el largo del cable para el ejemplo sería el correo electrónico, pues
equipo no puede ser mayor a 20 metros, el receptor puede leer el mensaje en
con no más de 2 metros entre las cualquier momento después de que el
conexiones de los dispositivos; por el otro receptor lo envíe, sin que se produzca
lado, utilizando comunicación serial el esa simultaneidad en la comunicación.
largo del cable puede llegar a los 1200
metros [1]. Debido a que la transmisión serial es
asincrónica, es posible enviar datos por una
línea mientras se reciben datos por otra. Las
ii. MARCO TEORICO características más importantes de la
comunicación serial son la velocidad de
La comunicación serial contiene transmisión, los bits de datos, los bits de
información en una cadena única de bits, parada, y la paridad. Para que dos puertos
esta cadena se encuentra contenida de se puedan comunicar, es necesario que las
manera binaria dependiente de un tiempo, características sean iguales.
es decir los bits se representan por códigos
que se transmiten por un periodo de tiempo Para comprender el funcionamiento de un
determinado. El periodo de tiempo usado puerto serial, es necesario entender primero
para transmitir cada código se conoce como las comunicaciones paralelas. Un puerto
periodo baud. En Arduino el baudrate se paralelo estándar utilizar ocho conectores,
usa en 9600 baudios, es decir, 9600 bits por si hablamos de resolución, para transmitir
segundos. los bits de datos de forma simultánea,
formando un solo carácter. La siguiente
Generalmente, la comunicación serial se ilustración muestra la transmisión en
utiliza para transmitir datos en formato paralelo de la letra a.
ASCII. Para realizar la comunicación se
utilizan 3 líneas de transmisión:
Ilustración 1. Puerto de comunicación paralela Ilustración 3. Conexión Arduino - Arduino

Los puertos serie requieren un solo Para esta conexión se usaron dos tipos de
conector, o cable, para enviar el mismo arduinos, el Mega 2560 y el DUE,
carácter de datos al dispositivo. Los datos permitiendo así la conexión mediante
cambian de formato paralelo (enviado por comunicación serial, usando el puerto Tx2
el sistema), a formato secuencial o serial, del MEGA llegando al Rx3 del DUE.
en el que los bits se organizan uno tras otro
Ilustración 4. Fotografia conexion entre arduinos.
en una serie. Los datos se transmiten
entonces al dispositivo, enviando el bit
menos significativo, LSB (o el bit cero) en
primer lugar. Una vez que el dispositivo
remoto recibe los datos, éstos se vuelven a
convertir al formato paralelo. La ilustración
siguiente muestra la transmisión serie de la
letra a.

Ilustración 2. Puerto de comunicacion serie

En la practica se envió un desde el monitor


serial el carácter byte x = 1; Para generar
un loop en arduino, ver ilustración.

Ilustración 5. Codigo Arduino Mega 2560 Tx2


Las transmisiones serie de un solo carácter
son simples y directas; sin embargo, surgen
complicaciones cuando se transmiten en
series un gran número de caracteres, como
por ejemplo audio.

iii. ANALISIS
Al visualizar la salida Tx2 en el
a. Arduino – Arduino osciloscopio (Ver ilustración 6), se puede
apreciar la trama en formato de 8N1, esta
es una abreviatura habitual de la
configuración del puerto serie en modo
asíncrono donde hay (8) bits de datos, Python para visualizar la información que
ningún (N) bit de paridad, y un (1) bit de salió del arduino. Minicom, es una librería
parada. usada para esta tarea. La siguiente imagen
muestra el código usado.
Ilustración 6. Visualización byte x = 1.

Se envía por el puerto serial, una


información tipo char.

La cadena de información que muestra la


imagen es [0,1,0,0,0,1,1,0,0,1] concluyendo
así que el formato de salida en el puerto
serial 3 es de codificación ASCII, ya que el
byte x = 1, es interpretado como un 49 en
binario pero con el LSB y MSB invertidos.
49 en binario 110001; además de ello para En la siguiente imagen se puede visualizar
representar un 49 solo se necesitan 6 bits, en la Rasperry la información obtenida.
los otros 2 son llenados por dos 0 seguidos.

b. Arduino – Raspberry Pi3 Model B+

Para la conexión serial en el Raspberry Pi


se recorrio a la tabla de puertos del
Model(Ver Anexo) B+ donde se pudieron
usar los puertos UART 8 y 10 hacían
referencia a la comunicación serial
GPIO15 – Tx – UART 8 y GPIO16 – Tx –
UART 10

Ilustración 7. Conexion arduino - Raspeberry

En conclusión la conexión de arduino a


raspberry se pude hacer de forma sensilla
conectando direcatamente la salida del Rx
y Tx al Tx y Rx del raspberry y
configurando el puerto de Comunicación
Para poder visualizar la información en
medianta la librería de Minicom.
Raspberry, se tuvo que usar librerías de
enviada desde un dispositivo “Tx”, para
c. Arduino - RS232 así analizar los bits de redundancia y
comprender como funciona mas a fondo
RS-232, también conocido como EIA/TIA este tipo de comunicación.
RS-232C, es una interfaz que designa una
norma para el intercambio de datos
binarios serie entre un emisor, como por
ejemplo una computadora, y un receptor,
por ejemplo un módem [2]. En este
laboratorio se uso este tipo de conector
para ver la información serial que sale del
arduino.

d. Identificador de Trama

Para el identificador de trama el docente


nos asigna el valor ‘ESC’ en ASCII que
corresponde al numero 27 en decimal y
11011 en binario, para la construcción de
Se conecta el cable de USB to Serial (Ver esta trama fue necesario investigar mas a
Ilustración) para recibir la información fondo la programación en arduino y fue
serial por un puerto del ordenador, imposible reconstruir esta trama, ya que si
COM1, mediante el software Monitor enviaba el 27 en tipo char, el programa
Serial concatenaba estas dos variables, 2 y 7 y
enviaba el código por separado.

Mediante el uso del hardware USB to


Serial, podemos visualizar la información
Una vez puesto los encoders y decoders
e. TLP / RLP 433 Pulsador no tuvimos ningún problema al enviar la
señal para que el led se encendiera, esto
Los módulos RF de 433Mhz son muy no era posible de solventar sin estos
populares por su bajo precio y fácil uso. modulos, ya que cuando se pretendio
Vienen en pareja, estos trabajan a 5V, el realizar el montaje sin ellos, se encontraba
tipo de comunicación es simplex, es decir con un alto flujo de señal en esta
en un solo canal y unidireccional, son de frecuencia modulada y esto se daba por
baja velocidad de transmisión pero para que no había un filtro que nos permitiera
aplicaciones básicas son muy útiles, entre rechazar información que no estábamos
sus limitantes se encuentra la frecuencia enviando.
máxima de envió de datos, es oscila entre
los 12kHz y 13kHz, después de este
umbral el modulo es incapaz de
determinar cuando la señal es un 1 o un 0.
En la siguiente ilustracion se puede
apreciar el montaje usado para los
modulos, adicionalmente fue necesario
usar los encoder y decoder HT12E
/HT12D que funcionan bastante bien con
los módulos de radiofrecuencia.

f. TLP / RLP 433 Señal cuadrada


protocolo MIDI tiene una velocidad
Para este montaje se envió una señal distinta de envio, baudios, esta es de
cuadrada desde el osciloscopio, con un 115200 Baudios generalmente, esto se
offset de 2.5 y un voltaje pico a pico de debe al gran contenido de información
5V. que tiene una trama de MIDI, Notein,
Noteoff, control change, velocity, entre
otros. Este problema fue solucionado
mediante el software Hairles MIDI, que
me permitia recibir la señal MIDI a una
velocidad y enviarla a el Puerto Serial
mediante otra.

Cuando se quizo aumentar la frecuencia Obteniendo como resultado Note: 72 y


nos encontramos con un limitante, cuando velocity 127, que hace referencia a un C6.
queríamos aumentar la frecuencia, la
información se perdia y muchas veces no
era recibida por el modulo de manerea
correcta.

g. Controlador MIDI – RS232


h. Controlador MIDI – TLP / RLP 433
Para esta conexión fue necesario mirar
cual era el transmisor del conector MIDI. Cuando aplicamos este punto, fue
imposible ver la información MIDI
después del receptor ya que la velocidad
de envió sobrepasaba por mucho la del
receptor, (32800 Baudios, mínimo para
enviar en MIDI)

i. Encoder – Decoder

Como se indico anteriormente los


modulos usados fueron los HT12D, este
es es un decodificador serial de datos para
aplicaciones de control remoto. Este
Se encontró que el Pin 2 hacia referencia integrado es especialmente útil para
a GROUND, el 4 a Vin y el 5 a Tx. ensamblar dispositivos receptores de
Una vez identificado el Pin 5, este es control remoto que usan canales de RF o
llevado al Tx del integrado RS232 para infrarrojos como medio de transmisión; Y
poderla analizar desde el Monitor Serial. el HT12E es un codificador (encoder)
Aca se encontró un problema y es que el
serial de datos para aplicaciones de memorias diferentes y por tiempo
control remoto. limitado la informacion que se envía o se
recibe.
j. Chat.

Para el chat fue necesario hacer la


comunicación bidireccional, es decir
conectar el Ardino 1 Tx – Rx Arduino 2 y
Arduino 1 Rx – Tx Arduino 2. Asi se
garantiza que lo que envía uno lo recibe el
otro y viceversa. Se uso la librería
SoftwareSerial, que permitia almacenar en

Ver Anexo 2. Para la implementación del


código.
iv. CONCLUSIONES Los puertos seriales y su protocolo son
muy importantes en el diseño de
Actualmente, la tecnología esta en sistemas. Su uso extendido esta
constante avance debido a las nuevas fundamentado en la facilidad de su
necesidades que se le presenta a los protocolo que sólo adhiere unos pocos
usuarios, y esto hace que se creen bits a cada paquete de datos.
nuevos programas, mas fáciles de usar Actualmente esta siendo desplazado
y mas eficientes y dispositivos que por protocolos seriales más avanzados
respondan a los programas nuevos. como lo son I2C o SPI. Finalmente, su
Los puertos seriales son una parte facilidad de uso lo hace un puerto
esencial de un sistema ya que sin ellos indispensable para hobbistas y
no se daría el intercambio de datos o profesionales de la electrónica y
información entre una dispositivo y sus sistemas embebidos.
periféricos.

v. BIBLIOGRAFIA

[1] I. e. d. programables, «IEEE,» Enero 2009. [En línea]. Available:


http://www3.fi.mdp.edu.ar/mediciones/apuntes/IEEE488.pdf. [Último acceso: 18 09
2019].
[2] M. S. González, «Sistemas telematicos,» RA-MA, España, 2007.

vi. ANEXO 1
vii. ANEXO 2 - Codigo Chat Arduino.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

#define PIN_RX 2
#define PIN_TX 3

String inputString = ""; // donde recibo los datos del softwareSerial


String outputString = ""; // donde mando los datos al softwareSerial
String inputStringDec = ""; //string entrante con los datos en decimal
unsigned long previousmillis = 0;

void setup() {
Serial.begin(9600);
//Por defecto el ultimo puerto inicializado esta escuchando, como solo usamos uno, no es
ncesario usar la funcion listen() de software serial
mySerial.begin (4800); //probar a poner velocidades diferentes en cada punto.
// reserve 200 bytes for the inputString:
outputString.reserve(200); //Maximo de 200 caracteres que podemos trabajar con este
programa
pinMode(PIN_RX,OUTPUT);
pinMode(PIN_TX,OUTPUT);
}
void loop()
{
int tiempoLoop = millis() - previousmillis;
previousmillis = millis();
if (tiempoLoop > 250) { //como los loops pueden ser largos, imprimo por pantalla si es
mayor de 250 ms.
Serial.print("Tiempo de Loop: ");
Serial.println(tiempoLoop);
}

inputString = ""; //inicalizo los String en cada loop


outputString = "";
inputStringDec = "";

//////////////////// Leo del serie en cada loop el buffer completo


if (mySerial.available()) {
digitalWrite(PIN_RX,HIGH); //Enciendo el led de recepción de paquetes por puerto SW
serial
while (mySerial.available()) { //Primero en el loop miro lo que entra por el serie
conectado al otro Arduino
//leo el nuevo caracter
char inChar = (char)mySerial.read();
delay(20);
//if (inChar == '\n') break; //salgo del while si detecto un salto de linea si solo quisiera
leer lineas
inputString += inChar;
inputStringDec += int(inChar);
inputStringDec += '-';
if (inputString.length() > 100) break; //Salgo del bucle e imprimo si tengo muchos
caracteres, por ejemplo infinito
}
digitalWrite(PIN_RX,LOW);
Serial.print("Recibido por puerto serie ");
Serial.print(inputString.length());
Serial.print(" caracteres.\nTexto: ");
Serial.println(inputString); //Escribo en consola todo lo recibido.
Serial.print("Leido en base DEC: ");
Serial.println(inputStringDec);
}

/////////////////// Leo de la consola en cada loop el buffer completo


if (Serial.available()) {
while (Serial.available()) {
char outChar = (char)Serial.read();
delay(5);
//if (outChar == '\n') break; //salgo del while si detecto un salto de l �nea.
outputString += outChar;
}

Serial.print("He escrito por consola: ");


Serial.print(outputString.length());
Serial.print(" caracteres.\nTexto: ");
Serial.println(outputString); //Escribo en consola todo lo recibido.

if (outputString == "repite") {
String repiteString = "";
Serial.println("Cuantas veces repito?");
while (Serial.available() == 0) {
} // No hago nada hasta que no respondo a la pregunta
while (Serial.available()) { //Espero una segunda cadena
char outChar = (char)Serial.read();
delay(5);
repiteString += outChar;
}
Serial.println(repiteString);
int repito = repiteString.toInt();
if (repito <= 0) {
Serial.println("No es un valor correcto, repito 10 veces..");
repito = 10;
}

digitalWrite(PIN_TX,HIGH); //Enciendo el led de transmisión de paquetes por puerto


SW serial
for (int i = 0; i < repito ; i++) { //repito 10 veces la segunda cadena
mySerial.print(outputString);
}
digitalWrite(PIN_TX,LOW);
}
else if (outputString == "ataca") {
String atacaString = "";
Serial.println("Que cadena quieres repetir 100 veces?");
while (Serial.available() == 0) {
} // No hago nada hasta que no respondo a la pregunta
while (Serial.available()) { //Espero una segunda cadena
char outChar = (char)Serial.read();
delay(5);
atacaString += outChar;
}
Serial.println(atacaString);
digitalWrite(PIN_TX,HIGH);
for (int i = 0; i < 100; i++) {
mySerial.print(atacaString);
}
digitalWrite(PIN_TX,LOW);
}
else if (outputString == "infinito") {
digitalWrite(PIN_TX,HIGH);
while (true) {
mySerial.println("bucle infinito");
}
}
else {
digitalWrite(PIN_TX,HIGH);
mySerial.print(outputString);
digitalWrite(PIN_TX,LOW);
}
}
}

Vous aimerez peut-être aussi