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 banderaenviar
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 banderaenviar
.
//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.
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.
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)?
37 Comentarios
Sergio
marzo 1, 2013 at 1:54 pmHola, 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.
Carlos Ramos
marzo 2, 2013 at 12:32 amSergio, 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.
Lili
diciembre 2, 2016 at 10:04 amhola , teniendo los datos desde C#, puedo exportarlos a Excel ?
Carlos Ramos
diciembre 2, 2016 at 1:46 pmLili, 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.
Luis
mayo 20, 2013 at 7:31 pmHola, 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.
Carlos Ramos
mayo 20, 2013 at 8:24 pmHola, 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:
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.
Luis
mayo 20, 2013 at 9:47 pmHola 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
Carlos Ramos
mayo 21, 2013 at 11:34 pmLuis, 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 amGracias 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 amLuis, 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.
juan
diciembre 7, 2013 at 10:57 pmhola este programa seria como el Monitor Serial de Arduino?
Carlos Ramos
diciembre 8, 2013 at 10:43 pmHola, 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.
juan
enero 6, 2014 at 12:05 amhola 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?
Carlos Ramos
enero 21, 2014 at 1:22 pmAsí 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.Juan :)
enero 8, 2014 at 3:34 pmHola 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?
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.
Alejandro Orozco
febrero 22, 2014 at 4:09 pmhola… 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..
yldemaro
marzo 19, 2014 at 5:03 pmhola 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
Carlos Ramos
marzo 27, 2014 at 10:23 pmBuenas 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.
Carlos Ramos
abril 1, 2014 at 2:15 pmBuenas 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.
Nahandi
agosto 15, 2014 at 11:29 pmTengo 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..!!!
Carlos Ramos
agosto 20, 2014 at 6:43 pmHola, 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.
Ginna Nava
septiembre 24, 2014 at 12:55 pmHola, 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 🙂
Carlos Ramos
septiembre 25, 2014 at 6:40 pmHola, 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.
Oscar
diciembre 2, 2014 at 9:51 pmHola 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
Carlos Ramos
diciembre 8, 2014 at 9:04 pmOscar, 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.
Sarahi González
julio 2, 2015 at 3:59 pmHola(: 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.
Carlos Ramos
agosto 21, 2015 at 10:27 amSarahi,
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.
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.
Carlos Ramos
noviembre 17, 2016 at 7:58 amFidel, 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).
andres
febrero 20, 2017 at 7:38 amhola 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
Carlos Ramos
febrero 21, 2017 at 11:31 pmAndré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.
Alex
marzo 30, 2017 at 10:06 pmGracias 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
Carlos Ramos
marzo 31, 2017 at 7:19 amAlex, me alegra saber que el material te ha sido de utilidad.
Gracias por tu comentario :).
JACOBO SAN JUAN HERNANDEZ
abril 10, 2017 at 1:11 pmDisculpen 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
Abensab
mayo 4, 2017 at 4:56 amHola 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.
Jose
marzo 12, 2019 at 8:48 amHola 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.