Comunicación Serial con Arduino


Los puertos de comunicación serial nos proporcionan la forma más efectiva de comunicar nuestra paca de Arduino con nuestro ordenador, y como podrás notarlo a través de esta comunicación podremos mandar diferentes órdenes a nuestro Arduino para automatizar procesos o incluso recibir informaciones importantes para mostrarlas en la pantalla de nuestro computador.

La comunicación serial entre dos dispositivos únicamente utiliza 3 líneas las cuales son:

Línea de recepción de datos (RX)
Línea de transmisión de datos (TX)
Línea común (GND)

Comuicacion serial

Dichas líneas podemos encontrarlas fácilmente en nuestra placa de Arduino. Aquí te cuento cuantos puertos seriales tiene el Arduino UNO, mini pro, MEGA y Due.

Arduino UNO y Mini Pro: Pines 0 (RX) y 1 (TX);
Arduino Mega y Arduino Due:  son cuatro puertos de serie.
puerto serie 0: pines 0 (RX) y 1 (TX)
puerto serie 1: pines 19 (RX) y 18 (TX)
puerto serie 2: pines 17 (RX) y 16 (TX)
puerto serie 3: pines 15 (RX) y 14 (TX)

La comunicación serial entre dos dispositivos se realiza a través del intercambio de una secuencia de bits, donde se transmite bit a bit, uno por vez, donde, aunque es lenta la comunicación, tiene la ventaja de poder ser transmitida a mayores distancias y utilizar menos líneas de comunicación.

señal asincrona

En sistemas embebidos es común referirse a los puertos series como UART (universally asynchronous receiver/transmitter) la cual simplemente es una unidad que nos indica la conversión de los datos a una secuencia de bits donde posteriormente son transmitidos o recibidos a una velocidad determinada.

La comunicación serial también se da mediante variaciones de voltaje, donde dispositivos TTL (transistor transistor logic) realizan la comunicación mediante variaciones de señal entre 0 y 5v o entre 0 y 3.3v.

Puerto Serie del Arduino


Las placas de Arduino poseen unidades UART que operan a nivel TTL  0 / 5v, lo que las vuelve compatibles con la conexión USB.Como ya vimos los pines de los puerto seriales, podemos notar también que la mayoría de Arduinos disponen de um conector USB que nos permite una conexión serie instantánea con nuestro ordenador.

Comunicación Serial con Arduino

Comunicación Serial Arduino PC


Conectamos nuestro Arduino a nuestro computador a través del cable USB, y dentro del IDE de arduinos debemos abrir el Monitor Serial

Monitor Serial Arduino


El monitor serial de Arduino es una interfaz grafica integrada al IDE Standard que nos permite recibir o transmitir datos utilizando el protocolo de comunicación serial, por lo tanto dicho monitor serial dispone de ambas zonas (recepción y transmisión)

Pasos para trabajar con la comunicación serial con Arduino


Definir dentro del void setup del Arduino la comunicación serial mediante la siguiente instrucción

Serial.begin(velocidad);

Donde velocidad puede tomar los siguientes valores: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 o 115200.

La unidad de medida de las velocidades son el Baudio correspondiente al número de cambios en una señal por segundo.

1.Dentro del void loop, se pueden imprimir o mostrar los datos en el Monitor Serial mediante la instrucción:

Serial.print(dato);

2.También puede mostrar el dato con un enter al final

Serial.println(dato);

3.Para leer datos desde el puerto serial se usa:

dato = Serial.read();

4.Para escribir en el puerto serie datos en forma de bytes se usa:

Serial.write(dato);

5.Para conocer si existen datos pendientes en el bus de comunicación serial usamos:

Serial.available()

esta instrucción retorna un TRUE si es verdad o un FALSE si es falso.
6. Para deshabilitar el puerto serial y de esa forma poder usar los pines TX y RX como pines digitales, usamos:
Serial.end()
7.Si deseamos preguntar si el puerto serial está listo para efectuar la comunicación:
if (Serial)
Devuelve true si el puerto serial el cual se ha especificado está disponible.
8.Para leer los datos del buffer y buscar un string especifico usamos el comando:
Serial.find(string);
9.Si se desea configurar el máximo de milisegundos que desea esperarse mientras llega un dato por el puerto serial (por defecto es 1000ms), se usa:
Serial.setTimeout(time)
10.Para saber cuando los datos están disponibles y poder utilizar Serial.read() para capturar estos datos usamos la siguiente instrucción que actualmente no es compatible con Esplora, Leonardo o Micro
serialEvent()
11.Para esperae a que se complete la transmisión de los datos seriales salientes.
Serial.flush()
12.Para devolver el siguiente byte (carácter) de los datos en serie entrantes sin eliminarlos del búfer interno se usa:
Serial.peek()
13.Para leer caracteres del buffer serie y guardarlos en un string hasta que se produzca un timeout usamos:
Serial.readString()

Arduino Mega o Due con más de 1 puerto serial

En el caso de trabajar con una placa que poseea más de 1 puerto serial como es el caso del Arduino Mega o el Due, las instrucciones a usar son exactamente las mismas, con exepeción de que el puerto serial por defecto (el que esta conectado al USB o puerto serial 0) se conoce como Serial, el puerto serial 1, 2 y 3 se conocen como Serial1Serial2 y Serial3 respectivamente.
Por lo tanto para imprimir o leer datos puede hacerse de la siguiente forma:
Serial1.print(dato); //Imprime en el puerto serie 1
dato = Serial3.read(); //lee el puerto serie 3
Serial2.write(dato); //Escribe el dato en puerto serie 2

Ejemplos

Veamos como usar el monitor serial de Arduino utilizando el protocolo de comunicación serial

Recibir datos serial desde el Arduino

Recibir el valor de una variable contador enviado desde la placa Arduino a través del puerto de comunicación serial y mostrarlos en el monitor serial.

Enviar datos serial al Arduino

Vamos enviar un número desde el computador y mostrarlo en un display 7 segmentos integrado a la placa de Arduino, adicionalmente conectar un LED al PIN 13 el cual debe ser prendido o apagado a través de la comunicación serial.

Comunicación Serial con Arduino

Códigos

Recibir datos Serial desde el Arduino

//Creamos un contador
int contador=0;
void setup(){
//Configuramos el puerto serial
Serial.begin(9600);
}
void loop(){
//Imprimimos el valor del contador en el monitor serial
Serial.print("Contador: ");
Serial.println(contador);  
//incrementamos el contador y esperamos medio segundo
contador++;
delay(500);
}

Enviar datos serial al arduino

//Display 7 Segmentos Catodo Común
int display7c[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
//Display 7 Segmentos Anodo Común
int display7a[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
//Pines del Display
byte a=2;
byte b=3;
byte c=4;
byte d=5;
byte e=6;
byte f=7;
byte g=8;
int dato=0;
byte led = 13;
//Función Display 7 Segmentos
void display7seg(int bits,int a,int b,int c,int d,int e,int f,int g){
//Mostra o numero bits no display 7 segmentos
digitalWrite(a,bitRead(bits,0));
digitalWrite(b,bitRead(bits,1));
digitalWrite(c,bitRead(bits,2));
digitalWrite(d,bitRead(bits,3));
digitalWrite(e,bitRead(bits,4));
digitalWrite(f,bitRead(bits,5));
digitalWrite(g,bitRead(bits,6));
}
void setup(){
//Configura los 8 Pines digitales como SALIDAS
for(int i=a;i<=g;i++){
pinMode(i,OUTPUT);
}
Serial.begin(9600);
pinMode(led, OUTPUT); 
//Inicializa el display 7 segmentos
display7seg(display7c[dato],a,b,c,d,e,f,g);
}
void loop(){
//si existe datos disponibles en el bus serial
if (Serial.available()){
//leemos el dato enviado
dato=Serial.read();
if(dato=='p') { //letra   p - Prender
digitalWrite(led, HIGH);
Serial.println("LED ON");
}
if(dato=='a') { //letra a - Apagar
digitalWrite(led, LOW);
Serial.println("LED OFF");
}
if(dato>='0' && dato<='9') { //letra a - Apagar
display7seg(display7c[dato-48],a,b,c,d,e,f,g);
Serial.print("DATO: ");
Serial.println(dato-48);
}
}
}






































































No hay comentarios:

Publicar un comentario