domingo, 5 de marzo de 2017

ARDUINO desde cero: 5 - Comunicación Serial

El puerto serie nos permite conectarnos y comunicarnos con otros dispositivos que tenga puerto serie. Cada dispositivo podrá recibir y enviar información.

La comunicación serial consiste únicamente  enviar bits sucesivos uno detrás de otro, bloques de estos bits llevaran información
Serie bits
Serie de bits

En este caso vamos a ver como recibir y enviar información con nuestro ordenador  y el monitor serial.

Las funciones que debemos usar son muy sencillas y dependen todas de la biblioteca serial.


INICIAR COMUNICACION SERIAL

La primera y la mas importante, para poder usar nuestro puerto serie en el Arduino es Serial.begin(int baudrate); esta función inicia el puerto serie. Consta de un parámetro int baudrate.
El baudrate hace referencia a los bits por segundo que son transmitidos, por lo tanto determinará la velocidad de nuestro puerto serial

Una vez que tenemos nuestro serial abierto  ya podemos enviar y recibir información. Antes de explicar las funciones necesarias vamos a ver como funciona el monitor serial de nuestro Arduino.

Para acceder a el podemos hacerlo a traves de los menus de Arduino Herramientas > Monitor Serie o Pulsando en el botón de monitor serial que se encuentra arriba a la derecha, con forma de lupa.

Monitor Serie
Monitor Serie


Una vez dentro del monitor serial tenemos tres partes básicas, la primera, donde enviamos información al  Arduino.

La segunda que podemos todo lo que envía el Arduino linea a linea.

Y por ultimo abajo a la derecha podemos ver el baudrate que estamos usando, que deberá ser el mismo usado en la función Serial.begin(int baudrate);





Una vez que hemos comprendido esta ventana ya solo nos queda aprender las diferentes funciones para enviar y recibir información.



ENVIAR DATOS DESDE ARDUINO

Para enviar datos la primera opción que encontramos es Serial.print( datos ) o Serial.println( datos ). La única diferencia entre los dos métodos es que el segundo añade un salto de linea. Esto corresponde a añadir "/n" al final de lo que enviamos con el primer método

Serial.print() o println() envía dato en forma de texto reconocible ASCII. Esta función acepta muchos tipos de parámetros. Los int y float son transformados a su correspondiente en ASCII, el float lo deja con dos decimales por defecto.

  • Serial.print(70) envía "70"
  • Serial.print("70") envía "70"
  • Serial.print("M") envía "M"
  • Serial.print("Hola Mundo") envía "Hola Mundo"
  • Serial.print(1.23456) envía "1.23"
  • Serial.print("1.23456") envía "1.23456"  <importancia de las comillas>


Ademas podemos añadir un segundo parámetro que hace referencia al formato del dato. Los posibles formatos que podemos usar son:

  • Serial.print (78, BIN) envía "1001110"
  • Serial.print (78, OCT) envía "116"
  • Serial.print (78, DEC) envía "78"
  • Serial.print (78, HEX) envía "4E"
  • Serial.print (1.23456, 0) envía "1"
  • Serial.print (1.23456, 2) envía "1.23"
  • Serial.print (1.23456, 4) envía "1.2345"

Código ejemplo para enviar datos por puerto serie:
void setup() {
 
  Serial.begin(9600);
 
}
 
void loop() {
 
  Serial.println("Hola Mundo");
 
}


RECIBIR DATOS DEL ORDENADOR

Con Serial.read()
Para que nuestro Arduino reciba datos por el puerto serie vamos a usar la función Serial.read(). Aunque no es la única que podremos usar es la mas sencilla.

Esta función devuelve los bytes que van entrado por el puerto serial. Esta función devuelve -1 cuando no recibe nada. Gracias a ello podemos saber cuando se ha acabado de transmitir información.

El siguiente código guarda en una variable los datos que entran por el puerto serial.
int incomingByte = 0;   // for incoming serial data

void setup() {
  Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() {

  // send data only when you receive data:
  if (Serial.available() > 0) {
    // read the incoming byte:
    incomingData = Serial.read();

    // say what you got:
    Serial.print("I received: ");
    Serial.println(incomingData, DEC);
  }
}



También tenemos la opción de usar Serial.readString() que, básicamente, es igual que la función anterior pero devuelve la información directamente en forma de string.

    incomingData = Serial.readString();

Y podríamos mostrarlo de manera normal, sin darle ningún formato.

    Serial.println(incomingData);




Si te a quedado alguna duda o  necesitas algún tipo de información o te gustaría que hablásemos de algo en concreto en el blog no decirlo en los comentarios. 

No hay comentarios:

Publicar un comentario