Pages: [1]   Go Down
Author Topic: Comunicacion de Arduino con Excel  (Read 7731 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

Para los que quieran manejar directamente desde Excel el puerto serie:
http://home.comcast.net/~hardandsoftware/NETCommOCX.htm

Aqui pueden descargar un control ActiveX similar al MSComm32 libre.

Existen multitud de ejemplos por la red basados en MSComm para aprender a utilizarlo con VBA.


Salu2


Igor R.
Logged


0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Una pequeña muestra...




 smiley-wink
Logged


Gallaecia
Offline Offline
Full Member
***
Karma: 0
Posts: 139
A TESLA LE ROBARON
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Interesante Igor, muy interesante.
Podrías poner si no es mucha molestia (venga, de regalo de reyes para la comunidad Arduino xD) el código y el esquema del circuito? es para ponerlo a prueba y aprender de él sobre la marcha.

Muchas gracias y Feliz Año.

Un Saludo.
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

Para el circuito, no necesitas nada, simplemente es una entrada analógica. En mi aplicación tengo un LCD, 3 botones, 2 entradas analógicas y una entrada digital (entrada de interrupción para medir pulsos).

Por la parte de programación Arduino, es parte de una aplicación que estoy haciendo que es un poco grande, pero la parte de envio de datos es muy sencilla, y que todavía tengo que depurar.... Pongo aquí la parte de código que se encarga de realizar esto:

 
 
 int serialByte;
  if (Serial.available()>0)  serialByte=Serial.read();
  
  // Si recibe una C,envia datos de forma continua
  if (serialByte==67){        //Letra C mayuscula
    while (1)
    {
      analog5=analogRead(5);
      // Convierto a milivoltios
      fanalog5=(analog5)*(5000.0/1024);
      Serial.print(millis());
      Serial.print(",");
      Serial.println (fanalog5,DEC);
      if (PIND & B00100000)  break;
    }

  }
  // Si recibe un D,envia un dato
  if (serialByte==68){        //Letra D mayuscula  
    analog5=analogRead(5);
    // Convierto a milivoltios
    fanalog5=(analog5)*(5000.0/1024);
    Serial.print(millis());
    Serial.print(",");
    Serial.println (fanalog5,DEC);
  }




Simplemente, si recibe una "C" por el puerto serie, empieza a mandar el dato de la entrada analógica de forma continua hasta que pulse el boton de mi hardware(leo todo el puerto D y aplico mascara para saber si he pulsado el botón).
Si recibe una "D" manda un dato individual (esto es lo que uso para Excel).
Los datos que envio son de la forma:
tiempo,valor_en_mv con CR+CF


En la parte EXCEL, lo que hago es añadir el objeto NETComm (en el codigo es NETComm2) a mi hoja. Para esto puedes ver culquier ejemplo con MSComm, que es similar.
El único truco, es realizar una especie de Timer en excel. Es decir, que cada cierto tiempo,realice una acción. Para esto uso una llamada a una API de windows que te devuelve el tiempo en ms desde que inicio Windows.
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

tiempo_inicial = timeGetTime()
    Hoja2.Range("L3").FormulaR1C1 = 1
    While (Hoja2.Range("L3").FormulaR1C1 <> "0")
        tiempo_actual = timeGetTime()
        If (tiempo_actual - tiempo_inicial) >= 200 Then
            tiempo_inicial = timeGetTime()
            NETComm2.Output = "D"
        End If
        kk = DoEvents()
    Wend

Como ves, cada 200 ms aproximadamente, envio una D por el puerto serie. Uso la casilla L3 de control, mientras no haya un 0, estoy enviando una D cada 200 ms.

Luego, el objeto NETComm tiene un evento cada vez que recibe un dato por el puerto serie. Lo que hago es configurarlo para que entre cada vez que recibo un byte, y separo tiempo y dato. Lo pongo en dos casillas diferente. Luego no tengo más que añadir gráficos en Excel que esten vinculados a estas casillas.....
Ahora mismo tengo un gráfico de barras y uno de anillos. Queda muy chulo!!!  smiley-wink

Voy a pegar aquí el código de Excel, pero la verdad que esta un poco "guarrete", ya que lo hice rápido para probar.....
CommandButton1 es el botón ABRIR PUERTO
CommandButton2 es el botón OBTENER UN DATO INDIVIDUAL
CommandButton3 es el botón OBTENER AUTOMÁTICAMENTE (cada 200ms)
CommandButton4 es el botón PARAR




Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Public trama
Public datosSERIE
Public tiempo
Public dato


Private Sub CommandButton1_Click()

On Error Resume Next
NETComm2.CommPort = Hoja2.Range("B4").FormulaR1C1
NETComm2.Settings = "115200, N, 8, 1"
' Indica cada cuando quieres que entre en el evento
NETComm2.RThreshold = 1
' Un cero indica que leerá todo el buffer cuando se haga un InputData
NETComm2.InputLen = 1
NETComm2.InBufferSize = 1024
NETComm2.PortOpen = False
datosSERIE = ""

If NETComm2.PortOpen = False Then
    NETComm2.PortOpen = True
End If
If Err Then MsgBox Error$, 48
' Vacio el buffer
While (NETComm2.InBufferCount <> 0)
    trama = NETComm2.InputData
Wend
trama = ""

Hoja2.Application.EnableEvents = True


End Sub

Private Sub CommandButton2_Click()
    NETComm2.Output = "D"
End Sub

Private Sub CommandButton3_Click()
    tiempo_inicial = timeGetTime()
    Hoja2.Range("L3").FormulaR1C1 = 1
    While (Hoja2.Range("L3").FormulaR1C1 <> "0")
        tiempo_actual = timeGetTime()
        If (tiempo_actual - tiempo_inicial) >= 200 Then
            tiempo_inicial = timeGetTime()
            NETComm2.Output = "D"
        End If
        kk = DoEvents()
    Wend
End Sub

Private Sub CommandButton4_Click()
    Hoja2.Range("L3").FormulaR1C1 = "0"
    NETComm2.PortOpen = False
End Sub

Private Sub NETComm2_OnComm()
If NETComm2.CommEvent = NETComm_EV_RECEIVE Then
    datos232 = NETComm2.InputData
  
    If ((Asc(datos232) > 13) And (Asc(datos232) <> 44)) Then
        trama = trama + datos232
    End If
    If (Asc(datos232) = 44) Then
        tiempo = trama
        trama = ""
    End If
    If (Asc(datos232) = 10) Then
        dato = trama
        trama = ""
        Hoja2.Range("F9").FormulaR1C1 = tiempo
        Hoja2.Range("G9").FormulaR1C1 = dato
    End If

End If
End Sub





Siento el código de Excel, que no esta muy limpio que se diga... Y mucho menos depurado....Es algo rápido y funcional mientras jugaba como poder hacer la comunicación.... :o

La verdad, que luego con un poco de "tunning" en el Excel, te queda una cosa muy guapa. En el video no se ve como lo tengo ahora, pero no queda nada mal..... smiley-wink
En la casilla B4, recoge el número del puerto a utilizar (en mi caso tengo el Arduino (FTDI) en el COM8.

Se me olvidaba comentar,que las comunicaciones son a 115200 bps.


No tengo problema en enviarte al mail la excel si la quieres....Mandame un privado con tu dirección, y te la envio. (No puedo subir al foro un archivo, no??).


Salu2



Igor R.
Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Excelente aporte!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Excelente aporte Igor! Te mande un pm para ver si me podrias pasar ese archivo de Excel, ya que quisiera comparar algunas cosas.

Les dejo otra forma de comunicarse con el Excel a través del Arduino usando el Gobetwino.

http://www.mikmo.dk/gobetwino.html

Aca pueden ver una pequeña reseña del mismo:
http://makeenespanol.wordpress.com/2009/03/21/gobetwino-conecta-el-arduino-a-windows/

Saludos!
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Todas las personas que me lo han pedido se lo he enviado, no lo recibiste?

Pongo un link para bajarlo:
http://cid-d2ee689f353f15bc.skydrive.live.com/self.aspx/P%c3%bablico/Comunicaci%c3%b3n%20con%20Arduino%20v2.xls

http://cid-d2ee689f353f15bc.skydrive.live.com/self.aspx/P%c3%bablico/Comunicaci%c3%b3n%20con%20Arduino%20v2.xls


Salu2  smiley-wink



Igor R.
Logged


Madrid
Offline Offline
Newbie
*
Karma: 0
Posts: 35
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Muy bien, pero resulta que en mi máquina no corre Excel. ¿Alguien sabe cómo hacer esto mismo con Calc bajo un SO libre?
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Les dejo lo que estuve haciendo con la excelente base que nos dejo Igor. Se toma el valor de mas de 2 variables, y además se realiza un gráfico con las mismas.

Dejo el link al archivo para el que quiera ver el codigo y jugar un rato smiley-wink
http://rapidshare.com/files/252785064/RS232_y_Arduino_v1.xls

Y un link a yt para verlo andando:


Desde el arduino, se envian los datos de la siguiente forma:
Code:
void loop() {
  if (Serial.available() >0) {
    inByte=Serial.read();
     if (inByte==68) {
     Primer_Pote=(analogRead(0))*(5000.0/1024);
     delay(10);
     Segundo_Pote=(analogRead(1))*(5000.0/1024);
     Serial.print(millis());
     Serial.print(char(44));
     delay(20);
     Serial.print(Primer_Pote,DEC);
     Serial.print(char(45));
     delay(20);
     Serial.println(Segundo_Pote,DEC);
     }
 }
}

Saludos a todos!
Logged

Gallaecia
Offline Offline
Full Member
***
Karma: 0
Posts: 139
A TESLA LE ROBARON
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ME uno a Digigalos, estaría cojonudo hacerlo con Calc.

Saluten.
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Muy bien Nicolás!!

 smiley-wink



Igor R.
Logged


Pages: [1]   Go Up
Jump to: