Project tutorial

Motion Following Motorized Camera Base © GPL3+

Upgrade your home security camera or webcam with a motorized stand that will detect and follow any motion around the camera!

  • 122,511 views
  • 74 comments
  • 321 respects

Components and supplies

About this project

I came up with this idea to solve a problem I was having with my home security cameras.  I have one particular camera that is positioned on a wall between two rooms, however you can only see one room at a time unless you login to the camera software to rotate it manually.  If someone were to walk into the opposite room, the camera would never record the action.  To solve this problem, I decided to create a motion detecting/tracking base on which I could attach the camera so it would automatically reposition itself to wherever the motion was detected.

HOW IT WORKS :

This device uses 5 PIR motion sensors to detect any movement within a 180º radius.  Once motion is detected, a servo motor rotates the camera base to point in that direction.  There are also 5 LED "status" lights positioned inside the base that will light up anytime one of the PIR sensors detects motion.

SEE IT IN ACTION!

WIRING :

The wiring for this project is simple and straightforward, however, due to the fact that there are 5 of everything except the servo motor, the number of wires starts to add up quite a bit.  Check out the circuit diagram and schematics at the bottom of this page for more details, but here are the basics.

the LED status lights...

I used a mini breadboard to keep the LED lights separate from the rest of the circuitry in order to allow for easier removal if needed.  Each LED responds to a different PIR sensor and will light up anytime it detects motion.  Simply connect each LED to a separate digital input (9-13) on the Arduino, and ground them through a 220 ohm resistor.

the PIR motion sensors...

I used the HC-SR501 model PIR sensors for this project.  Each PIR sensor needs to be connected to a digital input (2-6) on the Arduino, 5V power, and ground.  If you're using the same PIR sensor as me, you can (carefully) pop off the cover and the pins are marked underneath.  You'll connect each PIR sensor to the corresponding LED light in the code uploaded later.

the servo motor...

The servo motor is attached to the stand where the camera sits, and rotates the camera to align with the active PIR sensor.  Using the pinout for your motor, connect one pin to power, another pin to the Arduino digital input 7, and the last pin to ground.  Before powering the Arduino, make sure to connect a 100µF capacitor between the power and ground of the motor to help protect the board from the power surges that occur when the motor moves.  

One thing to note about servo motors is that not all have a full 180º range of motion.  After some testing, I figured out that mine only moved about 160º, so modify the code accordingly if your motor differs.  You'll know the motor is trying to move too far when it makes a grinding noise at the last PIR sensor position.

CONSTRUCTION :

I used an old Memorex cd labeler for the servo housing and the surface for a camera to sit on.  I failed to take a ‘before’ picture, so the image below is the only remaining one that I could find online.  The back piece was a flat, sturdy plastic disc that eventually came off in one piece (after a little persuasion from my screwdriver), so that worked out great for a place to sit my camera.  It also came with 4 removable rubber ‘feet’, which helps to give the camera a little more grip when the motor moves.

I took my pliers to the black part in the center to remove it…and by that I mean, break it into as many parts as I can before it’s gone :)  Next, I drilled a couple holes in the base with my Dremel and then attached the servo motor with a couple screws.  

Lastly, I used another screw to attach the servo motor to the piece where the camera will sit.  I ran into an issue where the weight of the camera was causing the base to tilt, so I solved this by making a cardboard cylinder just tall enough to fit loosely between the motor and the camera.  Now it still moves freely, but has more support with it’s weight evenly distributed.

Here's what everything looks like after the PIR sensors have been installed and all the circuitry completed.  You'll notice I used several breadboards to complete my project.  The reason for this being that it made it extremely easy to fit them inside the base, as well as pick and choose which one to remove while troubleshooting and expanding upon later.

To complete the project, I spray-painted all the visible parts of the cardboard black so that it looked more seamless with the black stand above.

Here's the finished product after painting...


Code

The Main CodeArduino
The PIR Sensors will calibrate for 15 seconds after powering up the Arduino. It is recommended that you leave the room during this process so that the sensors get a true image of the room without any motion.
/*************************************************
*** The Motion Following Motorized Camera Base ***
***               by Lindsay Fox               ***
*************************************************/

// Servor motor
#include <Servo.h>
Servo camServo; // name the servo motor controlling the camera base
int currentPIRposition = 0; // set current angle of servo

// LED status lights
int LEDpin[] = {9,10,11,12,13}; // LED pin numbers
int currentLEDpin = 9; // the current LED pin; begin with the first in the sequence above

// PIR sensors
int PIRpin[] = {2,3,4,5,6}; // PIR pin numbers
int currentPIRpin = 2; // the current PIR pin; begin with the first in the sequence above
int PIRprevState[] = {1,1,1,1,1}; // the previous state of the PIR (0 = LOW, 1 = HIGH)
int PIRposition[] = {157,117.75,78.5,39.25,0}; // assign angles for servo motor (0-157 distributed equally between 5 PIR sensors)
boolean PIRstatus; // Set status of PIR sensor as either true or false



///// SETUP //////////////////////////////////////
void setup()  {
  
  Serial.begin(9600);
  camServo.attach(7); // assign servo pin
  
  for (int p = 0; p < 5; p++)  { // set all PIR sensors as INPUTS
  pinMode(PIRpin[p], INPUT);
    } // end 'p' for
    
  for (int l = 0; l < 5; l++)  { // set all LEDs as OUTPUTS
  pinMode(LEDpin[l], OUTPUT);
    } // end 'l' for
  
  /////// CALIBRATE PIR SENSORS ///////
  Serial.print("Calibrating PIR Sensors ");
    for(int c = 0; c < 15; c++){ // calibrate PIR sensors for 15 seconds (change from 10-60 sec depending on your sensors)
      Serial.print(".");
      delay(1000); // wait 1 second
      } // end calibration for
    Serial.println("PIR Sensors Ready");
  
  camServo.write(78.5); // move the servo to the center position to begin
  
  } // end setup



///// MAIN LOOP //////////////////////////////////
void loop()  {
  
  for (int PIR = 0; PIR < 5; PIR++) { // start this loop for each PIR sensor
    currentPIRpin = PIRpin[PIR]; // set current PIR pin to current number in 'for' loop
    currentLEDpin=LEDpin[PIR]; // set current LED pin to current number in 'for' loop
    PIRstatus = digitalRead(currentPIRpin);
    
    if (PIRstatus == HIGH) { // if motion is detected on current PIR sensor
      digitalWrite(currentLEDpin, HIGH); // turn corresponding LED on
      if(PIRprevState[PIR] == 0) { // if PIR sensor's previous state is LOW
        if (currentPIRposition != currentPIRpin && PIRprevState[PIR] == 0) { // if high PIR is different than current position PIR then move to new position
          camServo.write(PIRposition[PIR]);
          Serial.print("Current angle : ");
          Serial.println(PIRposition[PIR]);
          delay(50);
          currentPIRposition = currentPIRpin; // reset current PIR position to active [PIR] pin
          PIRprevState[PIR] = 1; // set previous PIR state to HIGH
          }
        PIRprevState[PIR] = 1; // set previous PIR state to HIGH if the current position is the same as the current PIR pin
        } // end PIRprevState if  
      } // end PIRstatus if
    
    else  { //
      digitalWrite(currentLEDpin, LOW);  //the led visualizes the sensors output pin state
      PIRprevState[PIR] = 0;   // set previous PIR state to LOW
      } // end else
      
    } // end [PIR] for loop
  } // end main loop

Schematics

Circuit Diagram
Schematics
Base/Stand Construction - Part 1
Base/Stand Construction - Part 2

Comments

Similar projects you might like

Security Access Using RFID Reader

by Aritro Mukherjee

  • 260,272 views
  • 42 comments
  • 281 respects

Home Automation Using Raspberry Pi 2 And Windows 10 IoT

Project tutorial by Anurag S. Vasanwala

  • 297,297 views
  • 98 comments
  • 706 respects

Complete Digital Clock Including Alarm and Motion Sensor

Project tutorial by LAGSILVA

  • 12,677 views
  • 11 comments
  • 50 respects

Android Motion Detector Camera with Arduino/MCU

Project tutorial by Walid Mafuj

  • 6,114 views
  • 7 comments
  • 22 respects

Arduino, Monitoring Door-Opening via Gmail

Project tutorial by phpoc_man

  • 27,067 views
  • 38 comments
  • 86 respects

Arduino Bluetooth Basic Tutorial

by Mayoogh Girish

  • 479,879 views
  • 49 comments
  • 284 respects
Add projectSign up / Login