Around about this time three years ago, I bought and installed five EasyN pan-and-tilt ip cameras to keep an eye on various viewpoints of our houses in the UK and Poland. I think they were about £45 each on Amazon. They’re not too hard to set up and they work tolerably well. The main downside is that their resolution is only 640 x 480 pixels, which is not enough to read a car numberplate from across the street. It’s fairly poor resolution, but you can see something. The colours are a bit washed out too because there’s no infra-red filter.
Last summer, one of these cameras started going a bit ‘intermittent’. So this Easter, when we went to Poland, I had plans to replace it with one of my ‘old’ rev 2 model B Raspberry Pis, a RasPiO Duino, Pi Camera and two servos. The RasPiO Duino controls the servo positions, and the Pi controls the camera. Like any true hack, it uses what I had available at the time. In this case, I used an SD card case as camera mount (it’s a lovely hinge) and huge quantities of hot glue.
How Do We Control It?
I set it all up and got it working, but there was a missing link in the chain. With the old ip cameras we had a browser-based user interface to control camera position and output. Well I wouldn’t know where to begin with a web UI, and that sort of thing doesn’t interest me either. So I thought about how else we could achieve our goal of being able to see what the weather is like in Poland and keep a general eye on things. At that point I thought…
Well we could get the DuinoCam to tweet a photo every hour, which would give us a nice snapshot of what’s happening. It would also alert us if the connection went down.
But then, in my mental meanderings, I had the “Eureka” moment…
What if we could actually control it by tweeting commands at it?
That ticked all my boxes…
- I’d never done it before
- I’d never heard of anyone else doing it before
- I knew I could build on previous twitter app work I’d done
- It was a great opportunity to use my own product to do something extremely cool
So I spent about 3 or 4 days on it, tweaking, fiddling, adding stuff (both hardware and software) and perfecting. The result is DuinoCam. It uses a pre-production “servo” variant of RasPiO Duino, but a standard RasPiO Duino could do the job in exactly the same way.
Here’s how the output compares with the EasyN…
Note that the EasyN has no IR filter (for nocturnal use) hence the washed out colours. As you can see, the Duino Cam output is a massive improvement. The EasyN wasn’t usually quite as bad as it looks here with the sun shining straight at it.
Here’s a Video Walkround
How Does DuinoCam Work?
DuinoCam uses a RasPiO Duino to control the positions of the pan and tilt servos, which determine what the camera is pointing at.
There Must And Shall Be LEDsThere is also a bank of super-bright white LEDs for short-range night-time illumination. These are switched with the RasPiO Duino and a Darlington Array chip. (They’re powered from the same 5V source as the servos – which is separate from the Pi.)
The Duino also has a light sensor (LDR) and a temperature sensor (TMP-36) connected to two of its analog inputs. These are measured once per second and the results reported to the Pi via serial port.
An Arduino sketch drives all of those processes. Commands are received from a Python script on the Pi via the serial port.
So What Does The Pi Do?
The Pi runs a cron job every minute to scan the DuinoCam’s (locked) twitter feed with a Python script. (Cron is a mechanism for running things at specific times or on specific events). If it sees a new tweet from a pre-approved (and hard-coded) twitter ID, it examines the tweet, looking for the following #hashtag commands…
- #1 – point camera at stairs/desk
- #2 – point camera at default position
- #3 – point camera at street
- #4 – point camera at neighbours opposite
- #lights_on – turn on LEDs
- #lights_off – turn off LEDs
- #photo – take a photo wherever the camera is now and tweet it
- #video_on – start streaming video
- #video_off – stop streaming video
- #scan_str – a full range 180 degree video sweep with streaming
- #scan_rec – a full range 180 degree video sweep, recorded, mp4ed & dropboxed, then local copy deleted
- #hires – take a full resolution photo, upload it to dropbox, then delete the local copy
If one or more of these commands are found, they are executed. Servo and LED control sends a serial message to the Duino, camera commands are executed on the Pi itself.
Another cron job reads and stores the current room temperature (TMP-36 sensor) and light levels (LDR) every 10 minutes using a Python script to read the Duino’s serial output.
Another cron job runs once an hour, on the hour (0600-1900). It first moves the camera to our chosen “default” position (in case we’ve been fiddling with it and left it in the wrong position), then takes and tweets a photo and the most recent temperature and light level information. (It usually takes about 17 seconds to achieve all that.)
So all we have to do is look at the twitter feed.
If we need to go “live” (which we find we really don’t since we now get a tweeted status photo every hour) we can switch on streaming and watch the stream with VLC on any device that can run it.
Streaming Relies On A Good Uplink, What If…
Streaming isn’t all that good on our Polish connection though because the uplink is not very fast. It took me 26 hours to upload the (4Gb) RasPiO Duino assembly video from there. So I decided to implement the same sort of dropbox upload that I used for RasPiCamcorder 2. This gives you the option to get high quality video without needing good bandwidth, as long as you can wait about 10-15 minutes for your results.
I Want High Res Photos Too
No problem! I also added the facility to dropbox upload a high resolution photo. Sometimes you just need a really good look…
What About Lights?
You may have noticed the weather station in the default view showing the car above. This has a remote temperature sensor in the basement. If we want to see the basement temperature in the dark (well you might, WJDK) we can flip the LEDs on with a
#lights_on tweet, then get a photo either tweeted
#photo or dropboxed
Will You Share The Code?
Yes, I intend to share the code and write the whole thing up some time within the next few months. I’ve been rather busy lately getting the RasPiO Duino KickStarter rewards out the door. We’re nearly done with those. Once we are, the RasPiO Duino will go on general sale. Click here to find out when that will be.