Usando el puerto serie de arduino


Siguiendo con el relato de mi experiencia, he continuado por la comunicación por puerto serie. Evidentemente para el tema de telemetría es necesario transferir información de un punto a otro, y esto lo haré mediante unas radios que hablan por serie con valores TTL, así que afortunadamente se pueden conectar directamente a los puertos serie adicionals que trae el arduino mega, y al puerto que lleva el ardino leonardo.

Como aclaración, que me ha hecho equivocarme; el puerto «Serial» del arduino mega, es el mismo tanto si hablas con él por el cable usb, como si lo haces conectado a los pines TX0 y RX0. Esto para alguien que conozcla las plataformas arduino puede resultar muy evidente, pero al menos para mi no lo fue.

Una vez dicho esto y pasando al plano de programación, hay que reseñar que el puerto serie utiliza un buffer. En el Arduino Mega este buffer es de 64bytes. Para los que desconozcais lo que es un buffer, se suele describir como una analogía a una sala de espera de un médico. Esta sala tiene una capacidad limitada de 64 pacientes, y el médico los va atendiendo por orden de llegada.Si la sala está completa con los 64 pacientes y llega alguno más, este no cabrá y será rechazado (drop o loss).
Una vez que he presentado este buffer, podemos «presentar» tres funciones de Arduino:
– available() Esta funcion nos devuelve el estado del buffer del puerto serie, y revela si existen datos dentro de este.
– read() Lee un caracter del buffer. Es importante entender que lee un solo caracter.
– write() Es evidente lo que hace esta funcion, pero quiero puntualizar que a diferencia de read(), write() escribe tantos caracteres como queramos.

El Arduino Leonardo dispone de dos puerto serie; «Serial» y «Serial1», correspondiendo al puerto serie usb, y al puerto serie localizado en los pines 0 y 1 mientras que el Arduino Mega cuenta con cuatro («Serial», «Serial1», «Serial2» y «serial3») pero como he dicho anteriormente, el puerto serie usb, y el puerto serie etiquetado como TX0 y RX0 son el mismo («Serial»).

Un bucle de programa normal, teniendo en cuenta esto podría ser así:

void config(){
  Serial.begin(9600);
}
void loop(){
  while(Serial.available()){
    Serial.write(Serial.read());
  }
}

Con esto tendríamos un echo de consola.


Siguiendo con el relato de mi experiencia, he continuado por la comunicación por puerto serie. Evidentemente para el tema de telemetría es necesario transferir información de un punto a otro, y esto lo haré mediante unas radios que hablan por serie con valores TTL, así que afortunadamente se pueden conectar directamente a los puertos serie adicionals que trae el arduino mega, y al puerto que lleva el ardino leonardo.

Como aclaración, que me ha hecho equivocarme; el puerto «Serial» del arduino mega, es el mismo tanto si hablas con él por el cable usb, como si lo haces conectado a los pines TX0 y RX0. Esto para alguien que conozcla las plataformas arduino puede resultar muy evidente, pero al menos para mi no lo fue.

Una vez dicho esto y pasando al plano de programación, hay que reseñar que el puerto serie utiliza un buffer. En el Arduino Mega este buffer es de 64bytes. Para los que desconozcais lo que es un buffer, se suele describir como una analogía a una sala de espera de un médico. Esta sala tiene una capacidad limitada de 64 pacientes, y el médico los va atendiendo por orden de llegada.Si la sala está completa con los 64 pacientes y llega alguno más, este no cabrá y será rechazado (drop o loss).
Una vez que he presentado este buffer, podemos «presentar» tres funciones de Arduino:
– available() Esta funcion nos devuelve el estado del buffer del puerto serie, y revela si existen datos dentro de este.
– read() Lee un caracter del buffer. Es importante entender que lee un solo caracter.
– write() Es evidente lo que hace esta funcion, pero quiero puntualizar que a diferencia de read(), write() escribe tantos caracteres como queramos.

El Arduino Leonardo dispone de dos puerto serie; «Serial» y «Serial1», correspondiendo al puerto serie usb, y al puerto serie localizado en los pines 0 y 1 mientras que el Arduino Mega cuenta con cuatro («Serial», «Serial1», «Serial2» y «serial3») pero como he dicho anteriormente, el puerto serie usb, y el puerto serie etiquetado como TX0 y RX0 son el mismo («Serial»).

Un bucle de programa normal, teniendo en cuenta esto podría ser así:

void config(){
  Serial.begin(4800);
}
void loop(){
  while(Serial.available()){
    Serial.write(Serial.read());
  }
}

Con esto tendríamos un echo de consola.


Continuando con el tema, y puesto que la intención es enviar desde un arduino en el aire a un arduino de tierra, he hecho dos ejemplos de conexión para poder utilizar el puerto serie entre arduinos. Se puede conectar del puerto serie de uno al del otro haciendo que las masas sean comunes y así problamos el funcionamiento, pero yo los hice para probar la comunicación serie entre los enlaces, y la cosa ha salido bastante bien:

Para hacer unas pruebas en tierra he hecho unos códigos sencillisimos con los que comprobar la conectividad:

Código para Arduino Leonardo o SENDER:

 

 

int i = 0;
void setup(){
  Serial1.begin(57600);
}
void loop() {
  Serial1.println(i);
  i++;
  delay(1000);
}

Código para el Arduino Mega, o RECIEVER:

#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int i = 0;
char cadena[24];
byte contador=0;
int valor=0;
 
void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
  Serial1.begin(57600);
  Serial.begin(57600);
}
 
void loop() {
  if(Serial1.available()){
    memset(cadena, 0, sizeof(cadena));
    while (Serial1.available()>0){
      delay(5);
      cadena[contador]=Serial1.read();
      contador++;
    }
    valor=atoi(cadena);
    contador=0;
 
    Serial.print(i);
    Serial.print(" ");
    Serial.println(cadena);
 
    lcd.setCursor(0,1);
    lcd.print(i);
    lcd.print(" ");
    lcd.print(valor);
    i++;
  }
}

Como se puede observar he usado un LCD para mostrar los datos y la unica razón para hacerlo es que ya lo tenía cableado en el mega de un sketch anterior.

Con esto probaremos la comunicación serie entre dos placas arduino, bien por radios ttl , o directamente conectandolos (no olvidar cruzar cables de rx a tx y viceversa, y conectar las masas)



Continuando con el tema, y puesto que la intención es enviar desde un arduino en el aire a un arduino de tierra, he hecho dos ejemplos de conexión para poder utilizar el puerto serie entre arduinos. Se puede conectar del puerto serie de uno al del otro haciendo que las masas sean comunes y así problamos el funcionamiento, pero yo los hice para probar la comunicación serie entre los enlaces, y la cosa ha salido bastante bien:

Para hacer unas pruebas en tierra he hecho unos códigos sencillisimos con los que comprobar la conectividad:

Código para Arduino Leonardo o SENDER:

 

 

int i = 0;
void setup(){
  Serial1.begin(57600);
}
void loop() {
  Serial1.println(i);
  i++;
  delay(1000);
}

Código para el Arduino Mega, o RECIEVER:

#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int i = 0;
char cadena[24];
byte contador=0;
int valor=0;
 
void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
  Serial1.begin(57600);
  Serial.begin(57600);
}
 
void loop() {
  if(Serial1.available()){
    memset(cadena, 0, sizeof(cadena));
    while (Serial1.available()>0){
      delay(5);
      cadena[contador]=Serial1.read();
      contador++;
    }
    valor=atoi(cadena);
    contador=0;
 
    Serial.print(i);
    Serial.print(" ");
    Serial.println(cadena);
 
    lcd.setCursor(0,1);
    lcd.print(i);
    lcd.print(" ");
    lcd.print(valor);
    i++;
  }
}

Como se puede observar he usado un LCD para mostrar los datos y la unica razón para hacerlo es que ya lo tenía cableado en el mega de un sketch anterior.

Con esto probaremos la comunicación serie entre dos placas arduino, bien por radios ttl , o directamente conectandolos (no olvidar cruzar cables de rx a tx y viceversa, y conectar las masas)


2 comentarios de “Usando el puerto serie de arduino”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *