Medidor de luz en Cocoa usando Arduino

Hace tiempo que no publicaba nada del magnífico Arduino. La culpa, como siempre, de que los días sólo tengan 24 horas😉

En el anterior post sobre Arduino, presentamos lo fácil que era conectar processing con Arduino. En este post vamos a ver que no sólo con Processing, realmente leer los datos que nos da el Arduino es fácil desde cualquier sitio.

Para presentarlo vamos a mostrar un pequeño programa hecho en Cocoa que lee los datos recogidos por el Arduino y lo muestra gráficamente.

En primer lugar pondremos el esquema del circuito.

El circuito es bastante sencillo y sin muchos secretos, el único detalle a tener en cuenta es que utilizamos una resistencia pull-up de 1KOhm para medir la tensión después del sensor LDR. Esto lo conectamos a la entrada 0 de la placa del Arduino.

De esta manera el arduino leerá el valor de esa entrada, pero necesitamos alguna manera para comunicarnos con el PC. Aquí es donde entra la sencillez del Arduino, ya que podemos usar el puerto USB para comunicarnos. Los datos los enviaremos con la librería Serial. Desde el PC, al tratarse de una comunicación serie, podemos usar cualquier mecanismo para leer del puerto. Y cuando decimos cualquiera, realmente hay un mundo de posibilidades, por mencionar algunos, tenemos librerias en Python, Java o incluso usando la librería estandar de C.

El código del programa que cargamos en el arduino es el siguiente

int LDR = 0;
int val = 0;
int delayTime = 500;

void setup()
{
  pinMode(LDR, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val = analogRead(LDR);
  Serial.println(val);
  val = 0;
  delay(delayTime);
}

Como vemos es bastante sencillo. En el Setup, configuramos el puerto serie con una velocidad de 9600 baudios y cada lectura la escribimos en el puerto serie usando el Serial.write.

De la misma manera podemos usar el puerto USB para establecer la comunicación inversa, en algun futuro post veremos como realizarla, y como usar el Arduino como medio para mostrar información de forma diferente.

Cuando instalamos el driver de Arduino en nuestro PC, nos crea un dispositivo que variará segun el sistema operativo. En mi caso, OSX, el dispositivo es /dev/tty.usbserial-A900aeKy , por lo que con el programa cargado, podremos leer de ese puerto los datos que esta leyendo la placa del sensor. Para ello podemos usar el programa screen, que viene con la gran mayoría de sistemas basados en UNIX.

Si ejecutamos en una terminal el comando

$ screen /dev/tty.usbserial-A900aeKy

Deberíamos ver algo parecido a esto:

En pantalla podemos ver como van apareciendo los valores que esta leyendo la placa, si variamos la intensidad de la luz, efectivamente vemos como dichos valores cambian.

Una vez que tenemos lista la parte del Arduino, la siguiente parte es crear la aplicación en PC. Como hemos mencionado antes, para capturar los datos que nos llegan, debemos leer del puerto serie. Para ello, y al estar en un sistema Unix, podemos utilizar la Api estándar para leer de un dispositivo.

Como esto lo vamos a usar desde una aplicación en Cocoa, vamos a encapsular estas funciones en un objeto de cocoa, de tal manera que su uso sea mas sencillo. Este objeto al construirse abrirá el puerto serie, y nos ofrecerá un método para obtener el siguiente valor leído.

Hablando del código en C, como podeis suponer no tiene mucho secreto, usando open() abriremos el fichero que representa el dispositivo, y con read() leeremos los datos.

El enlace al código fuente esta al final de la entrada, pero el código principal que realiza esto es algo como lo siguiente:

int fd = open("/dev/tty.usbserial-A900aeKy", O_RDWR | O_NOCTTY | O_NDELAY);
char buffer[100]; memset(buffer, 0, 100);
int nbytes = read(fd, buffer, 100);

La última parte que nos falta del puzzle es la aplicación Cocoa que se encargará de mostrar los datos, la idea es mostrar un numero que indique el valor leido del sensor, y un medidor del tipo NSLevelIndicator para mostrar un indicador gráfico del valor del sensor.

No entraré en detalle en comentar la aplicación en Cocoa ya que es muy sencilla, la aplicación consta de una Custom View que pinta el número leido. Para realizar las lecturas periodicas, se utiliza un NSTimer que llamará periodicamente a un método que le especifiquemos y que se encargará de actualizar la vista con el nuevo dato leido.

Para finalizar el post, os dejo con un video del programa en funcionamiento y el código de la aplicacion Cocoa y del programa de Arduino.

Codigo Fuente

3 respuestas a Medidor de luz en Cocoa usando Arduino

  1. Jose dice:

    Hola genio, acabo de comprarme un arduino duomilenova (creo que se llama asi, jejeje) y he visto tu post y me ha encantado. Me encantaria ver el codigo fuente, pero me da que ya no esta en el rapidshare.

    Me lo podrias volver a subir? muchas gracias.

    Saludos

  2. robjperez dice:

    Hola!

    Lo primero, gracias por leer el post.
    Acabo de editar la entrada subiendo el fichero a otro sitio, prueba de nuevo y no deberías tener ningún problema.

    Disfruta con tu Arduino, tiene un monton de posibilidades, y hacer cosas con él es realmente sencillo!

    Saludos.

    • Jose dice:

      muchisimas gracias por responderme, acabo de recibir mi arduino y estoy deseando meterle mano. haber si aprendo un poco mas del tema que tengo un poco de canguelo. por cierto para la practica del contador binario de cuanto son las resistencias ? Muchas gracias.

      Animo con tu blog que es la caña, te animo desde aqui a que nos muestres mas cositas tanto de Arduino como si es de Cocoa.

      Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: