Publi

Arduino: Usando el serial para comunicarnos con el ordenador

Es interesante ver cómo los programas que corren con Arduino pueden hacer uso del puerto serie para comunicarnos con el ordenador. No sólo vale para hacer la programación del chip, sino que podemos intercambiar información, variar el comportamiento del programa… o simplemente tener un canal para depurar nuestro programa mostrando el estado de las variables en cualquier momento.

La configuración es muy sencilla, sólo necesitamos especificar la velocidad del puerto serie cuando queramos iniciar la comunicación. La velocidad más alta que he podido alcanzar es de 230400bps, lo que vienen a ser unos 28Kb/s; aunque, mejor no subir de 115200bps, o unos 14Kb (porque a 230400 la transmisión empieza a ser inestable y a veces se pierden bits).

Lo más normal es querer iniciar la comunicación al principio y cesarla al final del programa por lo que nuestro Serial empezará en el setup. Vamos a hacer un pequeño ejemplo de comunicación a través del USB del Arduino:
serial.h:

1
2
3
4
5
6
/* En este archivo veremos la configuración de nuestro proyecto */

/* Velocidad del puerto serie */
/* #define SERIAL_SPEED 230400 */
/* Es una buena velocidad para el serial del Arduino Diecimila */
#define SERIAL_SPEED 115200

serial1.pde:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// serial1
// Hace un eco con el puerto serie del Arduino
#include "serial.h"

void setup()
{
Serial.begin(SERIAL_SPEED);
}

void loop ()
{
int recibe;
if(Serial.available())
{
recibe=Serial.read();
// Escribimos byte a byte
Serial.print(recibe, BYTE);
}

}

Si compilamos/programamos y ejecutamos un terminal serie, a mí me gusta cutecom, es simple y tiene entorno gráfico. Si nosotros escribimos por la entrada, el programa símplemente repite lo que decimos:
Cutecom

Por otra parte, el uso del Serial no es bloqueante, es decir, podemos realizar otras tareas mientras esperamos que lleguen datos por el puerto. Esto puede ser muy útil ya que nos permite poder modificar el comportamiento del circuito mientras estemos conectados al serial, o la interacción con otros aparatos que también se conecten al puerto serie mientras tenemos tiempo de CPU para otros cálculos.

Podemos comprobarlo aquí:
serial.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* En este archivo veremos la configuración de nuestro proyecto */

/* Velocidad del puerto serie */
/* #define SERIAL_SPEED 230400 */
/* Es una buena velocidad para el serial del Arduino Diecimila */
/* #define SERIAL_SPEED 115200 */
/* Para ver cómo el led de transmisión parpadea, transmitimos más lento */
#define SERIAL_SPEED 1200
/* Led que queremos que parpadee mientras se ejecuta el programa */
#define STATUS_LED   11
/* Led que indica transferencia de datos */
#define TRANSF_LED   10
/* Retardo introducido para ver el estado del led */
#define BLINK_DELAY  500
/* Bytes que tenemos que recibir antes de que el led de transferencia parpadee */
#define BLINK_RECEPTION 50

serial1.pde:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// serial1
// Hace un eco con el puerto serie del Arduino

#include "serial.h"

// Almacenamos el estado como variable global
int estado=LOW;
int estado_transf=LOW;
// Almacenamos también el número de milisegundos anterior
unsigned long momento_anterior=0;
unsigned long bytes_recibidos=0;
void setup()
{
Serial.begin(SERIAL_SPEED);
// Queremos que un led parpadee mientras trabajamos
pinMode(STATUS_LED, OUTPUT);
// Queremos salida por el led de transferencia
pinMode(TRANSF_LED, OUTPUT);
}
<p style="text-align: center;">void loop ()
{
int recibe;
unsigned long momento_actual=millis();
// No bloqueante, si hay algo para leer entramos, si no, no.
if(Serial.available())
{
recibe=Serial.read();
// Escribimos byte a byte
Serial.print(recibe, BYTE);
++bytes_recibidos;
if (bytes_recibidos%BLINK_RECEPTION==0)
{
estado_transf=!estado_transf;
digitalWrite(TRANSF_LED, estado_transf);
}
}
// No usamos delay para el parpadeo porque nos entorpece la comunicación con el serial
if (momento_actual-momento_anterior&gt;=BLINK_DELAY)
{
// Cambiamos el estado siguiente. Si era HIGH (1) ahora será
// LOW (0). He leído en algún lado que el valor de HIGH no
// siempre es 1; pero en este caso sí es así.
estado=!estado;
// Escribimos el estado actual del led
digitalWrite(STATUS_LED, estado);
// Establecemos el momento anterior como actual.
momento_anterior=momento_actual;
}
}

Comunicación por puerto serie y led

También podría interesarte...

Only 1 comment left Ir a comentario

  1. Pingback: Bitacoras.com /

Leave a Reply