Comunicacion de Arduino con Excel

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.

Una pequeña muestra...

:wink:

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.

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!!! :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..... :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.

Excelente aporte!

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.

Aca pueden ver una pequeña reseña del mismo:

Saludos!

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úblico/Comunicación%20con%20Arduino%20v2.xls

http://cid-d2ee689f353f15bc.skydrive.live.com/self.aspx/Público/Comunicación%20con%20Arduino%20v2.xls

Salu2 :wink:

Igor R.

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?

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 :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:

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!

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

Saluten.

Muy bien Nicolás!!

:wink:

Igor R.