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.

(Dibujo)

Para definir la velocidad de transferencia de datos, hay que ir al menu "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 entrono 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 enviós 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

/* 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 ASCCI.

 A0/PC5: potenciómetro conectado al pin analógico 1 y puerto de PC-5

 Created by Tom Igoe 6 Oct. 2005 
 Updated
 */

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");  //Caracter 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 linea

delay(10); }

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

int switchpin = 0; // switch connected to pin 0

void setup() {

  pinMode(switchpin, INPUT);  // pin 0 as INPUT 
  Serial.begin(9600);         // start serial communication at 9600bps 

}

void loop() {

  if(digitalRead(switchpin) == HIGH)  // if switch is ON 
  { 
    Serial.print(1);                  // send 1 to Processing 
  }else{ 
    Serial.print(0);                  // otherwise send 0 to Processing 
  } 
  delay(100);                         // wait 100ms 

}

  • Envio 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........

(Dibujo)

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 siquieres realizar una nueva descarga del programa, tendrás que desconectarte previamente de este último.

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

Demonstrates how to read data from the serial port. If the data received is an 'H', the light turns ON, if it is an 'L', the light turns OFF. The data comes from a computer running a Processing program, it sends an 'H' if the mouse is over a rectangle otherwise it sends an 'L'.

created 13 May 2004 revised 28 Aug 2005

  // Serial Input 

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

char val; // variable to receive data from the serial port int ledpin = 48; // LED connected to pin 48 (on-board LED)

void setup() {

  pinMode(ledpin, OUTPUT);  // pin 48 (on-board LED) as OUTPUT 
  Serial.begin(9600);       // start serial communication at 9600bps 

}

void loop() {

  if( Serial.available() )       // if data is available to read 
  { 
    val = Serial.read();         // read it and store it in 'val' 
  } 
  if( val == 'H' )               // if 'H' was received 
  { 
    digitalWrite(ledpin, HIGH);  // turn ON the LED 
  } else { 
    digitalWrite(ledpin, LOW);   // otherwise turn it OFF 
  } 
  delay(100);                    // wait 100ms for next reading 

}

/*

 analog Call-and-Response
 by Tom Igoe 

 Waits for serial input.  If the incoming value 
 is a valid byte (i.e. 0 - 255), the program then
 reads three analog inputs, divides them by 4
 to convert the ranges to 0 = 255, and
 sends them out serially.

 Arduino/ATMega8 hardware connections:
 A0/PC5: potentiometer on analog in 1
 A1/PC4: potentiometer on analog in 2
 A2/PC3: potentiometer on analog in 3

 Created 26 Sept. 2005 
 Updated 6 Oct. 2005
 */

byte val; // outgoing ADC value int inByte =-1; // incoming serial byte int channel; // analog channel to read

void setup() {

  // start serial port at 9600 bps:
  beginSerial(9600);

}

void loop() {

  // if we get a valid byte, read analog ins:
  if (serialAvailable()) {
    // get incoming byte:
    inByte = serialRead();
    for (channel = 0; channel <= 2; channel++) {
      // read analog input, divide by 4 to make the range 0-255:
      val = analogRead(channel)/4; 
      // send analog value out:
      printByte(val);
      // wait 10ms for next reading:
      delay(10);                 
    }
  }

}