8/13/2019 arduino-memoria-usb.pdf
http://slidepdf.com/reader/full/arduino-memoria-usbpdf 1/4
Arduino: Playground
Manuals and Curriculum
Board Setup and
Configuration
Development Tools
Interfacing With Hardware
Output •
Input •
Storage •
Communication •
General •
Interfacing with Software
Code Library and Tutorials
Suggestions & Bugs
Electronics Technique
Sources for Electronic Parts
Related Hardware and
Initiatives
Arduino People/Groups &
Sites
Exhibition
Project Ideas
Languages
edit SideBar
search
View Edit History Print Login Logout
Writing data to Usb Memory Stick
The ftdi viniculum chip will write to usb memory
ftdi vdip1
The commands are all here
http://www.vinculum.com/documents/fwspecs/Vinculum%20Firmware%20User%20Manual%20V2.1%20Rev%
202.pdf
It uses DOS commands to navigate around the disk and create and add to files.
It can interface in various ways, but I used serial. You only need to hook up 5V, 0V and serial in and out to
interface with it. It uses the cts and rts lines to control flow - so I just connected them to each other so that every
time the vdip says it is ready to send, it gets a clear to send message.
If you write info to it too quickly then it could possibly lose info as it won't be able to pause the sending of info,
but for my app I will be doing occasional short messages - letter and 4 numbers, so hope that it will be fine.
I'm using an arduino mini for my app., and have a usb to serial board for programming it. While I am debuggingit I have the serial out of the arduino going to the serial in of the vdip, and the serial out from the vdip going to
an additional serial in lead that I am monitoring with Z term on the mac. This means I can send messages to the
arduino from the serial monitor in arduino, and see the response I get in Z term.
I wrote a simple program that would execute various of the commands on receiving numbers from serial monitor.
One important note - do not use a memory stick with important files on it as while perfecting your code it is
possible to render the disk unreadable (I did it a few times). It is important to carry out the commands in the
correct order - you must open a file to write before writing to it, and you must close a file after you have finished
writing to it (although you can do multiple writes to it before closing it, but each one needs to specify how much
info it is going to write).
int incomingByte=0;\\
int fileNumber=1;\\
int noOfChars;\\
long int valToWrite;\\
char activityToLog;\\
long int x;\\
long int startLogTime = 0;\\
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
Serial.print("IPA"); // sets the vdip to use ascii numbers
//(so I can read them in the code easily!)
Serial.print(13, BYTE); // return character to tell vdip its end of message
}
void loop() {
if (Serial.available() > 0) { // read the incoming byte
incomingByte = Serial.read();
if (incomingByte=='1'){ // if it receives a 1Serial.print("OPW LOG%"); // open to write creates a file - named
Serial.print(fileNumber); // LOG%1.TXT first time round - .TXT is for the computer
Serial.print(".TXT"); // I have used the % sign in the name so I can
//search the disk for log files that it has created
//so as not to overwrite any that may be on already
Serial.print(13, BYTE); // return character
}
if (incomingByte=='2'){ // if it receives a 2
Serial.print("CLF LOG%"); // it closes the file
Serial.print(fileNumber); // LOG%1.TXT
Serial.print(".TXT");
Serial.print(13, BYTE); // return character
}
if (incomingByte=='3'){ // if it receives 3
Serial.print("DIR"); // lists the directory on the memory stick
Serial.print(13, BYTE); // which will now include the file LOG%1.TXT
}
Página 1 de 4Arduino playground - UsbMemory
27/07/2009http://www.arduino.cc/playground/Main/UsbMemory
8/13/2019 arduino-memoria-usb.pdf
http://slidepdf.com/reader/full/arduino-memoria-usbpdf 2/4
if (incomingByte=='5'){
activityToLog='P'; // I will be using different letters to label my ti
valToWrite=millis() - startLogTime; // time since we started logging
noOfChars=1;
x=valToWrite; // need to copy valToWrite as getting no of charact
while (x>= 10){ // counts the characters in the number
noOfChars++; // thanks to D Mellis for this bit
x/=10;
}
noOfChars +=2; //add 2 to the num as will also write the letter P
Serial.print("WRF "); //write to file (file needs to have been opened to
Serial.print(noOfChars); //needs to then be told how many characters will be
Serial.print(13, BYTE); //return to say command is finished
Serial.print(activityToLog); //followed by the info to write
Serial.print(valToWrite);
Serial.print(13, BYTE); //write a return to the contents of the file (so ea
}
if (incomingByte=='6'){
fileNumber++; //so we can create other files
}
if (incomingByte=='7'){
if (fileNumber>0){ //and look at previous ones
fileNumber--;
}
}
if (incomingByte=='8'){
Serial.print("RD LOG%"); //reads the contents of named file
Serial.print(fileNumber);
Serial.print(".TXT");
Serial.print(13, BYTE);
}}
if (incomingByte=='9'){
startLogTime=millis(); // reset timing
}
}
And heres the result once its plugged back into the computer.
As you can see the files creation date is wrong. Below is the code to use a realtime clock to create files with the
correct creation date. This could be adapted to use real time stamps rather than time since logging started, but I
don't need that at the moment.
I used the Dallas real time clock DS1307, starting with code from here in the forum.
I'm using a mini, so had to solder to pins 4 and 5 on the end of the chip to get the lines for i2c.
You need to check the firmware that your vdip is running if you want to set the creation date of the file to make
sure this will work. Writing date info to the file meta data was only enabled in V03.50 25-Apr-2007 of the
firmware. Mine were bought in May 2007 and were running V2.56, so adding a date stamp was not working at all.
Página 2 de 4Arduino playground - UsbMemory
27/07/2009http://www.arduino.cc/playground/Main/UsbMemory
8/13/2019 arduino-memoria-usb.pdf
http://slidepdf.com/reader/full/arduino-memoria-usbpdf 3/4
To check what version you are running, the vdip prints out its current firmware value on power up, so hook it up
to a serial port and give it power while watching with z term or the like. This is also a handy way to learn the
commands - I learnt to do what I wanted to do with z term first, and then worked out how to get the arduino to
send the same messages.
To update the firmware, just download the file from http://www.vinculum.com/downloads rename the file ftrfb.ftd
(removing version number) and put it on a memory stick. Plug that into the vdip, and it will find the file and
upgrade itself.
On to the code to do this-
add these lines to the earlier code
[=#=]include <Wire.h>; \\unsigned long datestamp;
to the declarations at the beginning.
add
Wire.beginTransmission(104); // transmit to device #104, the ds 1307
to the Setup code
add this function between setup and loop
unsigned long dateStampForUSB()
{
// Below required to reset the register address to 0.
Wire.beginTransmission(104); // transmit to device #104, the ds 1307
Wire.send(0x00); // resets ds1307 to beginning of its registers -could be in setup,
//but this just makes sure that whenever you are going to do
//a reading it is starting from the right point
Wire.endTransmission(); // stop transmitting
Wire.requestFrom(104, 7); // request 7 bytes from slave ds1307, we'll assume it'll send them all
// even though it doesn't have to
int second = Wire.receive(); //I have declared all these in here so that the
int minute = Wire.receive(); //function is self contained
int hour = Wire.receive(); //you could declare them at the top and then get at
int day_of_week=Wire.receive(); //the bits individually elsewhere in the code
int day = Wire.receive(); //but this could make the code less logical and
int month = Wire.receive(); //more difficult to debugg
int year = Wire.receive();
// Convert all the BCD values that might have "tens" to decimal
hour=hour/16* 10 + hour % 16;
minute=minute/16 * 10 + minute % 16;
second=(second/16 * 10 + second % 16)/2; //usb drive only works to 2s accuracy
// and takes number between 0 - 30
day=day/16 * 10 + day % 16;
month=month/16 * 10 + month % 16;
year=20 + year/16 * 10 + year % 16; //vdip dates start 0=1980, rtc0=2000, so we need to
// shift and or values to get one number in format needed for vdip\\
// doing it in 2 chunks as ints were going wrong if shifted for upper\\
// values, and didn't want to make all the variables long in case space became an issue\\
// so create one unsigned long, shift the ints that need to go into the top half into \\
// the lower half of it, and move them along inside the long var, then or it with the \\
// lower half values\\
unsigned long datecalc=(year<<9)|(month<<5)|(day);
unsigned int lsdatecalc=(hour<<11)|(minute<<5)|(second);
datecalc=(datecalc<<16);
datecalc=(datecalc)|(lsdatecalc);
return datecalc;
}
Now just add 3 lines to the if block that creates the file
if (incomingByte=='1'){
dateStamp=dateStampForUSB(); //gets value for datestamp
Serial.print("OPW LOG%");
Serial.print(fileNumber);
Serial.print(".TXT "); //make sure there is a space at the end here
Serial.print("0x"); //tells vdip it is a hex value
Serial.print(dateStamp, HEX); //sends datestamp as hex value
Serial.print(13, BYTE);
Página 3 de 4Arduino playground - UsbMemory
27/07/2009http://www.arduino.cc/playground/Main/UsbMemory
8/13/2019 arduino-memoria-usb.pdf
http://slidepdf.com/reader/full/arduino-memoria-usbpdf 4/4
}
Hope this makes sense.
I may rewrite this as a single example that includes the datestamp stuff if people think that would be better, but
thought I would get it up quick for now.
Cheers
Nick
Página 4 de 4Arduino playground - UsbMemory
27/07/2009http://www arduino cc/playground/Main/UsbMemory
Top Related