Passive IR to IR Canon Trigger
Simple project designed to detect a bird landing on a feeder and then take a photo.
The way this project works is by firstly using a standard PIR unit which gives an output when movement is detected, then the Arduino Nano gives out a IR code to trigger the Canon camera.
This should have been a simple little project... but ended up taking a lot longer than expected!
The First Version and Parts Required.
So the first version (its the same as the final version but housed differently) has the PIR detector on long wires this enabled it to be placed under the roof of a bird table, the IR emitter was also on a long wire and run towards the camera pointing to the sensor on the front of the hand grip. I discovered whilst testing this that the distance wasn't that great, i am guessing you could play with the resistor value to get better distances but i settled on about one meter max.
Now this first system did work very well, however it required lots and lots of food to be placed on the table and this in-turn attracted loads of Starlings. Now don't get we wrong Starlings are nice birds, but just not that interesting, and using the bird table resulted in hundreds of photos. so i then decided to try a different approach.
The Second Version (new Housing)
So after the first attempt i decided that the PIR sensor should be pointing in the same direction as the camera. So i made up a little holder and placed the unit in a small bore pipe (drainpipe used for sheds) this had the added benefit that the unit could be pushed down the tube to give a smaller sensor window. I tried this out and it seemed to work very well. i then found up a suitable mount and fitted the unit next to the camera on a tripod.
SO did this version work????
Yes and no, the slightest movement (wind) or difference in lighting (sun/clouds) would cause the camera to take a picture. So to say it was sensitive was a understatement! i had hundreds of pictures and ran the camera battery out very quickly!
So what next???
Improvements to the System! (artistic License)
So the first thing had to do was stop the feeder moving. This was easy, in one of the pictures i tied the feeder down and on another feeder you have the option of screwing a wooden dowel into the bottom. So both these methods worked well. And also placing the feeder in an area where nothing else will move, which means the wall. (not the nicest of pictures but we will sort that out next!)
Take a nice picture and get it printed onto a canvas to provide a nice (non moving) background.
As for the clouds/sun issue i set up the feeder in the shade! which surprisingly worked! however you need to play with ISO settings or exposure settings to brighten up the pictures.
Setting Up the Camera.
These new (modern) cameras are so clever that sometimes it can be a challenge to do something different, and in my case, i had to do the following on My CANON 700 (Rebel)
- Make sure you have a fully charged battery.
- Turn off the power-save so the camera never shuts down.
- "Turn in" the LCD display to save battery life.
- Set the camera to focus on the feeder and even turn off the Auto focus if needed.
- Turn off IS (image stabilizer) as its not needed on the tripod and wastes battery.
- Set the camera to trigger on IR.
- Set to Aperture mode and check picture time/exposure adjust ISO to get speed faster than about 1/60.
- Check its not going to rain....
The Arduino Sketch
I cant take credit for the whole program as the canon IR had already been hacked by this chap...
The Arduino program uses the tone function to basically drive the IR LED at a set frequency for a set time. And i have added the loop to check if the PIR has given an output. I have used an analogue pin as the output from the PIR was only 3 volts and the arduino wasn't picking up a logic change.
int IRLed = 2;
int PIR = A3;
int PIRValue = 0;
void setup()
{
pinMode(led, OUTPUT);
pinMode(IRLed, OUTPUT);
pinMode(PIR, INPUT);
}
void takePicture()
{
unsigned long startTime = micros();
tone(2,32700);
while ((unsigned long)(micros() - startTime) < 472) {} // wait until done
noTone(2);
while ((unsigned long)(micros() - startTime) < 7802) {} // wait until done
tone(2,32700);
while ((unsigned long)(micros() - startTime) < 8274) {} // wait until done
noTone(2);
}
void loop()
{
PIRValue = analogRead(PIR);
if (PIRValue >> 500)
delay(2000);
{
takePicture();
}
delay(3000);
}