Añadiendo logger a tu Arduino....Vinculum

.
He estado experimentando un poco con el chip Vinculum de FTDI. En concreto con el módulo de prototipos VDIP1. http://www.vinculum.com/prd_vdip1.html

Te permite manejar un dispositivo USB y maneja archivos FAT de forma transparente, por lo que es ideal para aplicaciones donde se desea guardar datos sin muchas complicaciones. El precio es de 22 euros desde la web del fabricante.
He realizado un pequeño ejemplo basandome en la información que hay en el Playground de Arduino y a un ejemplo de la web del fabricante con un PIC.
http://www.arduino.cc/playground/Main/UsbMemory
http://www.vinculum.com/downloads.html#vutilities

He usado el Mega con el Serial 3, y sin "flow control". Lo suyo sería utilizar las lineas CTS y RTS para saber si el dispositivo esta preparado para recibir información.
La conexión del VDIP1:
Pin 1.- 5 voltios
Pin 6.- TXD
Pin 7.- GND
Pin 8.-RXD
Pin 10.- GND


En el ejemplo, cada vez que se pulsa un pulsador conectado al pin 9, se abre un archivo como escritura llamado igor.txt y se guarda una linea de texto en la que pone IGOR y el tiempo millis() en una linea. Es un poco tonto, pero para empezar esta bien... Voy sacando la info del programa por el Serial (el USB de programar).


 
 






//---------------------------------------
//By Igor Real
//VDIP1 without flow control
//11-07-09
//---------------------------------------
byte dato_recibido;
byte VNC1_State=0;
int noOfChars=1;
long int x;
long int val;

void setup() {

  pinMode(9,INPUT);
  
  Serial.begin(9600);
  Serial3.begin(9600);
  Serial3.flush();
  Serial3.print("IPA");
  Serial3.print(13,BYTE);  //RETURN
  //CONTESTA UN D:\> + CR
  if (VNC1_Confirmation()){
    Serial.println("CONFIGURADO LONG COMMAND");
  }else{
    Serial.println("ALGO FALLO");
  }


}

void loop()
{

  if (digitalRead(9)==1){
  delay(300);
  //VNC1_State=0   => Sync
  //VNC1_State=1   => FindDisk
  switch(VNC1_State){
    case 0:
      if (VNC1_Sync()==1){
        if (VNC1_FindDisk()==1){  
          VNC1_State=1;  
        }else{
          Serial.println("No hay disco");
        }  
      }else{
        Serial.println("Imposible Sync");
      }
      break;
    case 1:
      Serial.println("Hay disco");
      
      Serial3.flush();
      //Abro fichero para escritura
      Serial3.print("OPW igor.txt");
      Serial3.print(13,BYTE);  //RETURN
      //CONTESTA UN D:\> + CR
      while (VNC1_Confirmation()==0);
      //Meto datos
      val=millis();  
      x=val;
      noOfChars=1;      
      while (x>= 10){                
        noOfChars++;                
        x/=10;    
      }
      noOfChars +=7;
      
      Serial3.print("WRF ");
      Serial3.print(noOfChars);
      Serial3.print(13,BYTE);  //RETURN
      Serial3.print(73,BYTE);  //I
      Serial3.print(71,BYTE);  //G
      Serial3.print(79,BYTE);  //O
      Serial3.print(82,BYTE);  //R
      Serial3.print(32,BYTE);  //
      Serial3.print(val);  
      Serial3.print(13,BYTE);  //RETURN
      Serial3.print(10,BYTE);  //NEW LINE
      Serial3.print(13,BYTE);  //RETURN  
      //CONTESTA UN D:\> + CR
      while (VNC1_Confirmation()==0);
      Serial3.print("CLF igor.txt");
      Serial3.print(13,BYTE);
      //CONTESTA UN D:\> + CR
      while (VNC1_Confirmation()==0);      
      VNC1_Sync();
      Serial.println("Sacar el disco");
      
      VNC1_State=0;
      break;
    default:
      VNC1_State=0;
    
  }
  
  }

}

//----------------------------------------------------------------
// FUNCION: MIRAR SI HAY PENDRIVE
//----------------------------------------------------------------
byte VNC1_FindDisk(){

  byte FindDisk=0;

  Serial3.flush();
  Serial3.print(13,BYTE);  //RETURN
  //CONTESTA UN D:\> + CR
  if (VNC1_Confirmation()){
    FindDisk=1;
  }else{
    FindDisk=0;
  }
    
  //Serial.print("FindDisk= ");
  //Serial.println(FindDisk,DEC);
  Serial3.flush();
  return FindDisk;  
}

//----------------------------------------------------------------
// FUNCION: MIRAR SI HE RECIBIDO D:\>
//----------------------------------------------------------------      
byte VNC1_Confirmation(){  

  byte state=0;
  byte byte_received;
  byte confirm=0;  
  
  while (Serial3.available()<5) ;
  
  //Serial.print("Buffer= ");
  //Serial.println(Serial3.available(),DEC);
  
  while (Serial3.available()){
    byte_received=Serial3.read();
    //Serial.println(byte_received,DEC);
    
    if (byte_received==68 && state==0){
      //Received "D"
      state=1;
      //Serial.println ("Estado 1");
    }else if (byte_received==58 && state==1){
      //Received ":"  
      state=2;
      //Serial.println ("Estado 2");
    }else if (byte_received==92 && state==2){
      //Received "\"  
      state=3;
      //Serial.println ("Estado 3");
    }else if (byte_received==62 && state==3){
      //Received ">"
      state=4;
      //Serial.println ("Estado 4");
    }else if (byte_received==13 && state==4){
      //Received "CR"
      state=0;
      confirm=1;
      //Serial.println ("Estado 5");
      break;
    }else{
      confirm=0;
      break;
    }
  }  
  return confirm;
}  
//----------------------------------------------------------------
// FUNCION: SYNC
//----------------------------------------------------------------
byte VNC1_Sync(){
  
  byte cont_E=0;
  byte confirm_E=0;
  byte confirm_e=0;
  byte state=0;
  byte byte_received=0;
  
  
  Serial3.flush();
  while (confirm_E==0 && cont_E<255){
    Serial3.print(69,BYTE);  //E
    Serial3.print(13,BYTE);  //RETURN
    cont_E++;
    //Serial.print("Contador= ");
    //Serial.println(cont_E,DEC);
    
    while (Serial3.available()<2) ;
    
    while (Serial3.available()){
      byte_received=Serial3.read();
      //Serial.println(byte_received,DEC);
    
      if (byte_received==69 && state==0){
        //Received "E"
        state=1;
        //Serial.println ("Estado 1");
      }else if (byte_received==13 && state==1){
        //Received "CR"  
        state=2;
        confirm_E=1;
        //Serial.println ("Estado 2");
        break;
      }else{
        confirm_E=0;  
        delay(10);
      }
    }
    
  }
  if (confirm_E==1){
    //Serial.println("Vamos por e");
    Serial3.print(101,BYTE);  //e
    Serial3.print(13,BYTE);  //RETURN
    while (Serial3.available()<2) ;
    if (Serial3.read()==101){
      if (Serial3.read()==13){
        confirm_e=1;
      }
    }
  }
  return confirm_e;
  
}
//----------------------------------------------------------------      

 


.
.
Saludos

.
.Igor R.
.
.

8 comentarios:

  1. Hola Igor, no hay ninguna forma de usar el Vinculum y escribir como si fuese un serial tipo
    Serial3.print("una cadena larga de texto");

    es tortuoso tener que escribir letra a letra. igual es posible hacer una función que se encargue de gestionar cada letra de forma q la programación sea mas sencilla.

    ResponderEliminar
  2. Esto es solo un ejemplo sencillo para entender el concepto de lo que hay que ir haciendo.
    Por supuesto te puedes hacer una libreria para que sea mas practico trabajar con ello.

    ResponderEliminar
  3. ok

    sera cuestión de investigar un poco cuando tenga mi unidad.

    estaria bien desarrollar una libreria para poder guardar datos tal y como se escribe a un serial.port normal.

    a ver si el mes que viene tengo tiempo e intento hacer algo. avisare. si alguien inicia el desarrollo que avise.

    ResponderEliminar
  4. 35 euros !! seguro que lo conseguiste por 22e??? igual era otra pagina?
    buff me duelen esos 35 euros cuando encima apenas he encontrado tu proyecto y otro mas usandolo, igual hay otra opcion mas sencilla que desconozco para almacenar gran cantidad de datos.
    gracias Igor.

    ResponderEliminar
  5. Has mirado en la tienda de FTDI?
    http://apple.clickandbuild.com/cnb/shop/ftdichip

    Acabo de mirar el VDIP1 Vinculum VNC1L Development Module y son EUR21.33

    ResponderEliminar
  6. si pero pone en libras 17.50
    que si le sumas iva+transporte+conversion a euros
    sale por unos 35euros
    por eso pense que igual lo habias comprado en otra pagina y era para que no me costase 15 euros extra.

    ResponderEliminar
  7. Puedes elegir que la moneda sea EURO, y verás el precio que te he dicho yo.
    Bueno, yo los gastos de envio no los he contado...

    ResponderEliminar
  8. ok gracias Igor, se confirma entonces qu el precio final es de 34,73 euros
    son casi 5 euros de impuestos y 10 de envio.
    siento la molestia, simplemente queria confirmar que la pagina era correcta y que el precio era el que tu mencionabas.
    como dije, solo he visto ejemplos con arduino en 2 proyectos (siendo el tuyo uno de ellos) sigues recomendando el producto,no?
    veo que hay modulos para tarjetas SD con tarjeta incluida de 2 gb por 20 euros, pero lo facil que es usar un pincho usb no te lo quita nadie.aunque al ser FAT, el usb sera como maximo de 2gb,no?
    si me lo recomiendas visto su funcionamiento, lo compro.

    muchas gracias

    ResponderEliminar