Para descargarla en un archivo .cs ve a:
y descargas el Arduino.cs que ocupes, ya sea para ser usado con Forms o con Console Application.
O Tambien Coloco aqui el codigo para que lo veas Directo, este tendras que guardarlo en un archivo llamado Arduino.cs.
/* * ************************************************ * Clase Arduino en C# para control de un arduino * * que tenga cargado el Firmware FIRMA_SQCNC. * * * * La Clase Arduino.cs y FIRMA_SQCNC.pde han sido * * creados por Hazael Fernando Mojica Garcia * * como parte del Proyecto SQUARE CNC * * * * Monterrey, Mexico 2011 * * ************************************************ */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Ports; using System.Windows.Forms; namespace SqArduino { public class Arduino { private String nompuerto = ""; //Propiedad que contiene el nombre del puerto serie public SerialPort sp; //Creamos un objeto de la clase SerialPort private bool inicializado = false;//variable que indica si ya se inicializo la comunicacion o no public Pin pin; //Constructor de la clase Arduino //construye la comunicacion serial con un 115200 bauds el estandar para SquareCNC //y pasando de parametro un String con el nombre del puerto public Arduino(String nombrePuerto) { nompuerto = nombrePuerto; NombrePuerto = nombrePuerto; pin = new Pin();//creamos un objeto Pin sp = new SerialPort(nombrePuerto, 115200); } //Metodo publico, manda la instruccion digitalWrite al arduino //la instruccion solo se mandara cuando el arduino se encuetre inicializado //estado puede ser HIGH o LOW public void digitalWrite(int pin, String estado) { if (inicializado) { sp.Write("dW" + "," + pin.ToString() + "," + estado + ",%"); } } //Metodo publico que manda la instruccion analogWrite al arduino //la instruccion solo se mandara cuando el arduino se encuentre inicializado //bits que puede ser de 0 a 255 public void analogWrite(int pin, int bits) { if (inicializado) { sp.Write("aW" + "," + pin.ToString() + "," + bits.ToString() + ",%"); } } //Metodo publico que manda la instruccion digitalRead al arduino //Regresa HIGH o LOW o "" si la comunicacion no esta inicializada public String digitalRead(int pin) { String cadena=""; if (inicializado) { sp.Write("dR" +"," + pin.ToString() + "," +"0" + ",%"); cadena = recibe_cadena(); } return cadena; } //Metodo publico que envia al arduino la instruccion analogRead //regresa un entero que contiene los bits leidos por el convertidor 0->1023 //se pasa de parametro un entero con el pin analogo correspondiente a leer //0 a 7 en la mayoria de los arduinos, 0 a 15 en el Mega public int analogRead(int pin) { String cadena; if (inicializado) { sp.Write("aR" + "," + pin.ToString() + "," + "0" + ",%"); cadena = recibe_cadena(); } else { cadena = "0"; } return Convert.ToInt32(Convert.ToChar(cadena)); } //metodo publico que manda al arduino la instruccion pinMode //pasando de parametro el pin y el modo //solo mandara la instruccion si el arduino se encuentra inicializado public void pinMode(int pin,String modo) { if (inicializado) { sp.Write("pM" + "," + pin.ToString() + "," + modo + ",%"); } } //Metodo publico que coloca al arduino en a la espera de una nueva //inicilizacion, puede usarlo para cambiar de puerto serie public void finaliza_comunicacion() { sp.Write("FIN%"); sp.Close(); inicializado = false; } //metodo privado, lee una cadena enviada por el arduino //cada pakete de bytes recibidos terminara con '%' private String recibe_cadena() { String cadena = ""; char caracter; long i = 0; bool verif = true; while (sp.BytesToRead <= 0) { //esperamos un tiempo a que manden la cadena if (i > 999) { verif = false; break; } i++; } i = 0; while (true && verif == true) { caracter = Convert.ToChar(sp.ReadByte()); if (caracter != '%') { cadena += caracter; } else { break; } i++; } return cadena; } //metodo publico, este inicializa la comunicacion con el arduino public bool inicializa_comunicacion() { long i = 0; bool arduino_verif = true; String cadena = ""; //Intentamos abrir el puerto if (!sp.IsOpen) { sp.Open(); } else { MessageBox.Show(null, "El puerto " + nompuerto + " se encuentra en uso por otra aplicacion", "ERROR, el puerto seleccionado esta en uso", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; //terminamos la ejecucion del metodo } //enviamos la primera cadena de contacto sp.WriteLine("FIRMA_SQCNC%"); while (sp.BytesToRead <= 0) { //esperamos a que mande la cadena de verificacion de conexion if (i > 999) { arduino_verif = false;//termino el tiempo de espera break; } i++; } if (arduino_verif)//si existe algo en el buffer de lectura { cadena = sp.ReadLine();//si hay algo en el buffer de lectura, lo leemos cadena = cadena.Substring(0, cadena.Length - 1);//quitamos el salto de linea al final if (cadena == "FIRMA_SQCNC") { sp.Write("ok%");//si es la cadena de verificacion correcta entonces confirmamos la comunicacions serie mandando el bloque de confirmacion "ok%" inicializado = true; } else { arduino_verif = false; } } if (!arduino_verif) { MessageBox.Show(null, "ERROR, el dispositivo no responde de la manera correcta, es posible que el puerto selccionado no sea el correcto o el arduino no tiene cargado el FIRMA_SQCNC", "ERROR de Comunicacion", MessageBoxButtons.OK, MessageBoxIcon.Error); } return arduino_verif; } //Propiedad modificable //contiene el nombre del puerto en el cual esta colocado el Arduino public String NombrePuerto { get { return nompuerto; } set { nompuerto = value; } } //propiedad de solo lectura, regresa un bool que indica si el arduino se encuentra en estado inicializado public bool Inicializado { get { return inicializado; } } }//Termina la clase Arduino //creamos una subclase llamada Pin para llevar el control de los estados de los pines del arduino public class Pin { String modoOUTPUT = "O"; String modoINPUT = "I"; String estadoHIGH = "H"; String estadoLOW = "L"; public Pin() { //Constructor vacio, no necesitamso inicializar nada para esta clase } //Colocamos todas las propiedades publicas de solo lectura public String ModoOUTPUT { get { return modoOUTPUT; } } public String ModoINPUT { get { return modoINPUT; } } public String EstadoHIGH { get { return estadoHIGH; } } public String EstadoLOW { get { return estadoLOW; } } }//Terminamos la clase Pin }//Cerramos el namespace de tu proyecto
Clase Arduino para Console Application (Visual Studio y Mono):
/* * ************************************************ * Clase Arduino en C# para control de un arduino * * que tenga cargado el Firmware FIRMA_SQCNC. * * * * La Clase Arduino.cs y FIRMA_SQCNC.pde han sido * * creados por Hazael Fernando Mojica Garcia * * como parte del Proyecto SQUARE CNC * * * * Adaptacion para Aplicaciones Console * * Monterrey, Mexico 2011 * * ************************************************* */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Ports; //using System.Windows.Forms; namespace nombre_de_tu_proyecto { public class Arduino { private String nompuerto = ""; //Propiedad que contiene el nombre del puerto serie public SerialPort sp; //Creamos un objeto de la clase SerialPort private bool inicializado = false;//variable que indica si ya se inicializo la comunicacion o no public Pin pin; //Constructor de la clase Arduino //construye la comunicacion serial con un 115200 bauds el estandar para SquareCNC //y pasando de parametro un String con el nombre del puerto public Arduino(String nombrePuerto) { nompuerto = nombrePuerto; NombrePuerto = nombrePuerto; pin = new Pin();//creamos un objeto Pin sp = new SerialPort(nombrePuerto, 115200); } //Metodo publico, manda la instruccion digitalWrite al arduino //la instruccion solo se mandara cuando el arduino se encuetre inicializado //estado puede ser HIGH o LOW public void digitalWrite(int pin, String estado) { if (inicializado) { sp.Write("dW" + "," + pin.ToString() + "," + estado + ",%"); } } //Metodo publico que manda la instruccion analogWrite al arduino //la instruccion solo se mandara cuando el arduino se encuentre inicializado //bits que puede ser de 0 a 255 public void analogWrite(int pin, int bits) { if (inicializado) { sp.Write("aW" + "," + pin.ToString() + "," + bits.ToString() + ",%"); } } //Metodo publico que manda la instruccion digitalRead al arduino //Regresa HIGH o LOW o "" si la comunicacion no esta inicializada public String digitalRead(int pin) { String cadena=""; if (inicializado) { sp.Write("dR" +"," + pin.ToString() + "," +"0" + ",%"); cadena = recibe_cadena(); } return cadena; } //Metodo publico que envia al arduino la instruccion analogRead //regresa un entero que contiene los bits leidos por el convertidor 0->1023 //se pasa de parametro un entero con el pin analogo correspondiente a leer //0 a 7 en la mayoria de los arduinos, 0 a 15 en el Mega public int analogRead(int pin) { String cadena; if (inicializado) { sp.Write("aR" + "," + pin.ToString() + "," + "0" + ",%"); cadena = recibe_cadena(); } else { cadena = "0"; } return Convert.ToInt32(Convert.ToChar(cadena)); } //metodo publico que manda al arduino la instruccion pinMode //pasando de parametro el pin y el modo //solo mandara la instruccion si el arduino se encuentra inicializado public void pinMode(int pin,String modo) { if (inicializado) { sp.Write("pM" + "," + pin.ToString() + "," + modo + ",%"); } } //Metodo publico que coloca al arduino en a la espera de una nueva //inicilizacion, puede usarlo para cambiar de puerto serie public void finaliza_comunicacion() { sp.Write("FIN%"); sp.Close(); inicializado = false; } //metodo privado, lee una cadena enviada por el arduino //cada pakete de bytes recibidos terminara con '%' private String recibe_cadena() { String cadena = ""; char caracter; long i = 0; bool verif = true; while (sp.BytesToRead <= 0) { //esperamos un tiempo a que manden la cadena if (i > 999) { verif = false; break; } i++; } i = 0; while (true && verif == true) { caracter = Convert.ToChar(sp.ReadByte()); if (caracter != '%') { cadena += caracter; } else { break; } i++; } return cadena; } //metodo publico, este inicializa la comunicacion con el arduino public bool inicializa_comunicacion() { long i = 0; bool arduino_verif = true; String cadena = ""; //intentamos abrir el puerto if (!sp.IsOpen) { sp.Open(); } else { //MessageBox.Show(null, "El puerto " + nompuerto + " se encuentra en uso por otra aplicacion", "ERROR, el puerto seleccionado esta en uso", MessageBoxButtons.OK, MessageBoxIcon.Error); Console.WriteLine("ERROR: El puerto " + nompuerto + " se encuentra en uso por otra aplicacion"); return false; } //enviamos la primera cadena de contacto sp.WriteLine("FIRMA_SQCNC%"); while (sp.BytesToRead <= 0) { //esperamos a que mande la cadena de verificacion de conexion if (i > 999) { arduino_verif = false;//termino el tiempo de espera break; } i++; } if (arduino_verif)//si existe algo en el buffer de lectura { cadena = sp.ReadLine();//si hay algo en el buffer de lectura, lo leemos cadena = cadena.Substring(0, cadena.Length - 1);//quitamos el salto de linea al final if (cadena == "FIRMA_SQCNC") { sp.Write("ok%");//si es la cadena de verificacion correcta entonces confirmamos la comunicacions serie mandando el bloque de confirmacion "ok%" inicializado = true; } else { arduino_verif = false; } } if (!arduino_verif) { //MessageBox.Show(null, "ERROR, el dispositivo no responde de la manera correcta, es posible que el puerto selccionado no sea el correcto o el arduino no tiene cargado el FIRMA_SQCNC", "ERROR de Comunicacion", MessageBoxButtons.OK, MessageBoxIcon.Error); Console.WriteLine("ERROR de Comunicacion, el dispositivo no responde de la manera correcta, es posible que el puerto selccionado no sea el correcto o el arduino no tiene cargado el FIRMA_SQCNC"); } return arduino_verif; } //Propiedad modificable //contiene el nombre del puerto en el cual esta colocado el Arduino public String NombrePuerto { get { return nompuerto; } set { nompuerto = value; } } //propiedad de solo lectura, regresa un bool que indica si el arduino se encuentra en estado inicializado public bool Inicializado { get { return inicializado; } } }//Termina la clase Arduino //creamos una subclase llamada Pin para llevar el control de los estados de los pines del arduino public class Pin { String modoOUTPUT = "O"; String modoINPUT = "I"; String estadoHIGH = "H"; String estadoLOW = "L"; public Pin() { //Constructor vacio, no necesitamso inicializar nada para esta clase } //Colocamos todas las propiedades publicas de solo lectura public String ModoOUTPUT { get { return modoOUTPUT; } } public String ModoINPUT { get { return modoINPUT; } } public String EstadoHIGH { get { return estadoHIGH; } } public String EstadoLOW { get { return estadoLOW; } } }//Terminamos la clase Pin }//Cerramos el namespace de tu proyecto
Referencia de la Clase
MÉTODOS
- pinMode(pin,modo)
Parametros:
pin: tipo int, indica el pin a cambiar el modo
modo: tipo String, es un solo caracter tipo String, puede ser OUTPUT "O" o INPUT "I", si no quisieras correr errores he creado una subclase llamada Pin con propiedades que facilitaran esto, a la puedes tener acceso a esta desde la clase Arduino.
Ejemplo:
pinMode(13,"O");//coloca al pin 13 como salida
es lo mismo que
pinMode(13,Arduino.Pin.modoOutput);
Establece el modo de operacion del pin, igual que la instruccion pinMode de arduino
No regresa valor alguno (void)
- digitalWrite(pin,estado)
Parametros:
pin: tipo int, indica el pin al cual se le aplicara un cambio de estado logico
estado: tipo String,es un solo caracter de tipo String, puede ser HIGH "H", o LOW "L", puedes usar la subclase Pin
Realiza un cambio de estado logico en el pin deseado
No regresa valor alguno (void)
Funciona igual que la instruccion digitalWrite de arduino
Ejemplo:
digitalWrite(13,"H");//cambia al pin 13 a un estado Alto, coloca un 1 en el pin 13
es lo mismos que usar
digitalWrite(13,Arduino.Pin.estadoHIGH);
o
digitalWrite(13,"L");
es lo mismo que usar:
digitalWrite(13,Arduino.Pin.estadoLOW);
- analogWrite(pin,bits)
Parametros:
pin: tipo int, indica a que pin (pwm, si no es pwm no realiza la accion) se le aplicara una salida analogica (conversion D/A)
bits: tipo int, numero que puede ser de 0 a 255 (8bits o 1 byte), indicando el valor de la salida analogica
Hace una conversion D/A de los bits pasados de parametro y la coloca en el pin deseado, esta se efectua unicamente si el pin colocado es pwm
No regresa valor alguno(void)
Funciona igual que analogWrite de arduino
- digitalRead(pin)
Parametros:
pin: tipo int, indica el pin el cual se leera su estado logico, este pin debe ser un pin digital
Regresa: un valor tipo String de un solo caracter que puede ser "H" o "L" que representan un estado Alto o Bajo del pin seleccionado correspondientemente
Lee el estado logico de un pin y regresa una String que representa el estado logico del mismo
- analogRead(pin)
Parametros:
pin: tipo int, indica el pin analogico que se desea, en el Arduino Uno este va de 0 a 5, en el Mega va de 0 a 15, esto debido a la capacidad de entradas analogicas de la placa
Regresa:
Un valor tipo int que representa el valor del voltaje analogico, debido a que posee convertidores de 10bits regresara un valor entre 0 y 1023
Funciona igual que analogRead() de arduino
- inicializa_comunicacion()
Parametros:
no
Regresa:
Un valor booleano que representa si la inicializacion resulto exitosa (true) o no (false)
- finaliza_comunicacion()
Parametros:
no
Regresa:
no regresa valor alguno (void)
Coloca al arduino en modo de espera a una nueva inicializacion
Inicializa la comunicacion serial con el arduino.
Entre los motivos que se pueden encontrar de que la inicializacion falle son:
El nombre del puerto serie donde se conecto el arduino no se indico correctamente al construir la instancia de la clase.
El arduino no posee el Firmware FIRMA_SQCNC cargado.
El arduino no puede enviar/recibir comunicacion serie (a veces debido a que hay algo conectado a los pines 0 y 1, RX y TX)
PROPIEDADES
String NombrePuerto: Permite leer o modificar el nombre del Puerto del arduino
Acceso: Arduino.NombrePuerto
bool Inicializado: Solo lectura, obtienes true si ya se inicializo al arduino (con el metodo inicializa_arduino()) y false en caso contrario
Acceso: Arduino.Inicializado
SubClases:
Pin:
Metodos: No
Propiedades:
String ModoOUTPUT: Solo lectura, obtiene "O". Puede ser usada para el cambio de modo de un Pin, con el metodo pinMode()
Acceso: Arduino.Pin.ModoOUTPUT
String ModoINPUT: Solo lectura, obtiene "I". Puede ser usada para el cambio de modo de un Pin, con el metodo pinMode()
Acceso: Arduino.Pin.ModoINPUT
String EstadoHIGH: Solo lectura, obtiene "H". Puede ser usada para el cambio de estado de un Pin o verificar el valor regresado del mismo, con los metodos, digitalWrite() o digitalRead()
Acceso: Arduino.Pin.EstadoHIGH
String EstadoLOW: Solo lectura, obtiene "L". Puede ser usada para el cambio de estado de un Pin o verificar el valor regresado del mismo, con los metodos, digitalWrite() o digitalRead()
Acceso: Arduino.Pin.EstadoLOW
No hay comentarios:
Publicar un comentario