Raspberry Pi as low-cost HD surveillance camera

FeaturedContest Winner
Picture of Raspberry Pi as low-cost HD surveillance camera
This instructable describes how to build a surveillance cam based on a Raspberry Pi micro-computer which records HD video when something moves in the monitored area. Live picture can be viewed from any web browser, even from your mobile while you're on the road.
What you will get:
  • See live stream in any web browser from anywhere
  • Record any motion into video file
Usually, such a cam will cost you around US$1.000, but with the result from this instructable, you will get such a cam for only about US$120.
Remove these adsRemove these ads by Signing Up

Step 1: Background

Picture of Background

Have you ever heard of Raspberry Pi? It's a low-cost micro-computer that is able to run Linux and has endless extension possibilities. It cost only about US$35 and opens up endless possibilities of what you can build with it. The official website can be found at

Step 2: Hardware components

Picture of Hardware components

We need some hardware for this project. This is a list of the major things we need:

  • Raspberry Pi Model B: This is the larger model of the Raspberry computer system with 700MHz and 512MB Ram. It supports HD video. You can easily order it from i.e. here. Cost: about US$40. You could also use the Raspberry Pi Model A which is slightly cheaper and consumes less energy. Stefan Knight has written an excellent article on how to run this whole project on a model A.
  • A housing for the camera: you don't need to buy a high-price-housing for your Raspberry. There are loads of very cheap fake security cameras available which perfectly fit our needs here. Search the web for "surveillance camera dummy" and you will find loads of housings for your new camera for only a few dollars. I.e. this one will do the job: for only US$9. We have ordered this camera housing for about 20€ in Germany that had enough space for all the components: You can use any camera housing, but only be careful about the size of the housing so that the Rasperry board will fit in there. The dimensions of the Raspberry board are 85.6 x 53.98 x 17 mm (approx 3.37 x 2.13 x 0.67 in).
  • Power supply: The Raspberry computer does not come with any power supply, you have to get one on our own. Any power supply with a micro-USB plug can do the job as long as it supplies at least 1A of power. We have ordered such a power supply which already has a micro-USB plug for about US$10
  • SD card: as the Raspberry Pi does not have any storage on board, you need to add some so that you can install and run the operating system for this device. Any SD or microSDHC should do the job, but we recommend using a Class 10 SD card. It's only around US$7
  • To connect this cam to your network, you also need some kind of network connection. One possibility is to use a LAN connection, but you would need to put LAN cable to the point where you want to mount the camera. A better alternative is such a WiFi USB adapter for only about US$10
That's all: for about US$120 we have all the hardware we need to build this HD surveillance cam.

Step 3: Install Raspbian

At first, you should install the OS and software to the Raspberry Pi before mounting it all together. An OS is the basic operating system software that tells the Raspberry hardware what to do. Linux is perfect for this. We have chosen Raspbian, as it's one of the most advanced OS for the Raspberry with loads of help and tutorials on the internet.
You need to prepare the SD card to be able to run Raspbian on the Raspberry: this excellent tutorial from Adafruit will explain the necessary steps.
Now temporarily connect your Raspberry Pi board to LAN cable, a monitor (HDMI TV works out of the box, but a HDMI-to-DVI cable like this will do the job as well) and a USB keyboard for the basic setup.
Insert the prepared SD card with the Raspbian installer on it and attach the power supply.
The Raspberry should boot up and guide you through the setup process as explained in this Adafruit tutorial. After this, you should have a basic Raspbian OS running.
Be sure to enable SSH in Raspbian so that you are able to control the Raspberry device also when there is no monitor and keyboard attached. And you should also enable the camera from the Raspbian setup menu so that we can use it for motion detection.
Now make sure your RPI is up to date:

sudo apt-get install rpi-update
sudo rpi-update

And also update all packages:

sudo apt-get update
sudo apt-get upgrade

Step 4: Connect via SSH

Picture of Connect via SSH

Now that the basic setup is done, you should connect to your Raspberry device from your computer. You can connect to Linux console from any computer in your local network and control it like you where sitting directly in front of it. This is very important as once mounted far away from your desktop, you need to be able to make updates and change the configuration of this camera any time later without the need to detaching it from the wall and bringing it back to your desk.

Remember that this cam is not just a dump cam device but a very powerful computer with Linux OS running on it. It's not limited to what we explain in this article now; it will follow any development in software so that you will be able to install updated software and more modules any time later.

First, you need a software to connect to the Linux console on the Raspberry. For Windows, you will need the extra (free) software PuTTY. Download it from the PuTTY website, install it and connect to your Raspberry Pi device:

From now on, you don't need any monitor and keyboard attached to the Raspberry anymore.

Step 5: Enable WiFi

If you want to run this camera with a WiFi USB dongle (like we've suggested in step 2), you will need to do some quick additional steps to make WiFi work on the Raspberry:
From the console (PuTTY window), edit the network properties of the Raspberry:
sudo nano /etc/network/interfaces 
Now add these lines at the end of the file (or change existing lines to match these):
allow-hotplug wlan0 
iface wlan0 inet dhcp 
(Fill in the SSID and password for your WiFi network)
Reboot the Raspberry with this command and see if it correctly connects to your WiFi network:
sudo reboot  

Step 6: Put the hardware together

Picture of Put the hardware together
Now it's time to assemble all the hardware components together into the housing. Depending on the housing, this should not be a too complicated job. Be sure to mount the Raspberry board safely so that it doesn't tumble around in the housing.
As our housing had a very large glass window at the front, we have closed it with a black paper with a hole in it. This has the advantage that the "tech" of the camera is not visible anymore. If you like the camera recording led to be visible, don't cover it. Whenever the camera is detecting any motion or is recording, the led light will glow in a very bright red.
You can also turn off the camera red LED by adding this line to /boot/config.txt:


Step 7: Installing the motion detection software

A very good (and free open-source) motion detection/surveillance software with many configuration options is motion.
We now need to install it using the command line (log in to your raspberry as user "pi"):
sudo apt-get install motion 
Some packages will be installed in the installation process; just type "y" to proceed with the installation.
As the current version of motion does not (yet) support the Raspberry camera module, we need to download and install a special build with support for this camera module.
cd /tmp 
sudo apt-get install -y libjpeg62 libjpeg62-dev libavformat53 libavformat-dev libavcodec53 libavcodec-dev libavutil51 libavutil-dev libc6-dev zlib1g-dev libmysqlclient18 libmysqlclient-dev libpq5 libpq-dev
And now you need to unpack the downloaded file to the /tmp directory:
tar zxvf motion-mmal.tar.gz  
After this unzipping, you now need to update your installed motion with the downloaded build:
sudo mv motion /usr/bin/motion
sudo mv motion-mmalcam.conf /etc/motion.conf  
You also need to enable the motion daemon so that motion will always run:
sudo nano /etc/default/motion
and change the line to:
We're pretty sure that the official build of motion will shortly also support the Raspberry camera module as well.
A very important command to edit the motion configuration file is
sudo nano /etc/motion.conf  
Note: in the standard motion installation, the motion.conf is in /etc/motion/, but in the special motion-mmal build from dropbox-url (see above) it's in /etc/. If you follow this tutorial with all steps, this is no problem at all.
Be sure to have the file permissions correct: when you install motion via ssh while being logged in as user "pi", you need to make sure to give the user "motion" the permissions to run motion as service after reboot:
sudo chmod 664 /etc/motion.conf
sudo chmod 755 /usr/bin/motion
sudo touch /tmp/motion.log
sudo chmod 775 /tmp/motion.log  
We've made some changes to the motion.conf file to fit our needs. Our current motion.conf file can be downloaded here. Just download, unzip and copy the containing motion.conf to /etc/motion.conf if you would like to use the exact config options we describe below.
Some of the main changes are:
Make sure that motion is always running as a daemon in the background:
daemon on 

We want to store the logfile in /tmp instead (otherwise autostart user won't be able to acces it in /home/pi/ folder):

logfile /tmp/motion.log
As we want to use a high quality surveillance video, we've set the resolution to 1280x720:
width 1280
height 720 
We don't need real-time video, 2 pictures per second are totally ok for our needs:
framerate 2 
This is a very handy feature of the motion software: record some (2 in our configuration) frames before and after the motion in the image was detected:
pre_capture 2
post_capture 2 
We don't want endless movies. Instead, we want to have max. 10 minutes slices of the motion videos. This config option was renamed from max_movie_time to max_mpeg_time in motion. If you use the motion-mmal build, this one will work. If you get an error 'Unknown config option "max_mpeg_time"' either change this one to max_movie_time or make sure to really use the motion-mmal build as shown above.
max_mpeg_time 600 
As some media players like VLC are unable to play the recorded movies, we've changed the codec to msmpeg4. Then, the movies play correctly in all players:
ffmpeg_video_codec msmpeg4  
Enable access to the live stream from anywhere. Otherwise only localhost (= the Raspberry device) would be allowed to access the live stream:
stream_localhost off 
If you want to protect the live stream with a username and password, you should enable this:
stream_auth_method 2  
stream_authentication SOMEUSERNAME:SOMEPASSWORD 
All configuration parameters are explained in detail in the motion config documentation.
After your changes to the motion.conf, reboot the Raspberry:
sudo reboot  
After the reboot, the red light of the camera module should be turned on, which shows that motion currently is using the camera to detect any movement.

Step 8: Save videos on Windows shared folder

As the SD card of the Raspberry Pi is a pretty limited resource, we've decided to let the Raspberry cam store the videos on one of our Windows Servers. This is pretty easy:
First share a folder from some Windows machine. Just follow some guides on the internet if you've never shared a folder from a Windows machine before.
Then open the fstab configuration on your Raspberry from a PuTTY console or directly from the device:
sudo nano /etc/fstab  
Now add an extra line with the configuration of your Windows network shared folder:
//YOURSERVERNAME/YOURSHAREDFOLDERNAME /mnt/camshare cifs username=YOURSHAREDFOLDERUSERNAME,password=YOURSHAREDFOLDERPASSWORD,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0 
Be sure that the user has the correct permissions to save files to that shared folder.
After a reboot, the Raspberry should have an extra folder /mnt/camshare mounted to the Windows shared folder. You should now set in your motion.conf:
target_dir /mnt/camshare 
so that motion saves all movies to the shared folder on the Windows machine.

Step 9: Fix motion autostart

Picture of Fix motion autostart
We had some trouble that motion was not automatically started on a reboot of the Raspberry. We've found out that this was because the mounted folder of the Windows machine was not yet ready when motion tried to access it.
A very quick fix solved our problem:
Just edit the motion file with
sudo nano /etc/init.d/motion 
and add the line
sleep 30 
to the start-sequence.
Our changed /etc/init.d/motion script can be downloaded from here.

Step 10: Mounting the camera

Picture of Mounting the camera
After all these steps, you can finally mount the surveillance camera to the destination point.
Some helpful hints:
  • Be sure to place the power supply in a dry and safe place
  • Keep an eye on the WiFi signal: if you mount the camera out of range of the WiFi, it won't be able to send any live video nor save any motion videos

Step 11: Accessing the live stream

Now you can access the live stream from the camera from any browser via the url http://IPADDRESSOFRASPBERRY:8080
Where 8080 is the port that we've configured for our stream in the motion.conf file. See your own configuration setting "stream_port" in motion.conf for the port.
We've found out that Google Chrome 30 (not even on iOS) wasn't able to play this stream directly due to a bug in the underlying Chromium project.
A workaround for this is to create a simple html file that contains one large image with the stream-url of the camera. See the file cam.html from This way, Chrome can show the live stream as well. Let's hope that Chrome will fix this issue in their browser.
But other browsers like FireFox, Safari and even VLC media player was able to show the live stream of the camera.
We were not able to make the live stream work in Internet Explorer as it doesn't support Motion JPEG. Kenneth Lavrsen (the maker of motion) has described workaround for live stream in Internet Explorer here.

Step 12: Access live stream from anywhere

Picture of Access live stream from anywhere

To make the live stream accessible from anywhere, you will need to enable some kind of dynamic domain services to your local network. This will enable you to always be able to connect to your local IP address from the outside even if your local IP address changes (over here in Germany, every private DSL ip address changes every 24 hours).
Such a (free) service enables you to access your Raspberry from anywhere even if your ip address changes. A very good service we're using for some years now is They have some free services and are integrated in many routers.
Once you have set up the dynamic ip url, you can access the camera stream from anywhere in your browser (i.e. http://YOURDYNAMICDOMAIN:8080).
And this also works from the browser on your mobile device.

Step 13: Next steps

There are a thousand things you can do with such a surveillance cam basic setup now. How about sending Growl notifications when some motion was detected? This guide explains how to add this functionality easily.

Or you could easily add a temperature-sensor to the cam. It's only a few bucks and can be integrated very easily.
We're currently working on integrating the live stream into MediaPortal server so that we can switch to a TV channel to see the live stream from the cam in our office.

If you want extra security, you could also add a battery pack to the camera. Be sure to buy one that is able to charge simultaneously while powering the Raspberry. This would enable you to detect if some bad guy cuts the power strips of your camera and send some alert messages to you (i.e. SMS or email) including the video of the disturber.

What are you going to add? Let us know!

Caldes made it!4 hours ago


Great tutorial!

I followed all steps and it worked for me. It shows up in Firefox perfectly and... I actually had no problem in registering the stream to the Surveillance software on my old Synology DS207+ running DSM 3.1. That's great and fun!

I had two problems at start since I didn't get any recordings on the target_dir "/mnt/camshare/Cam1" (permission set to 755) and the live stream got unavailable after a little time of use. Often just after a few minutes. Both problems where solved after setting the rights of the target_dir to 777. I guess Linux people will hang me for this and I should probably look into giving the motion process the necessary write rights instead of setting it to 777. But for now while testing and debugging it fits me well.

A fun thing to do now would be to motorize the camera and make it rotate through the Pi ;-) I see that the motion.cfg file opens for this functionality.


pengocha3 days ago
Definitly going to try this out. I'm wondering, would it be possible to add a smoke alarm together with this project. An alarm would be triggerd if a burglar is in your house and also if there's a fire. That seems a very usefull feature to me.
raka1918 days ago

I am building a second camera for my home. The first one was resounding success! Thanks to this instructible. I replicated all the steps correctly for my second camera (as far as I can tell) but for some reason I cannot view the stream or capture videos. I changed the stream_port on motion conf to something other than 8080. I chose 9080 arbitrarily. 8080 is being used by my first camera. I do not see the stream or capture videos. I even changed my first camera stream_port to 7080 (arbitrary again) and changed the second camera I am working on to 8080. The first one works like a charm even with the changed stream_port but the one I am building one does not work. Is there a way to check if the camera module itself is working correctly. Since I installed motion s/w , the default camera application in Rasbian does not work any more on either camera wit the following commands.

raspistill -o image.jpg

raspivid -o video.h264

Is there any other quick way to check if the camera is working correctly? Basically I need to segment out the issue but I do not know what is causing the issue. Otherwise I will have restart from scratch. Any tips will be appreciated.

raka19 raka1911 days ago

Quick update. I removed motion software to check of the default camera application was working correctly. It gave me an error. Based on that I figured that the camera was fried, possibly by accidentally dropping it or static from me. Ordered a new camera module and resolved the issue.

dailodai7815 days ago

GREAT instructable. have you considered adding high powered LED lights into that housing?

battleangel17 days ago

I just wanted to say I am very excited about this project. One lingering question though: How do you secure your electronics against moisture / humidity? A completely air-tight camera housing (difficult)? Or small drainage holes in the bottom? Will the power consumption of the RPi (3.5W + voltage conversion via PoE ~ 6W) work with or against me? I.e. keep the casing warm and dry or in fact force moisture to condensate inside the case? Would stuffing the case full of silica gel help or would it need to be replaced too often to be of any practical use? Or would I have to waste more watts on a heater and a fan inside the housing? Btw, I got one of the housings from AliExpress, tried to keep the size down and ended up with a "short" model of only about 20-23cm so the air volume inside the case should be limited. I will in time add more hardware to the setup, like a wireless transceiver and possibly a Razzberry so protecting the hardware against corrosion is of great importance. Too bad I can't just put the whole darn thing in silicone or hot glue or something. Ideas?

eddie84 months ago
This is really impressive, but is it possible to make one that is not so bulky? You know a smaller verson that may not be visible to others, such as a smoke detector type that will not bring attention to itself? If so please let us know what modifications -- if any, we need do. Thamk U,

eddie8, you can do that, but you would have to put the bulk of the items, the Pi, and components in another shell and get a camera with a long cable or buy an extension cable for it to house just the camera in a tiny unit like a smoke detector or even a dummy light bulb, or in an actual smoke detector. So you could house the Pi right above the smoke detector on the other side of the drywall run the extension cable for the camera into the smoke detector and now you have both a working smoke detector and security camera, just drill a hole in the smoke detector for the cameras lens to be able to look out of

KT Gadget eddie84 months ago
eddie, A lot of it will mostly be based on the size of the camera board and making an extension ribbon cable from the camera to the Pi board (IDE cables may work, but research on it). Just watch out for degradation of signal over a long distance since it will drop due to the wire resistance. It is possible though, just depends how far the camera and the Pi will be from each other.
mraza51 month ago

None of the steps are working for me. I have been trying to my internet through a usb dongle, but i have not been successful uptil now. i have also tried step 8 and it did not work for me at all. Please help me out

scavix (author)  mraza51 month ago

Do you get any error message? What do the system logs say?

mraza5 scavix1 month ago

No I dont. thats the real problem. I followed all the steps uptill making ssh work. It worked perfectly ok. but when i tried enabling wifi it did not work. I thought thats alright and kept going. I did motion detection. then i tried sharing videos on my windows computer it did not work either.
can the problem be that i am using windows 8?

stew81 mraza523 days ago

What source are you using to power the pi and the wifi-dongle? Do you have a powered USB hub, or is the dongle plugged into the pi? I would suggest using a powered USB hub to handle the wifi-dongle, and a separate connection to power the pi. .

scavix (author)  stew8123 days ago

As written in the instructable, we just use the power supply to power the Pi. The wifi dongle is just plugged into the Pi.

mraza5 scavix22 days ago

scavix, can u tell me any dummy camera in which i could easily place my pi, and I could get in like maximum four business days.

scavix (author)  mraza522 days ago

Shipping to which country? Try searching Amazon and eBay. That's why we've put the size of the Pi into the instructable, so that you can search a housing on your own that fits your needs.

mraza5 scavix22 days ago

To Canada. Well nevermind. i ll work out something, for buying a dummy camera.

mraza5 scavix22 days ago

i am already using my cell phones charger as a power supply, and its fine. Its output is 5 volts and 2Amps. so i think this part is alright. but for some reason the coding for dongle doesnt work for me. can you tell me any possible things i should do.

stew81 mraza522 days ago

Your power supply to the pi is fine...the problem you are encountering is due to insufficient/inconsistent power running from your pi through the usb port, and then to the dongle itself. The pi's usb ports shouldn't be expected to handle more than 150mA. There are issues with resistance in it's usb port fuses that cause the voltage to drop to 4.5V when significant current is drawn from a device such as a WIFI dongle. Here is a page with more regarding this topic:

mraza5 stew8123 days ago

But do you think having a powered usb in surveillance camera makes sense? Doesn't make sense to me. I would rather like to use it without it, somehow.

stew81 mraza523 days ago

I'm just stating what worked for me when I ran into this same situation. A WiFi adapter will probably need more power than the Raspberry Pi USB port can provide. I'm referencing information from here:

As far as having a usb hub with a surveillance camera, I don't see why there would be any problems so long as it fits within the casing and has a power supply.

I ran into a couple similar problems. First for Wi-Fi. My router would use a different IP address for Wi-Fi v. Ethernet. To check to see if this is the case Open an SSH session and type sudo ifconfig -a and see what ip address is assigned to wlan0. It may be different than eth0 which is preventing you from SSHing over Wi-Fi. Alternatively, you can attach a monitor, keyboard, and mouse to the pi and run the wi-fi configuration utility on the Raspbian desktop GUI.

Second, for step 8 there are two possibilities. First make sure the /mnt/camshare directory exists. Type sudo ls -l /mnt/camshare. If you get an error that the directory does not exist type sudo mkdir /mnt/camshare. Second, use user=<username> instead of username=<username> in /etc/fstab. You may need to reboot after you make the changes, but you can try typing sudo motion to restart motion first. Hopefully that should solve your problems.

Ok. I see. did u make this thing? is it possible for you to contact me sometime, you can take my skype or email address. I have to do this, and make some modifications to it. Like, maybe add this Can you help me out maybe via skype? Because for some unknown reason scavix takes too much time to reply. I will reply with my feedback in a few hours, after I get home

mraza5 scavix1 month ago

???? I actually need to complete this and do a few modifications by Thursday. So please help me out.

pdfsman25 days ago

oh thanks! now I can´t access to live stream, i write the url with my ip adress but google chrome and even mozilla cant get a conexion with the page. Can you help me in the part to create a html file that contains one large image, please?

have you put the port number at the end. default one is 8081. Should look like <---- just an example

yes i wrote something like that but i cant get an extra folder /mnt/camshare mounted to the windows shared folder

scavix (author)  pdfsman25 days ago
What error do you get in the browser? FireFox should be able to play the live video. If it doesn't, a html page won't help either.
ITsniper scavix24 days ago

oh and also I noticed, if you change the default port number from 8081 in the config, you can't view the live stream anymore, why is that? It won't accept a different port number.

ITsniper25 days ago

Figured out the windows share issue, server name wouldn't work, had to use the IP of the windows PC, worked fine after that, woohoo! Time to set up camera number two, should be easy now. Also just ordered a third raspberry pi for my Wifi access point to set my cameras up behind. One other thing, if you want access to your pi camera from any other PC, install samba and samba-common on your raspberry pi, configure a share in the config file, you will now be able to access the /mnt/camshare folder from any networked PC on the same LAN subnet. Don't forget to set permissions to the /mnt/camshare/ folder. There are plenty of tutorials on samba out there.

Also anyone who is looking for some cam cases that are a little smaller, check this website out

Thanks for the tutorial scavix

So far I have set my cam up at the back door watching my cat entrance, I suspect another cat is sneaking in and eating my cats food, we shall soon see what is eating it. All we need now is night vision on the pi cam.

xoanweb26 days ago

It is necessary to use the Cam Module of the RbPi or we can use a normal WebCam as well ?

scavix (author)  xoanweb26 days ago
motion supports all kind of cams. See the motion website for help 

ITsniper26 days ago

Ran into a few problems, but eventually sorted them out, still only have one problem left. The motion captures that are getting recorded are going straight to /mnt/camshare/, which is on the raspberry pi, but they are not going over to my windows share folder. Does it matter what I name my windows share folder? currently I named it recordings_folder, and I added that info to /etc/fstab

pdfsman1 month ago

sorry, can you help me? In step 7 in the part of Make sure that motion is always running as a daemon in the background, so i write daemon on and in the next line i get this bash: daemon: command not found

scavix (author)  pdfsman1 month ago

Please read the 3 sentences before that: these are the changes in the config file /etc/motion.conf, not bash commands.

nberndt1 month ago

nice project, I am currently running a few foscam cameras and their ios/android app. Do you think it could be possible to get the RPI stream from that app aswell?
How is the integration to Mediaportal working, I would like to test that aswell....:)

scavix (author)  nberndt1 month ago

Thanks for the appreciation.

We've never worked with foscam, so we're unable to caomment on that. But the stream from this camera can be viewed in any browser on your iOS/Adroid device.

We've not yet managed to get the stream into MediaPortal. We'll keep you updated on the progress.

Foscam uses a proprietary stream from its equipment (thus the extra charges for things like recording), so, while not impossible, it is also not likely.

Diy_master1 month ago


I can't find how to make when camera detect motion then send me an email with picture. I'm WIN user, so Growl it's not for me?

Thank you for answer and great useful tutorial!!

scavix (author)  Diy_master1 month ago

Get More Out of Instructables

Already have an Account?


PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!