Mostrando entradas con la etiqueta vinculum. Mostrar todas las entradas
Mostrando entradas con la etiqueta vinculum. Mostrar todas las entradas

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.
.
.