martes, 19 de mayo de 2015

Toma de datos del puerto serie hacia Excel.

En la jornada que tuvimos de espacio-RES, donde nos encontramos un grupo de Arduineros, comenzamos a compartir ideas y trabajos. En ella me comprometí a a analizar un sensor de bajo coste para incorporar en los futuros proyectos.

Como ya sabemos, uno de los vicios de los ingenieros es realizar grandes esfuerzos iniciales para posteriormente disfrutar arrascándose la barriga usando las herramientas que ha desarrollado en trabajos que pueden llegar a ser pesadísimos. Y los que tenemos algo de alma de Open Source, además lo publicamos.

Pues bien, cuando se trata de recopilar datos para posterior análisis quien mejor que excel. Así que me propuse que excel tomara datos de Arduino simplemente pulsando teclas en la hoja de cálculo. Lo mejor es que lo he conseguido y lo peor es que no tan bien como me gustaría.

ANTECEDENTES.

Ya lo había hecho con anterioridad hace ya bastantes años. Se trata de usar el control MSCOMM32.OCX, que me recordó nostálgicamente mis tiempos de Visual Basic 6. Cuál es mi sorpresa cuando descubro que a pesar de que instalo el control, me aparece un problema de licencia (instalar VB6) que aún no he logrado solucionar. Una variante de este control la uso en el hiperterminal que está en este blog pero que no es usable en VBA.

La segunda opción es usar el control ActiveX que incorpora el magnifico terminal REALTERM. Funciona muy bien para mandar datos pero no he encontrado la forma de recibir datos.

Parallax, ofrece un control freeware para hacer loggers en EXCEL, está muy bien pero yo quería algo más simple,

Hay otros objetos ActiveX que controlan los COMs pero pagando, con lo cual lo descartamos.

EL MÉTODO QUE USÉ.

Lo primero generé un SKETCH para Arduino de manera que mandándole un LF, devolvía por el puerto serie el valor del pin analógico A0 que pretendía analizar.

void setup() {
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
  
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read(); 
    if (inChar == '\n') {
      sendSample();
    }
   } 
  
}

void sendSample()
{
  
  int val = analogRead(0);    // read the input pin
  Serial.println(val);             // debug value
  
}

acto seguido, habilité las macros de EXCEL 2013 y traté el puerto COM como si fuese un archivo de lectura escritura.



Public Sub Send_and_Read()

  '--------------------------------------------------------
  cmnd$ = ""        'A string to send
  '--------------------------------------------------------
  
  cmnd$ = cmnd$ + Chr(10)      'add [CR] to command string
  Put #1, , cmnd$              'write string to interface
  '--------------------------------------------------------
  
  answer = ""                  'clear response string
  char = Input(1, #1)          'get first character
  
  While (char <> Chr(10) And char <> "")     'loop until [CR]
    If (char <= 9) Then
      answer = answer + CStr(char)   'add, if printable char
    Else
      ' Do what ever you like
    End If
    
    char = Input(1, #1)        'get the next character
  Wend
  
  '--------------------------------------------------------
  ActiveCell.Value = answer
End Sub

Public Sub close_port()
Close #1
End Sub
Public Sub open_port()
Open "COM6" For Binary Access Read Write As #1
End Sub


Asocié la macro de abrir el puerto con CTRL+o, la de cerrar con CTRL+c (aunque mala idea, por lo de copiar) y CTRL+g para capturar los datos desde el puerto serie.

El puerto COM de Arduino se mira en el monitor o en el Administrador de dispositivos.

Abrimos el puerto serie una vez y cada vez que le demos a CTRL-g aparecerá el dato capturado en la celda activa...muy cómodo ¿verdad?

UN PROBLEMA: Hay que parametrizar el driver con la velocidad y demás parámetros, para ello , antes de capturar debemos realizar un ensayo con el Serial Monitor del IDE de Arduino o REALTERM, con la idea de que el driver tome los valores de comunicación. Esto hay que hacerlo cuando reiniciamos o cambiamos los parámetros.


De este modo, puedo ir tomando apuntes y datos simultáneamente.

Espero que os sirva.


2 comentarios:

  1. Gracias, no tengo excel 2013, sino 2007, no me corre, luego intento.

    Mira este listado que encontré, tal vez te sirva también.

    http://www.me.umn.edu/courses/me2011/smartprodcourse/technotes/docs/serial-port-vb.pdf

    ResponderEliminar
  2. Buenas tardes, que posibilidad hay de un ejemplo... estoy tratando de que los datos lleguen a excel el peso de la balanza

    ResponderEliminar