Conexión PC-Máquina industrial a través de Arduino

Buenas a todos(as), necesito conectar una máquina industrial a un PC para guardar el histórico de lo que esa máquina ha fabricado durante el día. No se si un sistema como Arduino me podrá valer de interface para conectarlos. La idea es sacar una señal eléctrica de la máquina cada vez que haga una pieza (como si fuera un pulsador, esto no es problema) y enviar al PC esa señal a través de algún puerto (paralelo, serie, usb, ?) para que en una hoja de cálculo cree una línea con la fecha y la hora (hh:mm:ss) de ese instante (he programado alguna macro en Excel, pero nunca relacionadas con la comunicación con los puertos). De este modo al final de la jornada tendré un histórico con las piezas que ha hecho, ritmo de trabajo en diferentes horas del día, periodos de paro, etc.

¿ Una placa Arduino adecuadamente programada serviría para hacer esto ?

Que arduino mande texto por el puerto serie en función de que cambie una tensión es trivial.

¿Has programado algo más que macros Excel?, porque aqui el trabajo es de programación. No creo que desde Excel se puede leer un puerto serie. Yo haria un programa que leyera el puerto serie y escribiera en un fichero de texto plano, para luego, por ejemplo, importar este fichero desde Excel.

Hola Javier, como ves estoy un poco bastante pegado en estos temas.
En tiempos hice alguna cosa en Pascal, mucho tiempo, no??? Pero, en principio no me da miedo si hay que emplear otro lenguaje si me echáis una mano. ¿De qué lenguaje de programación se trataría? ¿Sería dentro de arduino ó fuera?. En cuanto al fichero temporal, no hay problema en que fuera escribiendo en un *.txt para luego importarlo desde Excel.

En cuanto al arduino, imagino que el modelo más básico serviría, ¿cual sería?.

Me gustaría hacer alguna prueba ya esta semana si fuera posible.

Hola

Si quieres, puedes usar Excel.
Visita este link => Tinkering with Electronics...: Uniendo Excel con Arduino

También podrías guardar en un USB, para no necesitar un ordenador todo el rato funcionando.... por ejemplo => Tinkering with Electronics...: Añadiendo logger a tu Arduino....Vinculum
O también con una SD (existe una shield de libelium).

Para emepzar a jugar, es inmediato mandar datos a través del puerto serie al ordenador, y recoger los datos con Hyperterminal ó terminal similar. Ya que hyperterminal ó realterm, puedes grabar todo lo recibido en un archivo. Si lo mandas en formato adecuado (CSV), podrás abrirlo directamente en Excel.

Como vés, hay muchas formas de afrontar lo que quieres hacer.
Espero haberte ayudado.

Saludos :wink:

Igor R.

Hola Igor, muchas gracias por tu información. Tengo unas dudas:

  • Si pongo uno de los sistemas que almacenan directamente los datos en la memoria que lleva incorporada el arduino, ya sea SD ó pendrive, como necesito que vaya registrando fecha y hora ¿iría guardando los registros directamente con esa información?, ¿tiene calendario y reloj incorporados que no sea necesario poner cada vez en hora?.
  • De momento quiero hacer una prueba, pero si consigo hacerle funcionar la idea es ponerlo en más máquinas. Para consultar ó extraer la información de las memorias, ¿se pueden configurar de forma que no necesite estar sacando las SD de cada tarjeta? ¿Podría ser por Wi-fi ó por conexión RJ-45 con dirección IP asociada (si no pudiera ser inalámbrico)?
  • Qué modelo de arduino me recomiendas para empezar a hacer alguna prueba?.

Esto parece que empieza a ponerse interesante...

Gracias por anticipado y un saludo.

Hola,

Puedes conectarlo por Wifi, por CAN, por RS485, ethernet,....

Todo depende de lo que quieras "complicarte". :wink:
Si necesitas un reloj, puedes uno de los timer ó comprar un integrado (llamados RTC- Real Time Clock), que viene preparado para esto y son baratísimos. Busca DS1307 ó similar.

Te recomiendo que te pases por el Playground, tienes multitud de librerias y ejemplos:
http://www.arduino.cc/playground/Main/InterfacingWithHardware

Deberias preguntarte:

  • ¿Cuantos datos estimas guardar?
  • ¿Puedo llevar cable a las maquinas? Si es que si, puedo pensar en utilizar bus CAN ó RS485
  • ¿Cuantas maquinas habrá en la red?
  • Distancia
  • Coste por unidad
  • Proceso exacto que quiero que haga mi microcontrolador
  • Sistema distribuido ó concentrado
  • etc.

Para recomendarte que placa, primero hay que saber lo que necesitas de ella.... Si vas a necesitar SD+ ethernet/Xbee/etc. +... pues un Arduino Mega, te aseguras no quedarte sin pines....

Saludos

Igor R.

Buenas,

Ya he hecho las primeras pruebas básicas con mi placa Arduino Mega, y de momento parece que funciona.
He instalado Arduino y Processing, las librerías de Arduino para Processing, las librerías NetCommOCX y configurado Excel para que las pueda usar, he estado haciendo pruebas con programas sencillos del tipo leer un pulsador por una entrada digital y verla por una salida digital con un led ó por el monitor del puerto serie con Serial.Print.
Pero me he quedado bloqueado en un punto, no consigo que funcionen las órdenes del tipo Serial.Read ó Serial.Write relacionadas con el puerto serie, parece que no las reconoce el compilador, sale el mensaje de error: In function 'void loop()':
error: 'class HardwareSerial' has no member named 'Write'.

Un saludo:

Serial.write... con la w minúscula :slight_smile:

Mano de santo, ya me empezaba a rayar...

Muchas gracias Javier.

Buenas,

He probado la conexión entre Excel y la placa con el ejemplo del link:

Pero no consigo que lea de forma continua ni individualmente, para ver el valor del potenciómetro tengo que cerrar el puerto, volverlo a abrir y pulsar de nuevo el botón en pantalla, entonces si actualiza el valor en las gráficas. He probado con diferentes velocidades de transmisión y a cambiar el tiempo de refresco de 200ms de la rutina y tampoco.
La placa que tengo es una Mega, el S.O. es XP y la versión de Arduino 0018.

Hola,

En principio si has instalado NetCommOCX, has puesto el código de ejemplo en Arduino, y has escrito el número de puerto serie adecuado, te debería funcionar.
Sólo lo he probado en excel 2007.
Otra cosa a mirar, es que los macros deben estar activos, ya que depende de la configuración de excel, por seguridad estan deshabilitados.

Saludos

Igor R.

Buenas,

Por si acaso, he vuelto a reinstalar NetCommOCX, he comprobado que el código en Arduino era el correcto, he comprobado el puerto y la velocidad del mismo y sigue igual.
Lo hago correr en Excel 2003, el 2007 no lo tengo. Al abrir Excel habilito las macros y doy permiso a ActiveX. Entiendo que como al menos consigue leer al cerrar y abrir el puerto, la configuración de la conexión debe ser correcta, además reconoce sin problemas los comandos de NetCommOCX.

En cualquier caso, ya he conseguido hacer que funcione la aplicación que tenía en mente. Cada vez que pulse un botón, en Excel me aparezca una línea con la fecha y hora actual.
El único problema que sigo teniendo es que no lo puedo ejecutar en un archivo diferente al de tu potenciómetro en Excel, la macro debe estar además en la Hoja2, incluso si la pongo en otra hoja del mismo libro tampoco funciona ya que no reconoce los comandos de NetCommOCX, aunque en 'referencias' en VisualBasic si aparece marcada la librería 'MSComm32.ocx replacement'.

Envío el código por si pueden dar alguna pista:

  1. Pulsar botón.
  2. Leer pulsación en placa con (digitalRead).
  3. Enviar una señal (1) al PC (Serial.print).
  4. Desde Excel leer la señal (1) (NETComm2.InputData).
  5. En una tabla de Excel escribir la fecha y hh:mm:ss.

ARDUINO (1-2-3).

int ledPin = 13;
int inPin = 5;
int value = 0;

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

void loop() {
value = digitalRead(inPin);
digitalWrite(ledPin, value);
if (value==HIGH) {
Serial.print (1);
delay(1000);
}
}

EXCEL (4-5)

Private Sub Abrir_puerto()

NETComm2.CommPort = 7
NETComm2.Settings = "9600, N, 8, 1"
NETComm2.RThreshold = 1
NETComm2.InputLen = 1
If NETComm2.PortOpen = True Then
NETComm2.PortOpen = False
End If
NETComm2.InBufferSize = 1024
If NETComm2.PortOpen = False Then
NETComm2.PortOpen = True
End If

While (NETComm2.InBufferCount <> 0)
trama = NETComm2.InputData
Wend
trama = ""

Hoja1.Application.EnableEvents = True

Sheets("Hoja1").Select
ActiveSheet.Range("b2").Activate

End Sub

Private Sub NETComm2_OnComm()

If NETComm2.CommEvent = NETComm_EV_RECEIVE Then
valor = NETComm2.InputData
ActiveCell.Value = Date
ActiveCell.Offset(0, 1).Range("a1").Select
ActiveCell.Value = Time
ActiveCell.Offset(1, -1).Range("a1").Select
End If
End Sub

Perdonad por la extensión del mensaje.

Saludos:

Hola,

Antes me confundi, quería decir Excel 2003.

¿Has añadido el objeto a la hoja? En la barra de insertar controles (Botón, lista desplegable,..) tienes un boton de Más Controles.... (o algo así). Ahi tienes que seleccionar NetCommOCX.

Buenas,

No consigo verlo. En Excel, pantalla de código de Visual Basic, menú superior, Herramientas, me aparece Referencias que es donde le agrego la librería, justo debajo aparece 'Controles adicionales' que está como dasactivado (gris claro). Aparte de esto no consigo ver nada más.
De todos modos he puesto en la ayuda de Excel 'ActiveX' y me han salido varias cosillas, voy a probar alguna, sería la primera vez que me sirve para algo la ayuda de Office ;D

Saludos.

Yo lo que te digo es:

  1. Abres una hoja excel nueva
  2. Bara herramientas de Cuadro de controles. Es dónde tienes los controles de boton, lista desplegable,... y tendrás un botón que es insertar control.... (un icono con un martillo y una llave inglesa).
  3. Buscas Netcomm

(He cambiado a Windows 7 y Excel 2007, y no te puedo decir exactamente los menus)

Ahora te saldrá en un tu hoja, un icono con el control.

Deberías poder usarlo a partir de ahi....

Buenas,

Ahora si funciona.
Por si a alguien le sirve de algo, en Excel 2003 el procedimiento es: menú de Excel (no confundir con la pantalla de código de Visual Basic): Ver > Barra de herramientas > Cuadro de controles > Icono 'Más controles' (martillo y llave cruzadas) > NETCommOCX.NETComm.

Bueno, ya hemos conseguido el 1º paso, con esto ya tengo para entretenerme haciendo pruebas en la captura de datos directamente en máquinas.

Muchas gracias por todo Igor.

Saludos.

Me alegro que lo tengas funcionando!!!
Cuando hagas algo, ya nos lo enseñarás. Asi le sirve a otros... :wink:

Saludos

Igor R.

Buenas de nuevo,

Las pruebas que he realizado con la conexión de la placa (Arduino Mega) a máquinas industriales para capturar los tiempos de máquina han sido satisfactorias, al final dependiendo del origen de la señal capturada en cada máquina he tenido que hacer pequeñas modificaciones en el programa de Arduino.
Ahora, para no tener conectado un PC de forma continua a la placa Arduino Mega quiero hacer pruebas con diferentes combinaciones de almacenamiento/conexión (necesitaré también un timer (RTC)): almacenamiento en SD, en Pendrive (USB), conexión RJ-45, conexión inalámbrica, etc.
En las instalaciones algunas máquinas ya tienen tirado cable de red hasta un servidor, la distancia máxima en línea recta es de unos 100m y hay unas 20 máquinas con posibilidad de monitorización.
La idea es conectar en cada máquina una placa con un RTC, almacenamiento temporal en tarjeta SD, una pantalla LCD que indique el estado y enviar periódicamente vía inalámbrica ó RJ-45 los datos al servidor.
¿Se puede configurar así?, ¿Hay una solución más sencilla?, ¿Se pueden poner a la vez en la misma placa, una RTC, una SD, una LCD y una inalámbrica?
En inalámbrica he visto XBEE, pero hay varios modelos, ¿Cuál me recomendáis?
RTC: DS1307 en Bricogeek.
RJ-45: 'Arduino Ethernet Shield' en el mismo.
SD: en Libelium .
También quiero probar la monitorización de algunos parámetros de las máquinas como la temperatura y la presión hidráulica, ¿lo puedo hacer a través de las mismas placas que voy a conectar usando la entrada analógica con el correspondiente transductor? He visto alguno de temperatura sin contacto como el XML90614 de Melexis, ¿lo conocéis alguno? ¿sabéis de alguno de presión hidráulica?

Perdonad por el rollazo que he soldado :wink: ?

Un saludo:

Si tienes que hacer 20 Hardware, veo mejor solución tirar un bus de campo (RS485 ó CAN Bus). Por ejemplo, puedes añadir bus RS485 por 1 euro a tu placa de Arduino....Aunque tendrás que cablear....

Ya que si sumas: un Xbee, una SD, Ethernet,....por cada una de las 20 máquinas..... la instalación va a subir de precio. Y no se hasta que punto te merece la pena...

Puedes hacer modulitos, que manden los datos a un micro central (o un ordenador), y éste se encargue de guardar todos los datos recibidos en una SD ó USB. También lo veo más sencillo de diseñar. Ya que si tienes una "red", ¿para qué te interesa guardar todos los datos en cada una de las maquinas de forma individual?

Ó ir haciendolo en grupos.... Es decir, que un mismo micro controle varias maquinas....

Para los sensores.... ó das más datos, o es díficil opinar....Ya que puedes medir temperaturas con NTC,PTC,PT100 ó PT1000,Termopar, Infrarrojo,... Depende un poco de la aplicación, y de la instalación.

Saludos

Igor R.