Camera-B-On TV-B-Gone

Camera-B-On Switch

I have created a Camera-B-On TV-B-Gone. This fairly simple mod allows me to use my TV-B-Gone as a camera remote for my Nikon D90. In fact, this will work as a shutter remote for a lot of Nikon cameras.

If you have a USBTinyISP you can easily make a Camera-B-On by upgrading your TV-B-Gone.

Download Source CameraBOn.zip

Why make a Camera-B-On out of a TV-B-Gone?

I’ve made camera remotes before using an arduino board and an IR LED, but there are issues with getting a good range and the form factor is a little bulky.

The Tv-B-Gone is compact, effective and comes built with the ability to have 2 states making it an attractive option. The Tv-B-Gone is about $10 cheaper than a brand name wireless release with the added bonus that you can fuck up TVs. Plus, the Tv-B-Gone was built to be a universal remote and it would be fairly easy to extend it to trigger many cameras. Right now my model only triggers Nikon cameras but it would be really easy to add others.

Unfortunately, most cameras need to be set to “remote” mode for this to work, so it’s not like you’re going to be triggering other people’s cameras – at least not to my knowledge. A guerrilla camera tool would be fantastic, but I don’t think it’s feasible.

1. Adding the Nikon code

The first step was determining the IR Code that would trigger my camera. When I built the arduino version of the shutter release, I used Lucky Larry’s arduino intervalometer code, which includes the timing I needed.

Armed with the timing information, I downloaded the source code and read Lady Ada’s notes on the TV-B-Gone.

The program on the TV-B-Gone microcontroller cycles through about 115 known TV “power” codes. Each signal code is a series of very fast flashes of infrared light generated by an IR LED on a remote. These patterns of on and off times are chosen to try to avoid triggering the wrong devices. A camera’s wireless shutter release remote operates the same way.

For the Nikon wireless shutter the times look like this, in microseconds:
2000 on, 27850 off,
390 on, 1580 off,
410 on, 3580 off,
400 on, 63200 off

This signal is sent twice every time the shutter is meant to be “released”.

With the TV-B-Gone, the TV codes have been compressed to fit as many as possible on the ATTINY85V chip. Fortunately, Lady Ada describes how this happens well enough for me to do the same conversion by hand:

  1. I converted Lucky Larry’s times from microseconds to the appropriate unit by dividing by ten – I don’t think there is a name for that unit, but it’s the value used in the source code.
    const uint16_t code_nikonD90Times[] PROGMEM = {
    200, 2785,
    39, 158,
    41, 358,
    40, 6320,
    };
  2. I described the new value as an index in an array of on/off pairs. e.g. [0, 1, 2, 3]
  3. and converted that index value to binary: [00, 01, 10, 11]
  4. I converted those binary values to bytes and then to hex and doubled them to send the signal twice: 0x1b
  5. const uint16_t code_nikonD90Times[] PROGMEM = {
    200, 2785,
    39, 158,
    41, 358,
    40, 6320,
    };
    const struct IrCode code_nikonD90Code PROGMEM = {
    freq_to_timerval(38400),
    8,             // # of pairs
    2,              // # of bits per index
    code_nikonD90Times,
    {
    0x1B,
    0x1B,
    }
    };

I then created a .hex file with the new code added.

2. Programming the TV-B-Gone with a USBTinyISP

The next step was to program the chip with the new .hex file. This process should involve plugging the TV-B-Gone into my laptop using a USB Tiny ISP programmer and software like AVRDUDE. (Tutorial here) Unfortunately, AVRDUDE wouldn’t recognise my TV-B-Gone.

A quick search (here) seemed to suggest that the LEDs draw too much power and might interfere with the chip being recognised. The only suggestion was to disable the resistors or LEDs to program the board. I decided to continue testing and in the process accidentally blew out all four LEDs by using the USBTinyISP power and battery power at the same time. Luckily, this allowed the board to be recognised!

I made a quick trip to Creatron and picked up new IR LEDs and started again. I got the board programmed and the TV-B-Gone worked for both my camera and TV! Hooray!

3. Camera or TV/Camera mode

I decided to make one more mod to the TV-B-Gone.

The board allows you to solder a jumper to control whether it uses North America or European codes. I ditched the European codes and opted to add a camera only mode by soldering a tiny “ON” switch (or is it “NO”?) in place of the jumper. The switch sandwiched nicely between the existing switch and a capacitor. I figured it would be easy to remember “On” is for the camera mode since it’s called a Camera-B-On.

Unfortunately, I had reinstalled the working LEDs. This meant that I wouldn’t be able to program the TV-B-Gone anymore. To deal with this, but not wanting to solder another switch to the board, I created a “detachable joint” jumper>resistor connection as pictured below to purposefully break the board when needed and allow me to reprogram:
Camera-B-On detachable joint

Here’s a self portrait from the above video; I guess autofocus doesn’t work:
Self Portrait

Future Revisions

The obvious next steps for the Camera-B-On is to add intervalometer functionality and support more camera brands. Intervalometers allow photographers to do time lapse. The fact that cameras don’t come with Intervalometer functionality built in baffles me – it would be so easy to add.

Here’s the arduino version I built a while ago:

This entry was posted in Projects. Bookmark the permalink.

3 Responses to Camera-B-On TV-B-Gone

  1. Laura says:

    Nice one, Christopher. So great to make your own shutter remote!

  2. Marc Pelland says:

    impressive.. can’t wait to see it with more cameras programmed

  3. Pingback: TV-B-Gone can double as a camera remote control - Hack a Day

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>