lunes, 13 de junio de 2011

Controla a tu Arduino con C#, FIRMA_SQCNC y la clase Arduino de C#

Esta entrada esta hecha para dar a conocer una manera de comunicar de manera sencilla y sin complicaciones a tu arduino con C# por medio de puerto Serie, me he dado a la tarea de crear una clase para C# y un Firmware para Arduino que trabajando juntos hacen maravillas.



La clase Arduino para C# y el FIRmware para Arduino de SQuareCNC o FIRMA_SQCNC
fueron desarrollados por:

Hazael Fernando Mojica Garcia, Monterrey Mexico
Viernes 10 de Junio 2011

es decir, por mi =)

El objetivo es facilitar la comunicacion con arduino por medio de C#, tanto para windows como para linux





Breve Explicacion:

La clase Arduino para C# ha sido desarrollada para poder tener buena comunicacion Serie con un Arduino de cualquier tipo (Probados en Duemilanove, UNO y Mega).

Creando un objeto de la clase Arduino en C#, uno puede dar instrucciones al arduino como si lo estuvieramos programando directamente con su propia IDE, entre las funciones (o Metodos en C#) para controlar el arduino, tenemos:

Para dar instrucciones al arduino
*pinMode(pin,modo)
*digitalWrite(pin,estado)
*analogWrite(pin,bits)
*digitalRead(pin)
*analogRead(pin)

Para control de la comunicacion con C#
*inicializa_comunicacion()
*finaliza_comunicacion()





Esta clase a grandes rasgos crea una comunicacion controlada con el arduino por puerto serie a 115200baud (bits por segundo) y cada metodo ejecutado de esta clase lo que hace es mandar una instruccion por serie al arduino para ejecute su metodo analogo y regrese algun valor en dado caso.

Esta diseñado para evitarse la fatiga de establecer un protocolo entre maquina y arduino y solo dedicarte a usarla.

Esta clase aun tiene ciertas areas que mejorar respecto en cuanto a tiempo de respuesta (tiempo que tarda en  ejecutarse una funcion en el arduino despues de haberla mandado ejecutar desde la maquina), esta en el orden de los microsegundos, pero aun puede mejorarse.

Este tiempo de respuesta disminuye de manera directa si la maquina (computadora) usada tiene buen rendimiento (arriba de un Pentium 4 o AMD Athlon).


Lo primero es cargar al arduino con el Firmware, despues crear una instancia de la clase, inicializar la comunicacion y ejecutar instrucciones, al terminar, finalizar la comunicacion para dejar al arduino a la espera de una nueva inicializacion.

OBTENER LA CLASE ARDUINO PARA C# Y FIRMA_SQCNC
Recomiendo visitar mis entradas dedicadas a esto:
http://hzsquare.blogspot.com/2011/06/clase-arduino-c.html
y
http://hzsquare.blogspot.com/2011/06/firmasqcnc.html


Pero también puedes descargar directo los archivos si te queda mejor:

Descarga Directa Clase Arduino  (.cs): 
https://sourceforge.net/projects/arduinocsharp/files/v1/Clase_Arduino_C%23/Arduino.cs/download
Descarga Directa Clase Arduino para Console Application (.cs):
https://sourceforge.net/projects/arduinocsharp/files/v1/Clase_Arduino_C%23/Aplicaciones_consola/Arduino.cs/download
Descarga Directa FIRMA_SQCNC (.pde):
https://sourceforge.net/projects/arduinocsharp/files/v1/FIRMA_SQCNC/FIRMA_SQCNC.pde/download

REFERENCIA DE LA CLASE ARDUINO PARA C#
Visita la entrada:
http://hzsquare.blogspot.com/2011/06/clase-arduino-c.html


COMO CARGAR EL FIRMWARE Y AGREGAR LA CLASE ARDUINO A TU PROYECTO



Sigue esta entrada para saber como:
http://hzsquare.blogspot.mx/2011/06/como-cargar-el-firmware-y-agregar-la.html

La entrada incluye:
1.- Cargar el Firmware al Arduino
2.- Añadir la libreria Arduino.dll (tanto Windows Forms Application como Console)
3.- Añadir la Clase Arduino (Arduino.cs) copiando y pegando codigo, en Visual Studio
4.- Añadir la Clase Arduino (Arduino.cs) como Item Existente, en Visual Studio
5.- Añadir la Clase Arduino en Mono Develop Linux

6.- Crear un nuevo Proyecto en Visual Studio o Modo Develop (no esta de mas =) )

COMO USAR
1.- En tu programa en C# crea una instancia de la clase Arduino
 Ejemplo:

Arduino arduino=new Arduino("puerto")
 donde:
 arduino: nombre de tu objeto
 puerto: String que representa el nombre del puerto donde se encuentra conectado el arduino, en Windows pueden ser "COM1","COM2","COM3" y asi, en Linux serian "/dev/ttyS0","/dev/ttyUSB0","/dev/ttyUSB1" y asi (NOTA: /dev/ttySx representa un puerto serie de coneccion DB-9 por asi decirlo, y /dev/ttyUSBx representa puertos serie de conexion USB)

2.- Inicializa la comunicacion.
 Ejemplo:  

arduino.inicializa_comunicacion();

3.- Ejecuta las instrucciones que desees ejecutar.
 Ejemplo:


arduino.pinMode(13,"O");
 
arduino.digitalWrite(13,"H");

4.- Finaliza la comunicacion
 Ejemplo:

arduino.finaliza_comunicacion();


En este punto debo aclarar en la clase Arduino para C# no existen las funciones o metodos void setup() ni void loop(). En cualquier parte de tu codigo tu puedes suar pinMode(), digitalWrite() etc. Solo respetando que siempre deber de inicializar al arduino antes de usar cualquier metodo (arduino.inicializa_comunicacion()), y logico colocar al pin en el modo correcto antes de usarlo (pinMode())

SOFTWARE DE PRUEBA SqArduino



Vista del Software SqArduino

Añado el siguiente programa que he creado en C# para controlar un Arduino por medio de la clase Arduino.
Asi de manera rapida estaras controlando a tu arduino desde tu pc en tiempo real.

Para saber mas y descargar sigue esta entrada:
http://hzsquare.blogspot.com/2011/06/software-de-prueba-sqarduino.html

19 comentarios:

  1. esta caido el link de la clase de c#

    ResponderEliminar
    Respuestas
    1. Upps.. ya los repare, fue cuando cambie de URL

      Saludos amigo anónimo

      Eliminar
  2. amigo y donde esta arduino.dll ???

    ResponderEliminar
    Respuestas
    1. =P Deje sin compilar el proyecto, dame un chance y lo subo

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Este comentario ha sido eliminado por el autor.

      Eliminar
  3. ME sale el error:
    ERROR, el dispositivo no responde de la manera correcta, es posible que el puerto seleccionado no sea el correcto o el arduino no tiene cargado el FIRMA_SQCNC.

    Si pruebo leer desde la consola del arduino el sensor dht11 funciona correctamente.

    Si uso un programa que tengo hecho en c# para controlar con ON/OFF 8 reles + 8 leds funciona correctamente tambien al mismo tiempo que lee los datos del sensor.

    ¿a que puede ser debido amigo?

    gracias saludos.

    ResponderEliminar
    Respuestas
    1. Te manda el error cuando??? Recien inicializando el dispositivo???? O en algún momento de su uso??

      Existe un delay en el tiempo de respuesta, tengo que mejorar el algoritmo... pero realmente no te se decir, hay que revisar el codigo minuciosamente

      Eliminar
    2. en el momento de uso cuando pincho un botón que manda la orden digitalwrite (copiado de un ejemplo de aquí)

      creo que es cuando arduino lee FIRMAR_SQCNC% o cuando csharp intenta leer FIRMA_SQCNC

      Eliminar
  4. en la funcion inicializa_comunicacion() de la clase arduino para c# sharp
    cuando haces esto

    cadena = sp.ReadLine();
    cadena = cadena.Substring(0, cadena.Length - 1);

    Como puede ser que si envio FIRMA_SQCNC% por la consola de arduino me devuelve FIRMA_SQCNC en bytes, como puede ser que si lo envío por c# la variable cadena me devuelve esto muy raro

    2402402402407073827765958381677867

    ResponderEliminar
    Respuestas
    1. Le voy a que es un problema de configuracion, pero no se especificar exactamente que tipo de config, posiblemente de BAUDS...

      Eliminar
    2. Lo siento bro,,, hasta ahora se de muchos que la han probado y les ha funcionado excelente con la sola excepcion de que es un poco lenta la transferencia, existe un retraso, pero hasta allí...

      Eliminar
  5. Donde esta arduino.dll...???

    ResponderEliminar
  6. Pues como ve amigo FER, seria tan amable de colgar el dll faltante para poner manos a la obra...?

    ResponderEliminar
    Respuestas
    1. =( Error 404... dll not found.
      Pero tu podrías crear la dll, digo el codigo allí esta ;)
      http://hzsquare.blogspot.fr/2011/06/clase-arduino-c.html

      Sorry por no poder ofrecer más, después optimizaré todo estó para una versión 2.0 compatible con Android.

      Saludos!

      Eliminar
  7. Aun no he probado tu trabajo, pero la idea y las posibilidades son sencillamente geniales, muchas gracias.

    ResponderEliminar
  8. hola... he estado probando el código pero la he estado probando para el launchpad msp430g2553 y lo he probado con ENERGIA que es un software casi igual al del arduino en el caso para escribir el codigo, pero el unico problema con el firmware es que la funcion POW no la ha reconocido y eso me tiene parado si de casualidad sabes algo o como corregirlo te agradeceria

    ResponderEliminar
    Respuestas
    1. Hola antonio lux
      Ok, apenas me entero gracias a tí que existe eso, Texas Instruments, no está mal.
      Pero por desgracia no sé nada por el momento de la IDE que me mencionas.

      Pero mejor dejo soluciones en lugar de problemas, si mal no recuerdo POW te eleva a una potencia un número, bien, eso no es más que una sucesión de multiplicaciones a que sí.

      Porque no creas tu función POW de acuerdo a tus necesidades y así no dependes de la librería?

      Si deseas elevar sólo a numeros enteros es mas fácil aún, podría ser algo así:

      float POW_NEW (float base, int potencia)
      {
      int i = 0;
      float resultado = base;

      for(i = 1; i < potencia; i++)
      {//Repetimos cuantas veces sea la potencia - 1 vez
      resultado *= base;
      }
      return resultado;
      }

      Este codigo me lo aventé aquí mismo así que no se si compila, sólo checalo (el compilador de mi cabeza dice que es 100% funcional).

      Saludos.

      Eliminar