I've had some recent success working with a 3.3V arduino pro, a camera module and SD memory so I thought I would share what I have so far to see if anyone has done something similar.
My end goal is to take pictures periodically and geotag them, putting gps cordinates in the exif section of the jpeg.
This is the camera module -
http://www.sparkfun.com/commerce/product_info.php?products_id=9334Letting this run in a loop (see sketch below) I was able to take 100pictures, storing them on SD without an issue.
There is a boilerplate EXIF header added to each JPEG until I figure out how to add GPS data that I will be reading from an attached module.
The software to interface to the camera module is a modified version of
http://gizmologi.st/2009/04/taking-pictures-with-arduino/The software to interface to the SD card is
http://www.roland-riegel.de/sd-reader/#This is the library that goes along with the sketch which is a combination of the above two with some modifications
http://jarv.org/sdcam/sdc328_20090922.tarThe module for interfacing to the camera was modified to work with an attached SD card. For SD pin connections you might want to check out this thread -
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235125412Note that with the arduino pro (pictured) since it operates at 3.3v you won't need to step down the voltage.
In addition to the SD card and the camera an LED is connected to pin 2 which is what is used to report ERRORS (see SDCameraC328.h for a long list of error codes..)
The module is hard-coded to write picture0001, picture0002, etc. every time a snapshot is taken.
Here is the prototype:

And here is an example picture feature my very dark work area (yeah the camera isn't that great..)

#include <SDCameraC328R.h>
void blink(int times);
void getJPEGPicture_callback( uint16_t pictureSize, uint16_t packageSize,
uint16_t packageCount, byte* package);
#define ledPin 2
SDCameraC328R camera;
void setup() {
Serial.begin( 57600 );
blink(camera.InitializeSD()); // setting up the SD will result in images written to an attached SD card
blink(camera.sync());
blink(camera.initial( SDCameraC328R::CT_JPEG, SDCameraC328R::PR_80x60, SDCameraC328R::JR_640x480 ));
blink(camera.setPackageSize( 100 ) );
blink(camera.setLightFrequency( SDCameraC328R::FT_50Hz ));
// Let camera settle, per manual
delay(2000);
}
void loop()
{
blink(camera.snapshot( SDCameraC328R::ST_COMPRESSED, 0 ) );
blink(camera.getJPEGPicture( SDCameraC328R::PT_JPEG, PROCESS_DELAY, &getJPEGPicture_callback) );
delay(1000);
}
void blink(int times)
{
if (!times) return;
while (1) {
digitalWrite(ledPin, HIGH); // set the LED on
delay(200); // wait for a second
digitalWrite(ledPin, LOW); // set the LED off
delay(200); // wait for a second
}
delay(1000);
}
void getJPEGPicture_callback( uint16_t pictureSize, uint16_t packageSize, uint16_t packageCount, byte* package )
{
// if not writing to an SD card do something with the image data here..
}