Arduino

Registro de datos con Arduino y C# por medio del puerto serial

Figura 2: Leyendo datos desde Arduino.

En esta entrada se plantea el desarrollo de un pequeño programa en C# para leer datos provenientes de un Arduino UNO, con la posibilidad de pausar y reanudar el envío.

El código para Arduino

El código de Arduino es simple, basado en los ejemplos de lectura de sensor análogo y lectura de puerto serial:

  • La variable enviar permite saber cuando se envirán datos a través del puerto serial.
  • La función recibirDatos (líneas 19 a 30) se encargar de cambiar el valor de la bandera enviar en base a los datos provenientes de la aplicación en C#.
  • En la función loop (8 a 15) nos encargamos de enviar los datos pertinentes en caso de tener activada la bandera enviar.
//Bandera para saber si debemos enviar datos.
bool enviar = false;

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

void loop() {
  recibirDatos();
  if (enviar == true){
    int sensor = analogRead(A0);
    Serial.println(sensor);
  }
  delay(100);
}

//Recibimos los datos del programa de C# con el fin
//de determinar si debemos enviar o no datos.
void recibirDatos(){
  if (Serial.available() > 0){
    int recibido = Serial.read();
    // El número 49 equivale a "1", equivale a comenzar el envío.
    // El número 50 equivale a "2", equivale a pausar envío.
    if (recibido == 49){
      enviar = true;
    }else if (recibido == 50){
      enviar = false;
    }
  }
}

La aplicación en C#

En la figura 1 se muestra la interfaz inicial del programa, la cual permite determinar en cual puerto se encuentra conectada la tarjeta y la velocidad de transmisión (o baud rate). Además, muestra el estado de la conexión en la parte inferior de la pantalla.

Figura 1: ArduiLogger - pantalla inicial.

Figura 1: ArduiLogger – pantalla inicial.

Tras presionar “Archivo – Conectar con Arduino”, se habilitan los botones de control: Play (iniciar registro) y Stop (terminar conexión). El botón Play se convierte en Pausa, y viceversa.

Figura 2: Leyendo datos desde Arduino.

Figura 2: Leyendo datos desde Arduino.

Al finalizar la conexión se habilitan las últimas dos opciones: Limpiar registro, utilizada para eliminar todos los datos capturados; y Guardar registro, utilizada para almacenar los datos en un archivo en disco.

El código fuente

El proyecto completo está disponible para su descarga (gracias al bonito botón que hay debajo) y está protegido por la licencia LGPL3 (por lo cual puedes utilizarlo en cualquier proyecto o modificarlo sin consultarme, aunque las contribuciones siempre son bienvenidas).

[button style=”black” url=”https://github.com/ramoscarlos/arduilogger” color=”black” link=”https://github.com/ramoscarlos/arduilogger”] Obtén ArduiLogger de GitHub [/button]

ArduiLogger fue realizado utilizando Visual Studio 2010, aunque no debe haber problema si se utiliza #develop u otro IDE. En caso de dudas o aportes al proyecto, no dudes en comentar.

Encuesta

Para este proyecto asumí la lectura de un solo sensor, capturando únicamente ese dato. Para diversos proyectos se puede incluir más información, como la hora de la medición, el número de muestra, o el valor de múltiples dispositivos (digitales y análogos). Con el objetivo de hacer crecer el proyecto, quisiera saber un poco del para qué estás usando este programa:

  • ¿Cuáles son los datos que necesitas almacenar?
  • ¿Existen más funciones que consideres pertinentes para la aplicación?
  • ¿Qué tipo de gráficas o información esperas obtener a la salida (histogramas, de pastel) y cómo la obtendrás (MATLAB, gnuplot)?

You Might Also Like

37 Comentarios

  • Responder
    Sergio
    marzo 1, 2013 at 1:54 pm

    Hola, Muchas gracias por este articulo, esta sencillamente genial, yo soy programador senior en C#, pero hasta ahora me estoy metiendo de lleno al mundo de la electrónica con mi arduino Mega(que esta por llegar), en los próximos dias probare el codigo y empezare a trabajar en esto, si me surgen dudas o tengo inquietudes respecto a la comunicación serial o lectura de datos de componentes te lo haré saber, sigue con artículos como estos, te felicito.

    • Responder
      Carlos Ramos
      marzo 2, 2013 at 12:32 am

      Sergio, gracias por el apoyo. Descubrirás que es una maravilla trabajar con Arduino ya que cuenta con muchos recursos en la red. No dudes en preguntar, de esa manera todos nos enriquecemos con un poco más de conocimiento.

      • Responder
        Lili
        diciembre 2, 2016 at 10:04 am

        hola , teniendo los datos desde C#, puedo exportarlos a Excel ?

        • Responder
          Carlos Ramos
          diciembre 2, 2016 at 1:46 pm

          Lili, el archivo guardado lo debes poder abrir con Excel sin problemas, al ser un archivo que contiene un dato por renglón. Por supuesto, habría que confirmarlo. ¿Puedes decirme si puedes abrir el archivo con Excel sin problemas? Solamente utilizando el “Abrir con…”, y ya.

  • Responder
    Luis
    mayo 20, 2013 at 7:31 pm

    Hola, podrias orientarme un poco dentro de tu codigo en c# para poder leer el valor de tres señales y no solo de una, gracias y prometo contribuir con e aporte en tu pagina.

    • Responder
      Carlos Ramos
      mayo 20, 2013 at 8:24 pm

      Hola, Luis. El código de C# se encarga solamente de desplegar y guardar los datos recibidos por la tarjeta de Arduino. Por lo tanto, es el Arduino UNO el que se encarga de leer y enviar las tres señales. Por ejemplo:

      int sensor1 = analogRead(A0);
      int sensor2 = analogRead(A1);
      int sensor3 = analogRead(A2);
      Serial.print(sensor1);
      Serial.print(" ");
      Serial.print(sensor2);
      Serial.print(" ");
      Serial.print(sensor3);
      Serial.println("");
      

      El código de C# ahora mostrará tres datos en una sola línea, mismos que pueden ser tomados y leídos posteriormente en MATLAB, por ejemplo. Espero haber aclarado tu duda.

      • Responder
        Luis
        mayo 20, 2013 at 9:47 pm

        Hola de nuevo, tienes razón, ya he modificado con éxito el programa en arduino y me quedo algo por el estilo


        void loop() {
        recibirDatos();
        if (enviar == true){
        int sensor1 = analogRead(A0);
        int sensor2 = analogRead(A1);
        int sensor3 = analogRead(A2);

        Serial.print(sensor1);
        Serial.print(",");
        Serial.print(sensor2);
        Serial.print(",");
        Serial.println(sensor3);

        }
        delay(100);
        }

        en el monitor del programa en C# Visualizo renglones como esto: xxx,xxx,xxx.
        Hace rato no explique bien para que modificaría tu programa, pues bueno, estoy realizando un pequeño sistema de adquisición de datos leyendo tres entradas analógicas y el objetivo es poder graficar dichas señales. con tu programa he podido visualizar una en forma de caracteres, ahora me doy a la tarea de separar la cadena de texto que visualizo en el monitor de C# y mi duda es, una vez obtenidos estos valores separados, se pueden graficar en el mismo programa de C#.

        Saludos desde México D.F IPN

        • Responder
          Carlos Ramos
          mayo 21, 2013 at 11:34 pm

          Luis, me parece que un trabajo relacionado a lo que deseas hacer se muestra en este video, en el cual hacen uso de Serial Plot de Samuel Dieck, el cual es un script hecho en Python que crea gráficas en tiempo real. Yo utilicé dichos scripts desde Fedora Linux, aunque debe ser posible ejecutar desde Windows. No he utilizado C# para graficar datos en tiempo real (ni de cualquier otra forma) dado que el propósito del programa es recibir datos y guardarlos para su posterior uso en MATLAB, que me parece más fácil de utilizar para estas aplicaciones de análisis de datos. Me gustaría conocer tu solución a este problema.

          • Luis
            mayo 22, 2013 at 1:21 am

            Gracias por el enlace, decidí dejar un poco de lado a C# ya que por cuestiones de tiempos en la entrega del proyecto tuve que migrar a Matlab con interfaz gráfica (logre graficar las tres señales con ayuda de un tutorial para una señal. En cuanto salga de vacaciones haré mi propia web y expondré la soluciones y posibles mejoras al proyecto. Será una web hermana a esta. Gracias por la motivación y la ayuda, estamos en contacto.

          • Carlos Ramos
            mayo 23, 2013 at 11:00 am

            Luis, gracias por tu comentarios. El tiempo es, en la mayoría de los casos, un factor importante que nos hace replantearnos el camino hacia la solución. Esperaré tu sitio con gusto.

  • Responder
    juan
    diciembre 7, 2013 at 10:57 pm

    hola este programa seria como el Monitor Serial de Arduino?

    • Responder
      Carlos Ramos
      diciembre 8, 2013 at 10:43 pm

      Hola, Juan. Así es, este programa es similar al Serial Monitor provisto por Arduino, con el uso de una interfaz con botones en lugar de instrucciones de texto (y claro, se puede construir más sobre esa base). Saludos.

      • Responder
        juan
        enero 6, 2014 at 12:05 am

        hola disculpa me surgio una duda si en la programacion de arduino incluyo una serie de “Serial.println” el programa me los mostrara en su interfaz??? o que mas deberia hacer?

        • Responder
          Carlos Ramos
          enero 21, 2014 at 1:22 pm

          Así es, Juan. Del lado de Arduino se mandan los datos mediante un Serial.println, ya del lado de C# es donde se mostrarían los datos enviados o, en caso de ser necesario, se realizaría un procesamiento adicional (para evitar que el Arduino haga procesamiento adicional y disminuya la frecuencia de envío). Gracias por tu comentario.

  • Responder
    Juan :)
    enero 8, 2014 at 3:34 pm

    Hola Carlos Ramos me Funciono perfecto con mi programa de Arduino solo que tengo una duda, eh conectado un proyector de video a la computadora y tambien arduino y me da conflicto al momento de querer ejecutar el monitor serial de arduino no sabes como solucionar esto?

    • Responder
      Carlos Ramos
      enero 23, 2014 at 8:44 pm

      ¡Eso es nuevo para mí! A decir verdad, Juan, no me había topado con ese problema anteriormente, ¿has llegado a alguna solución para tu problema? Me gustaría mucho saber al respecto :D.

  • Responder
    Alejandro Orozco
    febrero 22, 2014 at 4:09 pm

    hola… quisiera saber si podrian ayudar me con unas dudas que tengo..
    soy nuevo en esto de programacion arduino, soy estudiante de ingenieria en sistemas computacionales.
    he realizado una practica de prender leds desde c#.. pero quisiera saber como regresar informacion del arduino a c# en un
    ejemplo mas simple… por favor y gracias espero su respuesta..

  • Responder
    yldemaro
    marzo 19, 2014 at 5:03 pm

    hola buenas noches me gustaria saber como comunicarme del lenguaje c a un arduino osea pasarle instrucciones que quiero q se ejecute en el arduino me gustaria si pudiera su ayuda slaudos

    • Responder
      Carlos Ramos
      marzo 27, 2014 at 10:23 pm

      Buenas noches, yldemaro. ¿Sería más o menos como la interfaz de C# pero desde una terminal de C? Lo que se acostumbra a utilizar es la comunicación serial entre la computadora y el Arduino, desde cualquier lenguaje de programación (C#, C, Python, cualquier otro). Y el pasar instrucciones se reduce a enviar un carácter que se interpreta como un conjunto de instrucciones en Arduino. Sin embargo, me gustaría saber cuál es el medio de comunicación es el que se plantea para el proyecto que tienes en mente y qué tan complejas son las instrucciones a interpretar. ¡Espero saber más de tu proyecto! Saludos.

  • Responder
    Carlos Ramos
    abril 1, 2014 at 2:15 pm

    Buenas tardes, Christian. Los datos digitales se pueden enviar de manera similar a como se mandan los datos análogos (aunque claro, es un desperdicio de espacio al transmitir todo un carácter para un representar un bit). En el listado 1 de la entrada Control de un Videojuego mediante Arduino y un Acelerómetro MMA7455 se muestra como se envían múltiples datos a través del puerto serial. Del lado del receptor, se reduce a implementar un programa para leer archivos separados por comas (o por cualquier carácter, en este caso por tabuladores). En estos momentos me encuentro un tanto ocupado, pero para el fin de semana planeo tener un ejemplo funcional al respecto. Saludos.

  • Responder
    Nahandi
    agosto 15, 2014 at 11:29 pm

    Tengo un problema. Quiero leer el dato de una bascula a través de un puerto serial y estoy usando arduino para tratar de hacer la señal inalambrica. El dato yo lo solicito a la bascula mandando una “p” sin embargo no logro que me de ese dato ni cableada la bascula usando la tarjeta uno.

    Necesito algo de ayuda u orientación por favor..!!!

    • Responder
      Carlos Ramos
      agosto 20, 2014 at 6:43 pm

      Hola, Nahandi. Primero que nada, ¿has comprobado que el Arduino y el serial funcionen correctamente? Es decir, ¿has corrido algún ejemplo sencillo entre la computadora y el Arduino. Hay que asegurar que lo básico funciona para empezar. Una vez resuelto eso, entonces procedemos a leer sin mandar instrucciones (es decir, simplemente recibir y recibir y recibir datos). Yendo por pasos todo es más fácil. Saludos.

  • Responder
    Ginna Nava
    septiembre 24, 2014 at 12:55 pm

    Hola, muchas gracias por tu aporte,quisiera saber si puedes ayudarme con un problema que tengo últimamente he tenido dificultades para realizar un proyecto y es que realicé una programación en arduino (Mega ADK) para conectarlo con matlab y así graficar los valores de un sensor de temperatura teniendo en la gráfica el voltaje contra tiempo, pero no tengo idea de como generar la tabla de valores :(, igual aunque fuese otro programa el que use quisiera saber si conoces alguna alternativa para obtener una lista de datos que me muestre el tiempo y el voltaje (como transcurre) es que necesito los datos para poder crear una formula y bueno usarla en el proyecto de antemano agradezco tu tiempo y tu entrada del blog. saludos y gracias 🙂

    • Responder
      Carlos Ramos
      septiembre 25, 2014 at 6:40 pm

      Hola, Ginna. Una solución a tu problema sería el uso de interrupciones cada cierto tiempo (timer interrupts). Aquí hay una referencia. Puedes recibir el dato de voltaje cada N segundos (mientras el intervalo sea mayor al tiempo de transmisión necesario para evitar colisiones). De esa forma, sabes cuánto tiempo ha pasado desde que se inició la transmisión de datos. Espero la referencia te sea de utilidad. Saludos.

  • Responder
    Oscar
    diciembre 2, 2014 at 9:51 pm

    Hola Carlos!
    Tu proyecto es muy bueno y quisiera preguntarte algunas cosas.
    La primer pregunta los datos que recibias del arduino los enviaste mediante un bluetooth? Lo que pasa yo tengo que hacer algo parecido pero no tengo idea de como hacerlo, mira voy a recibir datos en el arduino pero los tengo que mandar por bluetooth y tengo que recibirlos en C++ pero no tengo idea de como recibir los datos en C++ quisiera saber si me puedes dar una idea de como hacer esto.
    Gracias

    • Responder
      Carlos Ramos
      diciembre 8, 2014 at 9:04 pm

      Oscar, gracias por tu comentario. Respecto a tu pregunta: los datos los envío a través de puerto serial (el cable USB conectado al Arduino). Realmente no he utilizado el bluetooth, por lo tanto no podría ayudar demasiado en tu problema :(. Saludos.

  • Responder
    Sarahi González
    julio 2, 2015 at 3:59 pm

    Hola(: Buenas tardes. Tengo una duda estuve viendo el código en C#, y quisiera saber en que momento haces el enlace entre el arduino y C#, a lo que me refiero es como relacionas el codigo en C# con el archivo de Arduino.

    • Responder
      Carlos Ramos
      agosto 21, 2015 at 10:27 am

      Sarahi,
      Se podría decir que no existe tal enlace entre C# y el Arduino. Lo que estamos uniendo son dos dispositivos, en este caso la computadora y el Arduino, a través del puerto serial.
      La única conexión es que le vas a decir a C# que “hay algún dispositivo que se comunica por puerto serial, a tal velocidad” y ya.
      Espero haber aclarado tu duda.
      Saludos cordiales.

  • Responder
    Fidel Palma
    noviembre 15, 2016 at 10:11 am

    ¡Hola! Proyecto interesante, yo ando haciendo lo mismo con un dsPIC, aún ando aprendiendo a manejar las tramas que recibo por serial.

    // Aquí van mis respuestas
    ¿Cuáles son los datos que necesitas almacenar?
    Valores de voltaje de una sola fuente, para graficar
    ¿Existen más funciones que consideres pertinentes para la aplicación?
    Pues, la posibilidad de capturar la gráfica (Si la llego a añadir a mi programa te pasaré el código)
    ¿Qué tipo de gráficas o información esperas obtener a la salida (histogramas, de pastel) y cómo la obtendrás (MATLAB, gnuplot)?
    La gráfica de tensión con respecto al tiempo, ya veremos que sale.

    • Responder
      Carlos Ramos
      noviembre 17, 2016 at 7:58 am

      Fidel, al parecer las gráficas siempre son necesarias. Después de todo, nadie puede ver patrones al ver un conjunto de números XD.
      Claro, ¡tu aportación sería bienvenida!
      Comunícame qué sale de tus experimentos (con algo de suerte, nadie morirá en el proceso).

  • Responder
    andres
    febrero 20, 2017 at 7:38 am

    hola que tal , soy nuevo en arduino y e estado probando con algunas cosas, pero lo que requiero hacer es que arduino me genere valores aleatorios y al mismo tiempo me encienda leds tratando de adivinar un numero en especifico diciendome con un parpadeo de cada led si es mayor o menor el valor para adivinar el valor

    • Responder
      Carlos Ramos
      febrero 21, 2017 at 11:31 pm

      Andrés, hace tiempo que no trabajo con Arduino y ya no tengo una plataforma en la cual probar los programas :(. Para el número aleatorio, puedes intentar ésto (en inglés).
      No obstante, para lo de los LEDs no tengo recomendaciones pues no sé cómo debe funcionar lo que necesitas.

  • Responder
    Alex
    marzo 30, 2017 at 10:06 pm

    Gracias por tu aporte amigo, me guié en tu código y pude arreglarlo para que funcione en una red malla con modulos xbee, asi a la vez que envia datos x el puerto serial, tambien se puede leer el mismo puerto al mismo tiempo y ejecutar otros procesos. Saludos

    • Responder
      Carlos Ramos
      marzo 31, 2017 at 7:19 am

      Alex, me alegra saber que el material te ha sido de utilidad.
      Gracias por tu comentario :).

  • Responder
    JACOBO SAN JUAN HERNANDEZ
    abril 10, 2017 at 1:11 pm

    Disculpen amigos alguien me puede ayadar con una prgramacio:
    La programación consiste en que en el visual envíe una letra de alfabeto y el valor que me lo mande desde arduino

  • Responder
    Abensab
    mayo 4, 2017 at 4:56 am

    Hola muy buenas, gracias por tu aportación, estoy realizando un proyecto en el cual necesito que la targeta arduino se conecte con una RaspberryPi3 para comunicarle los datos que obtiene, y quiero hacer pruebas en mi ordenador primero y resulta que no encuentro la manera de ejecutar el programa. ¿Podrías indicarme los pasos que he de seguir para poder ejecutarlo y desde qué herramienta o por consola?

    Un saludo y muchas gracias por tu aporte.

  • Responder
    Jose
    marzo 12, 2019 at 8:48 am

    Hola tu proyecto me ayudo mucho pero tengo dudas , actualmente tengo que leer los valores de de 8 a 16 sensores diferentes y al momento de mandarlos a imprimir me los junta todos en un campo como puedo separarlos y asignar cada valor a una etiqueta donde me aparezca el valor del sensor , si pudieras ayudarme me harías la vida mas fácil.

  • Deja tu comentario