miércoles, 15 de junio de 2011

FIRMA_SQCNC

Sketch de Arduino para estrablecer comunicacion serie junto con la clase Arduino de C#

Puedes obtener el archivo FIRMA_SQCNC.pde del repositorio:
https://sourceforge.net/projects/arduinocsharp/files/v1/FIRMA_SQCNC/

Descarga directa:
https://sourceforge.net/projects/arduinocsharp/files/v1/FIRMA_SQCNC/FIRMA_SQCNC.pde/download



Aqui coloco el codigo para verlo directo:
/********************************************
*Hazael Fernando Mojica Garcia, Mexico      *
*FIRMA_SQCNC                                 *
*Sketch para controlar el arduino via Serial*
*usando la clase Arduino en C#              *
*********************************************
*/


String bloque="";
String cod_metodo="";
String param1="";
String param2="";

void setup()
{
 Serial.begin(115200);
 inicializa_comunicacion();
}

void loop()
{
  obtener_bloque();
    if(bloque=="FIN")
  {
    inicializa_comunicacion();
  }
  else
  {
    ejecuta_bloque();
  }
}




//COMIENZAN LOS METODOS

//ejecuto la accion mandada en el bloque

void ejecuta_bloque()
{
  separa_bloque();

 if(cod_metodo=="dW")
 {
   //param1 es el numero de pin
   //param2 es el modo
   if(param2=="H")
   {
     digitalWrite(obtiene_entero(param1),HIGH);
   }
   else
   {
    if(param2=="L")
    {
      digitalWrite(obtiene_entero(param1),LOW);
    }
   }
 }
 else
 {
   if(cod_metodo=="aW")
   {
     analogWrite(obtiene_entero(param1),obtiene_entero(param2));
   }
   else
   {
     if(cod_metodo=="dR")
     {
       if(digitalRead(obtiene_entero(param1)))
       {
          Serial.print('H');
          Serial.print('%'); 
       }
       else
       {
         Serial.print('L');
         Serial.print('%');         
       }
       
     }
     else
     {
        if(cod_metodo=="aR")
        {
         Serial.write(analogRead(obtiene_entero(param1))); 
         Serial.print('%');         
        }
        else
        {
         if(cod_metodo=="pM")
         {
           if(param2=="I")
           {
             pinMode(obtiene_entero(param1),INPUT);
           }
           else
           {
            if(param2=="O")
            {
             pinMode(obtiene_entero(param1),OUTPUT); 
            }
           }
         }
        } 
     } 
   } 
 }
}

void obtener_bloque()
{
  byte caracter;
  bloque="";
   while(true)
  { 
     if(Serial.available()>0)
     {
         caracter=Serial.read();
         if(caracter!='%')
         {
             guarda_caracter(caracter);
         }
         else
         {
            break; 
         }  
     }
  }
}

void guarda_caracter(byte caracter)
{
  bloque=bloque+String(caracter);
}



void inicializa_comunicacion()
{
  byte caracter;
  
     while (Serial.available() <= 0) 
     {       //esperamos a que mande la primer cadena de contacto
     }
      //leemos ("FIRMA_SQCNC%") y mandamos el bloque de contacto ("FIRMA_SQCNC")
      obtener_bloque();
      Serial.println(bloque);
      
     while (Serial.available() <= 0) 
     {
       //esperamos a que mande el bloque de confirmacion ("ok%")
     }
      obtener_bloque();
}





//separo el bloque en los campos correspondientes, que son:
//cod_metodo,param1,param2%
//la tabla de metodos indica los metodos validos
void separa_bloque()
{
  int bloque_len=bloque.length();
  int i=0;
  int numcomas=0;//la posicion de la coma marca el fin de un campo
  String campo="";
  
  for(i=0;i<bloque_len;i++)
  {
    if(bloque[i]!=',')
    {
        campo+=bloque[i];
    }
    else
    {
         switch(numcomas)
         {
            case 0:
                   cod_metodo=campo;
                   break;
            case 1:
                   param1=campo;
                   break;
            case 2:
                   param2=campo;
                  break; 
         }
        numcomas++;
        campo="";
    }
  }
}


//Metodo que regresa un numero en int de una string que representa un numero entero pasada como parametro
//cadenanum es una String que representa a un numero entero
//EJEMPLO: si cadenanum="64", obtiene_entero(cadenanum)=64
int obtiene_entero(String cadenanum)
{
  boolean positivo=true;
  String elnumero="";
  int elnumerolen;
  int i=0;
  int ascii=0;
  int numerito=0;
  int NUMERO=0;
  int peso=0;                                          //contiene el peso de derecha a izquierda (empieza en cero)
  
  //verificamos que sea positivo o negativo el numero que representa la cadena
  if(cadenanum.charAt(0)=='-')
  {
   positivo=false;
   elnumero=cadenanum.substring(1);                    //el String a convertir sera ahora todo menos el caracter '-'  
  }
  else
  {
    elnumero=cadenanum;
  }
  
  elnumerolen=elnumero.length();                  //obtenemos la longitud de la nueva cadena
  
  for(i=1;i<=elnumerolen;i++)
  {
     peso=elnumerolen-i;
     ascii=int(elnumero.charAt(i-1));                          //obtengo el ascii del caracter
     numerito=obtiene_numero_de_ascii(ascii);              //obtengo el numero int del ascii
     NUMERO=NUMERO+numerito*(pow(10,peso));                //por notacion desarollada obtenemos el NUMERO
   }
  
  if(positivo==false)
  {
   NUMERO=NUMERO*(-1); 
  }
  
  return NUMERO;
}

//regresa el numero en int de un caracter asccii pasado de parametro
// si el ascii pasado de parametro no es un numero, entonces regresa 0
int obtiene_numero_de_ascii(int ascii)
{
  int numero;
      if((ascii>47)&&(ascii<58))
    {
      numero=ascii-48;
      
    }
    else
    {
      numero=0;
    }
  return numero;
}


/* TABLA DE INSTRUCCIONES
******************************************************************************************
*Metodo                    *cod_metodo  *Sintaxis         *param1   *param2  *
__________________________________________________________________________________________
*digitalWrite(pin,estado)  *dW          *dw,pin,estado,%  *pin      *estado  *
*analogWrite(pin,bits)     *aW          *aw,pin,bits,%    *pin      *bits    *
*analogRead(pin)           *aR          *aR,pin,0,%       *pin      *0       *
*digitalRead(pin)          *dR          *dR,pin,0,%       *pin      *0       *
*pinMode(pin,modo)         *pM          *pM,pin,modo,%    *pin      *modo    *
******************************************************************************************
pin:     tipo int, numero de pin, pin>0
bits:    tipo int, 0<bits<255
estado:  tipo String, estado="H" o estado="L"
modo:    tipo String, modo= "I" o "O"
valorB:  tipo int, 0<valorB<1023
valorL:  tipo char: valorL='H' o valorL='L'

donde:
"H" representa HIGH
"L" representa LOW
"I" representa INPUT
"O" representa OUTPUT

ESPECIALES
ok%-> sirve como token o valor de respuesta para iniciar la comunicacion serial
FIN%-> Termina la rutina de la comunicacion serial y se lanza a un periodo espera a nueva inicializacion

*/

2 comentarios:

  1. Hola, estoy checando tu programación y me gusta la idea de conectar el arduino con el CSharp, quise probar tu ejemplo pero no pude. ¿Me podrías dar una idea de como se conecta para que funcione?
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Alejandra, este proyecto es algo antiguo, necesito actualizar tanto la clase para C# como el Firmware del Arduino para que aumentar el Performance.

      Te recomiendo algo un poco mas robusto, tendras que adapatar alguno de estos proyectos para tus fines:
      * http://hzsquare.blogspot.mx/2012/10/graficar-entrada-analogica.html
      * https://code.google.com/p/proyect-general-es/wiki/ECG_Basic

      Ahora que si lo que deseas es la flexibilidad de FIRMA_SQCNC los pasos son sencillos, checa esta entrada:
      http://hzsquare.blogspot.mx/2011/06/software-de-prueba-sqarduino.html

      Saludos!

      Eliminar