Apéndice 5. Comunicación vía puerto serie
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.
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
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
En primer lugar, necesitamos instalar un programa como Hyperterminal en nuestro PC, en caso de que sea Windows.
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