160 lines
5.6 KiB
Arduino
160 lines
5.6 KiB
Arduino
|
// This is a basic snapshot sketch using the VC0706 library.
|
||
|
// On start, the Arduino will find the camera and SD card and
|
||
|
// then snap a photo, saving it to the SD card.
|
||
|
// Public domain.
|
||
|
|
||
|
// If using an Arduino Mega (1280, 2560 or ADK) in conjunction
|
||
|
// with an SD card shield designed for conventional Arduinos
|
||
|
// (Uno, etc.), it's necessary to edit the library file:
|
||
|
// libraries/SD/utility/Sd2Card.h
|
||
|
// Look for this line:
|
||
|
// #define MEGA_SOFT_SPI 0
|
||
|
// change to:
|
||
|
// #define MEGA_SOFT_SPI 1
|
||
|
// This is NOT required if using an SD card breakout interfaced
|
||
|
// directly to the SPI bus of the Mega (pins 50-53), or if using
|
||
|
// a non-Mega, Uno-style board.
|
||
|
|
||
|
#include "Adafruit_VC0706.h"
|
||
|
#include <SPI.h>
|
||
|
#include <SD.h>
|
||
|
|
||
|
// SD card chip select line varies among boards/shields:
|
||
|
// Adafruit SD shields and modules: pin 10
|
||
|
// Arduino Ethernet shield: pin 4
|
||
|
// Sparkfun SD shield: pin 8
|
||
|
// Arduino Mega w/hardware SPI: pin 53
|
||
|
// Teensy 2.0: pin 0
|
||
|
// Teensy++ 2.0: pin 20
|
||
|
|
||
|
#define chipSelect 4
|
||
|
|
||
|
// Pins for camera connection are configurable.
|
||
|
// With the Arduino Uno, etc., most pins can be used, except for
|
||
|
// those already in use for the SD card (10 through 13 plus
|
||
|
// chipSelect, if other than pin 10).
|
||
|
// With the Arduino Mega, the choices are a bit more involved:
|
||
|
// 1) You can still use SoftwareSerial and connect the camera to
|
||
|
// a variety of pins...BUT the selection is limited. The TX
|
||
|
// pin from the camera (RX on the Arduino, and the first
|
||
|
// argument to SoftwareSerial()) MUST be one of: 62, 63, 64,
|
||
|
// 65, 66, 67, 68, or 69. If MEGA_SOFT_SPI is set (and using
|
||
|
// a conventional Arduino SD shield), pins 50, 51, 52 and 53
|
||
|
// are also available. The RX pin from the camera (TX on
|
||
|
// Arduino, second argument to SoftwareSerial()) can be any
|
||
|
// pin, again excepting those used by the SD card.
|
||
|
// 2) You can use any of the additional three hardware UARTs on
|
||
|
// the Mega board (labeled as RX1/TX1, RX2/TX2, RX3,TX3),
|
||
|
// but must specifically use the two pins defined by that
|
||
|
// UART; they are not configurable. In this case, pass the
|
||
|
// desired Serial object (rather than a SoftwareSerial
|
||
|
// object) to the VC0706 constructor.
|
||
|
|
||
|
|
||
|
#define cameraconnection Serial
|
||
|
|
||
|
Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);
|
||
|
|
||
|
// Using hardware serial on Mega: camera TX conn. to RX1,
|
||
|
// camera RX to TX1, no SoftwareSerial object is required:
|
||
|
//Adafruit_VC0706 cam = Adafruit_VC0706(&Serial1);
|
||
|
|
||
|
void setup() {
|
||
|
pinMode(10, OUTPUT);
|
||
|
digitalWrite(10, HIGH);
|
||
|
SerialUSB.begin(1000000);
|
||
|
SerialUSB.println("VC0706 Camera snapshot test");
|
||
|
while (!SerialUSB); // wait for serial port to connect. Needed for native USB port only
|
||
|
// see if the card is present and can be initialized:
|
||
|
if (!SD.begin(chipSelect)) {
|
||
|
SerialUSB.println("Card failed, or not present");
|
||
|
// don't do anything more:
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Try to locate the camera
|
||
|
if (cam.begin()) {
|
||
|
SerialUSB.println("Camera Found:");
|
||
|
} else {
|
||
|
SerialUSB.println("No camera found?");
|
||
|
return;
|
||
|
}
|
||
|
// Print out the camera version information (optional)
|
||
|
char *reply = cam.getVersion();
|
||
|
if (reply == 0) {
|
||
|
SerialUSB.print("Failed to get version");
|
||
|
} else {
|
||
|
SerialUSB.println("-----------------");
|
||
|
SerialUSB.print(reply);
|
||
|
SerialUSB.println("-----------------");
|
||
|
}
|
||
|
|
||
|
// Set the picture size - you can choose one of 640x480, 320x240 or 160x120
|
||
|
// Remember that bigger pictures take longer to transmit!
|
||
|
|
||
|
cam.setImageSize(VC0706_640x480); // biggest
|
||
|
//cam.setImageSize(VC0706_320x240); // medium
|
||
|
//cam.setImageSize(VC0706_160x120); // small
|
||
|
|
||
|
// You can read the size back from the camera (optional, but maybe useful?)
|
||
|
uint8_t imgsize = cam.getImageSize();
|
||
|
SerialUSB.print("Image size: ");
|
||
|
if (imgsize == VC0706_640x480) SerialUSB.println("640x480");
|
||
|
if (imgsize == VC0706_320x240) SerialUSB.println("320x240");
|
||
|
if (imgsize == VC0706_160x120) SerialUSB.println("160x120");
|
||
|
|
||
|
SerialUSB.println("Snap in 3 secs...");
|
||
|
delay(3000);
|
||
|
|
||
|
if (! cam.takePicture())
|
||
|
SerialUSB.println("Failed to snap!");
|
||
|
else
|
||
|
SerialUSB.println("Picture taken!");
|
||
|
|
||
|
// Create an image with the name IMAGExx.JPG
|
||
|
char filename[13];
|
||
|
strcpy(filename, "IMAGE00.JPG");
|
||
|
for (int i = 0; i < 100; i++) {
|
||
|
filename[5] = '0' + i/10;
|
||
|
filename[6] = '0' + i%10;
|
||
|
// create if does not exist, do not open existing, write, sync after write
|
||
|
if (! SD.exists(filename)) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Open the file for writing
|
||
|
File imgFile = SD.open(filename, FILE_WRITE);
|
||
|
|
||
|
// Get the size of the image (frame) taken
|
||
|
uint16_t jpglen = cam.frameLength();
|
||
|
SerialUSB.print("Storing ");
|
||
|
SerialUSB.print(jpglen, DEC);
|
||
|
SerialUSB.print(" byte image.");
|
||
|
|
||
|
int32_t time = millis();
|
||
|
// Read all the data up to # bytes!
|
||
|
byte wCount = 0; // For counting # of writes
|
||
|
while (jpglen > 0) {
|
||
|
// read 32 bytes at a time;
|
||
|
uint8_t *buffer;
|
||
|
uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
|
||
|
buffer = cam.readPicture(bytesToRead);
|
||
|
imgFile.write(buffer, bytesToRead);
|
||
|
if(++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up
|
||
|
SerialUSB.print('.');
|
||
|
wCount = 0;
|
||
|
}
|
||
|
//SerialUSB.print("Read "); SerialUSB.print(bytesToRead, DEC); SerialUSB.println(" bytes");
|
||
|
jpglen -= bytesToRead;
|
||
|
}
|
||
|
imgFile.close();
|
||
|
|
||
|
time = millis() - time;
|
||
|
SerialUSB.println("done!");
|
||
|
SerialUSB.print(time); SerialUSB.println(" ms elapsed");
|
||
|
}
|
||
|
|
||
|
void loop() {
|
||
|
}
|