Apéndice 5. Comunicación vía puerto serie

De CNB
Ir a la navegación Ir a la búsqueda
Busca en cnbGuatemala con Google


La tarjeta Arduino puede establecer comunicación serie (recibir y enviar valores codificados en ASCII) con un dispositivo externo, a través de una conexión por un cable/puerto USB (tarjeta USB) o cable/puerto serie RS-232(tarjeta serie) (Enlace)

Igual que para la descarga de los programas, sólo será necesario indicar el número de puerto de comunicaciones que estamos utilizando y la velocidad de transferencia en baudios (enlace).También hay que tener en cuenta las limitaciones de la transmisión en la comunicación serie, que sólo se realiza a través de valores con una longitud de 8-bits (1 Byte)(Ver serialWrite(c) o serialRead(c) ), mientras que como ya se hemos indicado, el A/D (Convertidor) de Arduino tiene una resolución de 10-bits.(enlace)

Dentro del interfaz Arduino, disponemos de la opción "Monitorización de Puerto Serie", que posibilita la visualización de datos procedentes de la tarjeta.

Monitorización de puerto serie en Arduino - toma de pantalla en Windows

Para definir la velocidad de transferencia de datos, hay que ir al menú "Herramientas" y seleccionar la etiqueta "Velocidad de monitor Serie". La velocidad seleccionada, debe coincidir con el valor que hemos determinado o definido en nuestro programa y a través del comando beginSerial().Dicha velocidad es independiente de la velocidad definida para la descarga de los programas.

La opción de "Monitorización de puerto serie" dentro del entorno Arduino, sólo admite datos procedentes de la tarjeta. Si queremos enviar datos a la tarjeta, tendremos que utilizar otros programas de monitorización de datos de puerto serie como HyperTerminal (para Windows) -Enlace o ZTerm (para Mac)-XXXX- Linux-Enlace, etc.

También se pueden utilizar otros programas para enviar y recibir valores ASCII o establecer una comunicación con Arduino: Processing (enlace), Pure Data (enlace), Director(enlace), la combinación o paquete serial proxy + Flash (enlace), MaxMSP (enlace), etc.

Nota: Hay que dejar tiempos de espera entre los envíos de datos para ambos sentidos, ya que se puede saturar o colapsar la transmisión.

Envío de datos desde Arduino(Arduino->PC) al PC por puerto de comunicación serie[editar | editar código]

Ejercicio de volcado de medidas o valores obtenidos de un sensor analógico

Código

/* Lectura de una entrada analógica en el PC

El programa lee una entrada analógica, la divide por 4 para convertirla en un rango entre 0 y 255, y envía el valor al PC en diferentes formatos ASCII.

A0/PC5: potenciómetro conectado al pin analógico 1 y puerto de PC-5 Created by Tom Igoe 6 Oct. 2005

Actualizado

*/

int val; // variable para capturar el valor del sensor analógico

void setup() {

// define la velocidad de transferencia a 9600 bps (baudios)

beginSerial(9600);

}

void loop() {

// captura la entrada analógica, la divide por 4 para hacer el rango de 0-255

val = analogRead(0)/4;

// texto de cabecera para separar cada lectura:

printString("Valor Analogico ="); 

//  obtenemos un valor codificado en ASCII (1 Byte) en formato decimal :

printInteger(val);

printString("\t"); //Carácter espacio

//  obtenemos un valor codificado en ASCII (1 Byte) en formato hexadecimal :

printHex(val);

printString("\t");

// obtenemos un valor codificado en ASCII (1 Byte) en formato binario

printBinary(val);

printString("\t");

// obtenemos un valor codificado en ASCII (1 Byte)en formato octal:

printOctal(val);

printString("\n\r"); //caracter salto de linea y retorno de carro

// espera 10ms para la próxima lectura delay(10);

}

Otra solución puede ser la de transformar los valores capturados en un rango entre 0 y 9 y en modo de codificación ASCII o en caracteres ASCII. De forma que dispongamos de un formato más sencillo o legible, sobre la información capturada.

El siguiente código incluye una función llamada treatValue() que realiza dicha transformación.

int val; // variable para capturar el valor del sensor analógico

void setup() {

// define la velocidad de transferencia a 9600 bps (baudios)

beginSerial(9600);

}

int treatValue(int data) {

return (data * 9 / 1024) + 48; //fórmula de transformación

}

void loop() {

val= analogRead(0); //captura del valor de sensor analógico (0-1023)

serialWrite(treatValue(val)); //volcado al puerto serie de 8-bits 

serialWrite(10); //caracter de retorno de carro serialWrite(13); //caracter de salto de línea delay(10); }

// Serial Output // by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>

int switchpin = 0; // interruptor conectado al pin 0

void setup() {

pinMode(switchpin, INPUT); // pin 0 como ENTRADA

Serial.begin(9600); // inicia el puerto serie a 9600bps

}

void loop() {

if(digitalRead(switchpin) == HIGH) //si el interruptor esta en ON

Serial.print(1); // envía 1 a Processing

}else{

Serial.print(0); // en caso contrario envía 0 a Processing

delay(100); // espera 100ms 

}

Envío de datos desde el PC (PC->Arduino) a Arduino por puerto de comunicación serie[editar | editar código]

En primer lugar, necesitamos instalar un programa como Hyperterminal en nuestro PC, en caso de que sea Windows.

Software Terminal para realizar comunicaciones con el puerto serie - captura de pantalla versión Windows
Software de terminal para realizar comunicaciones con el puerto serie

Seleccionar el puerto que estamos utilizando con la tarjeta, la velocidad de transferencia y el formato de salida de los datos. Y finalmente conectar...

Se puede realizar una comprobación con el ejercicio mostrado arriba.

Nota: El programa de monitorización de datos está ocupando el puerto utilizado para la conexión a la tarjeta, por lo que si quieres realizar una nueva descarga del programa, tendrás que desconectarte previamente de este último.

/*by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>

*Demuestra cómo leer un dato del puerto serie. Si el dato recibido es una 'H', la luz se enciende ON, si es una 'L', la luz se apaga OFF. Los datos provienen del PC o de un programa como Processing.

*Creado 13 Mayo 2004 revisado 28 Ago 2005

*/

char val; // variable que recibe el dato del puerto serie

int ledpin = 13; // LED conectado al pin 13

void setup() {

pinMode(ledpin, OUTPUT); // pin 13 (LED)actua como SALIDA

Serial.begin(9600); // inicia la comunicación con el puerto serie a 9600bps

}

void loop() {

if( Serial.available() ) // si hay dato e el puerto lo lee

{

val = Serial.read(); // lee y almacena el dato en 'val'

}

if( val == 'H' ) //si el dato recibido es ́H ́

{

digitalWrite(ledpin, HIGH); //activa el LED

} else {

digitalWrite(ledpin, LOW); // en caso contrario lo desactiva

}

delay(100); // espera 100ms para una nueva lectura

}

Para probar este programa bastará con iniciar el programa que actúe de “terminal de comunicación” Hyperterminal de Windows o el programa mostrado anteriormente y podemos enviar los datos y comprobar cómo actúa.