Friday, 11 May 2018

2018 Birch log blue tits, Nest building, egg laying and incubation days 1-13

13 days in from the start of blue tit nest building, we're up to 8 eggs.  Three eggs were laid on day 6 (ouch) then approximately one egg per day.  She started incubating in the last couple of days.

Video and images captured using PikrellCam on a RaspberryPi Zero W.  This box's build is described here.

This is a slide show of nest building and egg laying using a mixture of IR and visible light.  The pinkish cast on the visible light is due to the lack on an IR-cut filter on the camera... I'll add one for next year.

Here are some of the images.  Each one links through to a high res version.

Having looked at other blue tits nests, it seems that green tennis ball fluff is quite the 'in thing'.  In this one is also rabbit hair, sheep wool, straw, moss and feathers from my neighbour's chickens...

1st eggs laid on day 6

Day 9, egg in the sunshine, infra-red illuminated
Day 13, 8 eggs, incubating most of the time now
Some video clips

Female being fed on the nest while laying (not incubating in earnest yet)

This one with the lights on

All seems to be going well, other what is probably a tick above her right eye.  Goes with the territory in these parts...

Sunday, 29 April 2018

2018 Nesting Season, False starts and Late starters

I had almost given up on nesting this year after some promising early interest in the double camera box fizzled out. BUT all is not lost!...

Great Tit checking out double camera box
Side camera footage, female Great tit:

We had some nesting material brought in (this one has sound)

But that was about it for this box...

BUT all is not lost!

The BirchLog Box that I put up a week ago started off this morning like this:

BirchLog Box, Infra-red illuminated, blue tit. Clay blob on the floor, 8:30 am
The thing that looks a bit like a slug on the floor is a piece of air-drying clay which was supposed to help support the plywood roof, I used hot-glue in the end and didn't bother removing the clay, a piece fell out and seen here littering the floor.  I had thought to retrieve it, but in the end the blue tits cleared it out themselves.

By the end of the day, the box looks like this:
BirchLog box, visible light-illuminated, 6:30 pm
A high res of this is  here.

The blue tits have had a very busy day 1.  I got this nice pic of one on its way on:

Blue tit on its way into BirchLog box
high res version here

Here are a couple of video clips of today's nest building efforts:

This is using the Infra-red illumination

This is is with the visible light leds on instead

Borrowing a feather from next doors chickens

Roosting overnight...

Sunday, 22 April 2018

Wi-fi Small Bird, 'Birch Log' Nest Box

This birdbox is a more compact version of my previous design, but basically the same kit used as in the as the robin box described previously: 8 mega-pixel digital camera, wifi IP connection, night-vision or visible light options with added illumination, and motion activated recording facility.

Update 11/05/18: Nest building, and egg laying here

This time I've equipped a cheap commercial nest box box, rather than make my own as I liked the 'natural' look of it. This box is supplied by CJ Wildlife, it's basically a hollowed out birch log with a 32mm hole at the front, which should be good for Blue Tits and Great Tits.  Total build cost is in the region of £70.

TamperProof.  Holds off any Woodpecker armed with a philips head screwdriver

My main problem with this box is that the  lid and the back baton are attached with 'TamperProof' Torx head screws.  I cant see the point since good old philips-head screws would have done just as well.  If you're going to buy this box, make sure you spend the equivalent cost on a set of appropriate screwdriver bits....  I also replaced the back batton to give an attachment point beneath in addition to the one at the top.

There is enough of a gap between the roof and the entrance hole to squeeze in the this little fella, which fits in snugly under the lid

Lid insert with Raspberry Pi Zero-W, 8MP IR camera and 4x IR and 4x White LEDs

Birch log box with camera insert

I made two changes with this design over the Robin box version of this

Top and bottom view

LEDs are added via 2x perfboards on the underside, instead of fiddly, messy wiring on the top. The 12v to 5v conversion is done via a recom switching regulator (R-78B5.0-1.5).  I had originally planned to supply this box with a 5v feed but this didnt work well, and had to supply at a higher voltage (12v) and then drop it.  The switching regulator component alone is an equivalent cost of the Raspberry Pi Zero-W, so I've used it a reusable way rather than soldering it directly in to the stripboard.

Bodge-tastic use of PCB terminal blocks...

As previously, the unoccupied left side slot is wired for a L293DNE to switch an IR-cut filter (to be added at some point later, for a how-to see this post).

The finished product

Some inside views

Top: Infrared mode, Bottom: Visible light mode
The visible light option suffers from the lack of an IR cut filter, but one can be added once nesting season is over...

and in-situ

Monday, 2 April 2018

WiFi Robin Nest Box

I've planned a 'hub and spoke' arrangement of bird boxes.  I previously described the 'Wireless Access point' box (aka 'WAP box'), this post details a 'spoke/satellite' box.

Robin box in the undergrowth
Robin box with Great tit...

This is a ground-level open-fronted box designed with robins in mind.  Last year, a robin family successfully raised a brood of three chicks about a meter away from this new box at ground level.  That nesting site has since disintegrated, so this is hoped to be come its successor.

The camera setup is designed to be generic so that I can remove it and swop it into other boxes designed with similar dimensions, in that way I can maximise the number of boxes, while not having to equip every one with a camera.

There is a ledge at the top that holds the camera section.  This consists of a Raspberry pi Zero-W, an 8 megapixel v2 'Pi-Noir' camera (sensitive to IR as well as visible light).  Underneath are 4x each of white and IR LEDs for illumination.  Power is via a 12v feed from the WAP-box, dropped to 5v via a recom r-78b5.0 1.5 switching regulator.  LEDs are powered form the same 5v source, and switched via a transistor array (ULN2003AN), on the R side of the picture below.  This allows low, medium and high setting on each of the IR and visible light, white LEDs.  The unoccupied left side slot is wired for a L293DNE to switch an IR-cut filter (to be added at some point later, for a how-to see this post).

The white LEDs are wired in parallel with a 50ohm resistor for each LED.  The IR ones are also in parallel, but with no extra resistors.

The circuitry is arranged on a commercial prototyping board designed with the same dimensions as the Pi zero-W.  The board layout is as follows:

Protoboard layout, same footprint as Pi Zero/W
I also added pins for a DS3231 real-time clock module, since the Pi is only able to get time from the network, and wanted to plan for occasions when it loses network connection (there's not enough headroom in the box to fit them on the actual GPIO pins).
As with most of my other boxes, video capture is via motion capture software pikrellcam with captured footage/images saved to a mounted network drive (i.e. off the box).

This clip shows the box in situ cycling through various illumination settings:

A couple of observations from the transition from 'testing to the real world...'
Pi Zero-W wifi reception once closed into a wooden box drops off somewhat.  Running the following command gives some idea of reception levels:  iwconfig wlan0 | grep -i --color quality
Output is: Link Quality=44/70  Signal level=-66 dBm

The impact of this is that I cant set PikrellCam to record video captures direct to the network drive, as it all keels over.  Handily there is an archive option, so I just need to keep an eye on it and archive to the network when need be.  I also dropped the quality of the live stream which seems to have stabilised it. 

UPDATE: A updated implementation of this kit is detailed, in 'Birch Log' nest box described here

Thursday, 15 March 2018

Wireless access point bird box

My current nestbox cameras are mostly raspberry pi-based with either a webcam or raspberry pi (RasPi) camera module to record and/or to stream digital video to a web-browser or CCTV software on a separate PC.  Power is via 'Power over ethernet' (PoE) where one ethernet cable provides power and a means to transmit the digital video.  Cable runs are approx 50m and 80m.

Using this setup, I'm limited to one camera per cable run:

Solution: The Wireless Point access bird box or 'WAP-Box'

I've taken an existing raspberry Pi (Raspberry Pi 2, model B)-based bird box, added a wifi dongle and set it up as a wifi access point (as per these instructions).  This is the 'WAP-Box', which helpfully can still be used to run its camera as well as being a wireless access point for other nearby devices.

In this setup, 48v PoE ethernet cable goes to the base of the tree.  At the tree base is a junction box where the cable is split out to ethernet-only and power, dropped to 5v using a TP-Link PoE splitter.  The 5V output is then used to power a  Mini USB hub using a  female USB to female barrel socket adapter, and the barrel connector supplied with the TP-link PoE splitter.  The usb hub can be used to power up to 4 devices. (note that this PoE kit also includes the power injector used in the house).
So, this didn't work well.  I ended up dropping the 48v feed to 12v, an splitting this out to a 'junction box' at the bottom of the tree as I didnt fancy climbing a tree each time I wanted to  connect/disconnect a device....  12v feeds are ...

1) Recombined with ethernet for wired, PoE and sent to the 'WAP-box' which is up a tree.  This a based around a wired ethernet Raspberry pi 2B with wifi dongle.  The 12 v PoE feed powers the Raspberry Pi another TP-link PoE splitter with voltage dropped to 5v   The power cable was hacked from micro USB cable (keep the micro end to be used later) and a DC barrel connector.  I couldnt find a link for the PoE injector I used, but it came with a print server ages ago and had been in the 'may come in useful' drawer.

2) The additional WiFi 'Satellite NestBoxes':
Birch log box small tit box described here
Robin box described here

These take a 5v 12v feed via cables made from a length of black 2-core bell wire and the same microusb and DC barrel connectors linked to above.  The cables power a Raspberry Pi Zero-W + Raspberry Pi v2 IR camera module combo in each box which will have a couple of IR and visible LEDs to for illumination. The satellite boxes are pre-configured to connect to the WAP-box, and thus can save any captured video direct to my home network, so I dont need to worry about the little Raspi ZeroW's running out of space on their SD cards.
This didnt work well due to lag / poor network connection.  In the end I ended up writing video locally to the PiZero's SD cards, and archiving off daily to the local network, which can all be automated.

This all currently works on the bench with 4 concurrently running camera setups using PikrellCam software, and will be going up in the next couple of weeks once their various boxes are completed.  In testing, the Pi Zero-W can 'see' the WAP-box up to about 30m away - my main concern is that if the 12v cable runs are too long the voltage drop may lead to instability of the Pi Zero-W's, so that is likely to limit the cable run distance rather than the strength of the WiFi signal.  I also need to have a think about the current load on the 48v power injector at the house end...

More to follow once some boxes are up...

Of note is that the Raspbery Pi foundation recently released a new version of the highest performing version, called the Model 3B+.  This is interesting this context as it could potentially make a better WAP-box core since it has a faster ethernet connection.  Currently, simultaneously live streaming 4 Raspi-zeros via the existing Pi2 Model B is a bit choppy, which may be due to a bottleneck at the WAP-box's ethernet connection... or this could just be me using this as an excuse to play with one...

Satellite box 1, 'Robin Box' described in this post
Satellite box 2 'Birch log box' described in this post

Saturday, 24 February 2018

Coding for day or night events

This post was promoted by a post on the  GarysShed blog after a discussion on triggering events based on whether it's day or night time.

To be fair, the whole post is an excuse to include following video from the BBC's 'Walk on the Wildside' series

I needed to modify the behaviour of the illumination LEDs in one of my Raspberry Pi-based  birdboxes based on whether it is light or dark.  This box has IR (Infra-Red) as well as visible light LEDs, I wanted the IR to operate all the time, and the standard LEDs to come on (and IR LED go off) only in the event of a daytime  motion 'event', which could be triggered by any of:  Entrance hole IR beam being broken, PIR insider the box triggered or motion detected on camera.

An IR-cut filter over the camera can then be switched on or off depending based on this too - IR LED off when visible LEDs are on.  (An IR-cut filter turns an IR-sensitive camera into a daylight-only sensitive camera).

The idea was that I didn't want visible LEDs coming on during the night, mainly to disturb any occupants, I also didn't want this happening as it looks a bit odd from the outside:

Possible solutions:
1) Analyse camera image for brightness
2) Use a light-dependent resistor (LDR) to sense ambient light and modify LED behaviour based on this.
3) Implement a software-method to predict day vs night based on longitude and latitude

1) Analyse camera image for brightness.  Borrowed code from here and here and here
convert test.png -colorspace hsb -resize 1x1 txt:- | sed -n 2p | sed 's/.*(//; s/).*//'

If run in the terminal, will output something like: 81.857%,38.706%,17.7462% where these figures are the HSB (hue, saturation, brightness) values from a 1x1 pixel converted version of the original image (test.png in this example)

2) Use LDR to monitor light.  There's loads of examples out there how to do this, a randomly selected recent one here

At one time I did a merge of method 1 & 2 to which I've uploaded to a github repository Ambient-Light-Monitoring, the script is called  This reads actual light level via an  LDR, and also takes image with a Raspberry Pi Camera and measures image brightness.  All these variables are then written to a file for playing with which could be applied with in a variety of contexts..

3) Software method
I've tried two approaches, both rely on feeding the application the current location via longitude and latitude.

3.1) SunWait.  A stand-alone program, an example use is described in a blog post here.  Essentially you run a crontab job every ?minute that writes to a file to indicate the current light/dark state.  You can then read that file into your application and base the outcome on whether its day (..light) or night (...dark).  I could not get it to work..

3.2) Python module: pyephem, website here
This is a python module, so is used within a python script.  You need to install python-dev first or the install of this module will fail. The module can then be installed with the pip python module installer
sudo apt-get install python-dev
sudo pip install ephem
Note, the sudo bit is important otherwise if you attempt to run a python script from rc.local  containing this module (to run it at boot) the root user wont be able to find the module since without 'sudo...' it will install ephem under the user 'pi'

This approach worked for me.  Longitude and Latitude can be generated on various websites, eg here, pyephem also uses height above sea level which I think I got off google earth.  This would be aprticularly relevant if you're using it at the top of a mountain....
Refer to the example script in the above mentioned githib repository

3.3) ?Pikrellcam motion capture application
I use the awesome motion capture application PiKrellCam in my birdboxes.  In its .config file is the facility to define location by longitude and latitude.  I spotted a recent forum post querying if it was possible to switch an IR-cut filter on or off by using the day/night status within Pikrellcam to trigger a command to the GPOI pin(s) controlling the IR cut.  See my IR-cut post on how to wire such a thing up.

Thursday, 31 August 2017

Control BirdBox LED lights via a simple webpage

This year's 'Double Camera' bird box has a variety of illumination options...

I wasn't sure how best to setup the internal lighting, so I, well threw a selection of LEDs at it in three separate circuits/loops, These are on 12v circuits, and are isolated from & switched by the (5v) raspberry pi via a ULN2003AN transistor ic.  I used all 7 base input channels, with the collector outputs switching the 12v LED loops through a selection of resistors as follows:

Loop 1) 4x 'Warm' LEDs: LOW (10k ohm) and HIGH (330 ohm)
Loop 2) 3x 'White' LEDs: LOW (10k ohm) and HIGH (330 ohm)
Loop 3) 36 IR LED array: LOW (10k ohm), 'MED' (5k ohm potentiometer) and ('HIGH' 330 ohm)

+ An opaque perspex 'windows' at either end for the natural light options..

Once the birdbox was in-situ, I wanted a simple way to fiddle about with the lighting, and came across Matt Richardson's excellent Flask  tutorial, specifically his script example.  This creates a webserver within python that allows me (and the kids...) to turn LEDs on, off up or down via a simple webpage:

The tutorial is an excerpt from his Getting Started with Raspberry Pi: An Introduction to the Fastest-Selling Computer in the Worldbook

Just for fun - someone's at home....
I've adapted this for my needs as follows:

import RPi.GPIO as GPIO
from flask import Flask, render_template, request
app = Flask(__name__)



# Create a dictionary called pins to store the pin number, name, and pin state:
pins = {
   25 : {'name' : 'LED_IR_High', 'state' : GPIO.LOW},
   8 : {'name' : 'LED_IR_Med', 'state' : GPIO.LOW},
   7 : {'name' : 'LED_IR_Low', 'state' : GPIO.LOW},
   16 : {'name' : 'LED_Warm_High', 'state' : GPIO.LOW},
   12 : {'name' : 'LED_Warm_Low', 'state' : GPIO.LOW},
   21 : {'name' : 'LED_WHITE_High', 'state' : GPIO.LOW},
   20 : {'name' : 'LED_WHITE_Low', 'state' : GPIO.LOW}

# Set each pin as an output and make it low:
for pin in pins:
   GPIO.setup(pin, GPIO.OUT)
   GPIO.output(pin, GPIO.LOW)

def main():
   # For each pin, read the pin state and store it in the pins dictionary:
   for pin in pins:
      pins[pin]['state'] = GPIO.input(pin)
   # Put the pin dictionary into the template data dictionary:
   templateData = {
      'pins' : pins
   # Pass the template data into the template main.html and return it to the user
   return render_template('main.html', **templateData)

# The function below is executed when someone requests a URL with the pin number and action in it:
def action(changePin, action):
   # Convert the pin from the URL into an integer:
   changePin = int(changePin)
   # Get the device name for the pin being changed:
   deviceName = pins[changePin]['name']
   # If the action part of the URL is "on," execute the code indented below:
   if action == "on":
      # Set the pin high:
      GPIO.output(changePin, GPIO.HIGH)
      # Save the status message to be passed into the template:
      message = "Turned " + deviceName + " on."
   if action == "off":
      GPIO.output(changePin, GPIO.LOW)
      message = "Turned " + deviceName + " off."
   if action == "toggle":
      # Read the pin and set it to whatever it isn't (that is, toggle it):
      GPIO.output(changePin, not GPIO.input(changePin))
      message = "Toggled " + deviceName + "."

   # For each pin, read the pin state and store it in the pins dictionary:
   for pin in pins:
      pins[pin]['state'] = GPIO.input(pin)

   # Along with the pin dictionary, put the message into the template data dictionary:
   templateData = {
      'message' : message,
      'pins' : pins

   return render_template('main.html', **templateData)

if __name__ == "__main__":'', port=90, debug=True)

Make it executable as follows:
chmod 755

Add the following toward the end of /etc/rc.local to make it run at boot:
python /home/pi/Documents/BirdCam2/flask/WebLamp/ &

The IR sensitive camera is a v2 Raspberry pi Pi Noir (Camera 1).  Unsurprisingly, the IR HIGH setting to just too bright, with the MED setting being the sweet spot.  IR_Low (10k ohm) barely registers... At the moment I've got it set to IR_Medium.

I haven't made much use of the non IR LEDs yet, but the LifeCam Cinema webcam (Camera 2) does not see very well without them being on, which is bit of a shame.  Maybe a ver 2018 box could have bigger natural light windows (Or I'll take a hacksaw to this one...).

We've seen a fair number of wasps taking an early interest and this Hornet (I think) taking a look... This is using the IR LED array and Pi Noir v2 camera

The LifeCam version looks like this.. the lesson is that I need a motion trigger on the non IR LEDs as there is only natural daylight illuminating this:

Some thoughts...
36 IR leds is excessive.
The raspberry v2 Pi Noir daylight light sensitivity is not good (with IR cut, so conceivably this is reducing the 'useful' daylight sensitivity).
I dont use the 'LOW' setting on the WARM or WHITE leds
LifeCame Cinema needs more natural light for unassisted daylight video (bigger windows)
Need an 'on-motion' event to turn on non-IR leds.