If you have an adafruit TTL Serial JPEG Camera you may have found that downloading an uncompressed 640×480 JPEG from the camera can take up to 15 seconds. Depending on your application this might be far too long!
Mini USB Nano V3.0 ATmega328P CH340G 5V Micro-Controller Board for Arduino & USB. 2/3 Axis Digital Readout LCD TTL 1um Linear Glass Scale DRO Display CNC Milling. We are going to make 18 circuits to explore the basics of using wiring and programming with the Adafruit Metro and Metro Express in Arduino. This guide covers: LEDs, transistors, motors, integrated circuits, push-buttons, variable resistors, photo resistors, temperature sensors & relays.
To speed things up a bit you can add compression to the image. Adding up to 40% can decrease the download time for a picture to about 5 seconds but at the same time you have to sacrifice picture quality.
So how else can you speed up the transfer? How about upping the transfer speed!
The camera by default uses 38400 baud but it is capable of much more than this. The question though is how to change the settings?
The Arduino Uno can do up to 115200 baud so it seems like a good idea to me to set the camera to the same speed. This should improve the download times by a fair bit more. (At the present time I haven’t been able to test by how much.)
So how do you get the camera to run at this faster speed? adafruit provide a library for the Arduino that provides functions for virtually all the things you might want to use on the camera. Unfortunately, at present there isn’t a function for changing the baud. After doing a lot of hunting around the interwebs I found there were quite a few people wanting to change the baud but no answer on how to do it. I put my thinking hat on and after a few hours of experimenting I came up with the following test code…
#include <SoftwareSerial.h>
SoftwareSerial softSerial(2, 3); //Set Software serial to use Pins 2 and 3
char serInStr[100];
int serInIdx =0;
int serOutIdx =0;
void setup() {
Serial.begin(9600); //Set Hardware Serial to 9600 baud - For outputting debug messages
Serial.println('Start');
softSerial.begin(38400); //Set Software serial to 38400 baud - Default setting for the camera
Serial.println('Softserial Baud has been set to 38400');
delay(10); //Pause for 10ms to let it all settle down. Probably not needed!
Serial.println('Get Camera Version');
getCamVers(); //Call getCamVers function
Serial.println('Setting Camera Baud to 115200');
setBaudMax(); //Call setBaudMax function
Serial.println('Reset softSerial to 115200');
softSerial.end(); //Disconnect serial connection to camera
softSerial.begin(115200); //Reconnect serial connection to camera at 115200 baud
Serial.println('Get Camera Version again using 115200');
getCamVers(); //Check camera version again to prove everything is working at 115200
}
void loop() {
//Do nothing
}
void getCamVers() {
uint8_t ByteData[5]={0x56, 0x00, 0x11, 0x00}; //String of bytes that requests version number from camera
softSerial.write(ByteData,5); //Send string to camera
delay(10); //Pause to let the camera deal with the request
if(softSerial.available()){ //Check if serial buffer has a response from camera
while(softSerial.available()){ //Loop as long as the serial buffer contains data
serInStr[serInIdx] = softSerial.read(); //Read data from serial buffer. Copy into array
serInIdx++; //Increase array count by 1
}
}
for(serOutIdx=0; serOutIdx < serInIdx; serOutIdx++) { //Loop through array
Serial.print(serInStr[serOutIdx]); //Print each value in array to consol
}
Serial.println(); //Print end of line
}
void setBaudMax() {
uint8_t ByteData[7]={0x56, 0x00, 0x24, 0x03, 0x01, 0x0D, 0xA6}; //String that sets baud to 115200
softSerial.write(ByteData,7); //Send string to camera
//Should really check for a suitable response here!
}
Hello and help!
I am trying to use my new TTL serial camera for a project that is due on Thursday. I want to use the motion detect function to activate a servo. I checked the camera and adjusted the settings using the CommTool, and wired the camera to the Arduino, but I keep getting “no camera found.” I checked and redid all my connections; I also checked to make sure I had imported all of the libraries I need. I’m not sure what else to try. A photo of the wiring is attached (the violet wire is TX) and the code is below. Please help! Thanks, Alix
/////////////////////////////
//VARS
Ttl Serial Camera Arduino Project
#include <Servo.h>
#include <Adafruit_VC0706.h>
#include <SD.h>
#include <SoftwareSerial.h>
//int LDR_Pin = A1; //light detector to pin A0
//int LDRValue = 0; // int to store LDR value
//int light_sensitivity = 0; // value of light surrounding sensor
int ledPin = 13;
// Using SoftwareSerial (Arduino 1.0+) or NewSoftSerial (Arduino 0023 & prior):
#if ARDUINO >= 100
// On Uno: camera TX connected to pin 2, camera RX to pin 3:
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
// On Mega: camera TX connected to pin 69 (A15), camera RX to pin 3:
//SoftwareSerial cameraconnection = SoftwareSerial(69, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif
Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);
//int timerValue = 0;
//int minuteValue = 1;
Ttl Serial Camera Arduino Uno
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
boolean lockLow = true;
boolean takeLowTime;
int pos = 0; // variable to store the servo position
int r = 0; // variable to store random number
/////////////////////////////
//SETUP
void setup(){
Serial.begin(9600);
Serial.println(“VC0706 Camera test”); //test for camera
if (cam.begin()) {
Serial.println(“Camera Found:”);
} else {
Serial.println(“No camera found?”);
return;
cam.setMotionDetect(true); // turn it on motion detected = true
Serial.print('Motion detection is ');
if (cam.getMotionDetect())
Serial.println(“ON”);
else
Serial.println(“OFF”);
}
pinMode(ledPin, OUTPUT);
//calibrateLight();
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
////////////////////////////
//LOOP
void loop()
{
// LDRValue = analogRead(LDR_Pin); //read the analogue value of the light sensor
// Serial.println(LDRValue);
// delay(10);
//if(LDRValue < light_sensitivity)
if (cam.motionDetected()) {
Serial.println(“Motion!”);
digitalWrite(13, HIGH);
r = int(random (0,180));
Serial.println(r);
if (r > pos)
{
for(pos; pos <= r; pos += 10) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(10); // waits 15ms for the servo to reach the position
}
}
Ttl Serial Camera
if (r < pos){
for(pos; pos >= r; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(10); // waits 15ms for the servo to reach the position
}
}
}
else
{
digitalWrite(13, LOW);
}
//the led visualizes the sensors output pin state
if(lockLow){
//makes sure we wait for a transition to LOW before any further output is made:
lockLow = false;
cam.setMotionDetect(false);
Serial.println('—');
Serial.print(“motion detected at “);
Serial.print(millis()/1000);
Serial.println(” sec”);
delay(15);
}
// timerValue += 10;
//
// if(timerValue >= 1800000){
// calibrateLight();
// timerValue =0;
// }
//
// }
//
//void calibrateLight(){ //calibration function defined
// float brightness = 0; //initial value = 0
// for(int i = 0; i<250; i++){
// brightness += analogRead(LDR_Pin);
// float divideRate = 10000/250; //10 seconds divided by 250 samples
// delay(divideRate); // evenly space time between samples
// }
//
// brightness = brightness/250; //average brightness
// light_sensitivity = brightness; //calibrated value
// light_sensitivity -= 20; //amount of interruption to activate servo
// Serial.print(“sensor calibrated at”);
// Serial.println(light_sensitivity);
Serial.println('…Done!');
cam.resumeVideo();
cam.setMotionDetect(true);
}