Battery Saving TV-B-Gone With Region/range Selection Switches

22,307

133

92

Published

Introduction: Battery Saving TV-B-Gone With Region/range Selection Switches

About: A human wanting to have wings to fly...

What is the TV-B-Gone?
TV-B-Gone is a small gadget that can turn on and off virtually any TV in the world developed and sold as a kit by Adafruit. They also provide the source code and compiled firmware under Creative Common Share Alike license.
I would like to thank original developers at Adafruit for this great work and sharing ideas before starting showing my modification.

First trial
At first, I downloaded the firmware v1.1 and flashed an ATtiny85-20 and made it with only one transistor and two wide angle IR LEDs with two supercaps as shown below. The switch is connected to the supercap + so it will beam only when you press the button.  It worked fine, but the problem was it drained the supercaps too quickly. The first reason is, of course, low capacity (compared to batteries) of the supercaps, but there are other reasons, too. I didn’t have a resonator at 8MHz, so I burned the oscillator selection fuse bit of the ATtiny85-20 as internal 8MHz. The internal oscillator has benefits of omitting an external component and programmable, but there are serious down side; its frequency can be unstable and varies depending on the temperature and power supply, AND it consumes more power at high frequency settings.

After this first trial, I added a 8MHz ceramic resonator and uploaded v1.2 firmware on an ATtiny85V-10 and found it can last double the time than ATtiny85V-20 using internal oscillator. One full cycle of pulsing all the codes takes a little less than a minute and with this latest testing configuration, more than 30 times of full cycle worked with 2 supercaps before the voltage dropped below 1.7V (two in series).

Need to save battery
I have thought about to turn off the device before the full cycle finished once it either turn on or off a TV. Adafruit's firmware database is designed as the codes for popular TV models emits first.  So in most cases, long before it emits all the codes, my target TV is turned on or off.  I thought about to add a power switch but that wasn’t very attractive to me.

Idea and solution!!
A couple days later, I suddenly got a good idea to utilize the Region Detection pin (pin6 of the ATtiny85v). Once the program detects the region from the level of pin 6 (float (internal pull-up): US, pull-down: EU), it is not used any more until all the codes pulsing is finished. So, in US mode for example, after it started pulsing and when you want to stop it, forcing the pin6 to ground will exit the do loop in software and the device will go sleep. I tested both US and EU mode with modified code and worked fine. This way, you can save battery.

Here in this introduction, I included a picture of the assembled TV-B-Gone JeonLab, but the circuit, which will be shown and explained step by step, is quite simple, so you may be able to assemble one on any prototype board or even on a bread board. 



Step 1: Circuit Modification

The original design of the TV-B-Gone by Adafruit uses the pin 6 of ATtiny85v as region detection.  With a 10k pull-down resistor connected to the pin 6, the device generates codes for European TV models. Otherwise, floating the pin 6, it works for North American models and most Asian models as well. 

There are three circuits showing in this step: North American (US) models only, European (EU) models only, and all-in-one model with region selection switch.

The PCB I made and showed in the Intro section is the all-in-one model.

As you can see in the circuit diagram, the NA (or US) model has no pull-down resistor on the pin 6.  When you successfully turn on or off a TV in the middle of code generation (the visible LED blinking), simply push the button S2 will pull the pin 6 to the ground and the firmware will stop the process and go to sleep mode which doesn't consume the battery.

However, in EU model, the pin 6 is grounded by the pull-down resistor, R3, 10k, always.  But pulling up the pin 6 by pressing the button S2 and connect to Vcc, the modified firmware will stop the process and sleep.

The UNI (all-in-one, NA+EU) model simply has both in one by adding a slide switch.

Step 2: Parts

Here is the parts list for the UNI model.

- ATtiny85V-10 with firmware: x1
- 8pin DIP socket: x1
- 8MHz ceramic resonator with built-in capacitors: x1
- Narrow beam IR LED (20 degrees, 940nm): x1
- Wide beam IR LED (34 degrees (or 40) , 940nm): x2
- Slide switch (DPDT): x2
- NPN transistor (2N3904): x3
- PNP transistor (PN2907, 800mA): x1
- 3mm LED (green or red): x1
- Resistor (1k): x2
- Resistor (10k): x1
- Tactile switch: x2
- Bread board or prototype board or you can buy the PCB from me

Step 3: Firmware Modification

First of all, download the original firmware, v1.2, from Adafruit from this link.

Open the main.c from any text editor like Notepad and find the end of the DO loop where the 250ms delay before the next code generation.

          // delay 250 milliseconds before transmitting next POWER code
          delay_ten_us(25000);

Just before these lines, add these two lines (three lines including the comment starting with //).

         // exit do loop if REGIONSWITCH is pressed
         if ((region == US && !(PINB & _BV(REGIONSWITCH)))
         || (region == EU && (PINB & _BV(REGIONSWITCH)))) break;

Now it will look like this together.

         // exit do loop if REGIONSWITCH is pressed
         if ((region == US && !(PINB & _BV(REGIONSWITCH)))
         || (region == EU && (PINB & _BV(REGIONSWITCH)))) break;
      
          // delay 250 milliseconds before transmitting next POWER code
          delay_ten_us(25000);

Save and quit the text editor.

Now compile and create the .hex file and upload it to an ATtiny85v chip using your favorite programmer.
There are many commercial programmers but I have used one using the Arduino-ISP.  If you are interested, please visit my blog and see this post and this.

UPDATE: For those who are not familiar with AVR programming:
1. Download WinAVR (http://sourceforge.net/projects/winavr/files/latest/download?source=files) and install.
2. Browse into where the WinAVR is installed: Start-All programs-WinAVR-20100110 and run Progrmmers Notepad
3. Open the source code and edit
4. Open the MAKEFILE and edit it (follow instruction in the post from my blog: http://jeonlab.wordpress.com/2011/11/22/makefile-setting-for-the-attiny4585-programmer-with-jeonlab-mini-or-arduino/
5. Go to Tools menu and click [WinAVR] Make all to compile. If you have any problem with compiling, look closely this MAKEFILE.
6. Now I assume you already have any kind of programmer (not software but a physical device to put your Attiny85 chip and connect it to your computer such as the one I introduced (https://www.instructables.com/id/ATtiny-programmer-using-Arduino-ISP/) or DASA or any other commercial product.
7. Insert an Attiny85 chip on the programmer and plug it to your computer.
8. From the Programmers Notepad, go to Tools and click on [WinAVR] Program to upload the hex file.

Step 4: Assembling a Kit

Step 5: Power Source

As same as Adafruit’s original TV-B-Gone kit, my modified TV-B-Gone_JeonLab accepts any DC power source within 3-5V. The micro-controller, ATtiny85V, runs within 1.8-5.5V, but the IR LEDs consumes more power than the micro-controller, you need to keep the source voltage at least 3V.

Adafruit includes 2 AA battery holder in their kit, but I will not include any battery holder or connector in my kit in order to give more flexibility of choice of power source.  As long as the voltage of the source is within 3-5.5V, any battery or supercap can be used.  For example, 2-3 AA or AAA alkaline batteries, 3-4 rechargeable batteries like NiCd or NiMH, Li-ion (or Li-PO) rechargeable batteries or 2 of 2.5V (0r 2.7V) supercap (at least 10F).

I like supercaps. Even though they can not hold much charge compared to batteries, they can be charged quickly (less than a minute) through USB or 5V wall adapter and small and light.  So I decided to attach two supercaps to my TV-B-Gone_JeonLab.

The actual size of my modified PCB is slightly smaller than Adafruit’s which fits nicely at the back of 2 AA battery holder. Anyway, I figured someone would be interested in having supercaps as a power source and here is how I did.

First thing I did was to attach a male header a guide (plastic piece on one side) for assuring correct polarity of connection.  But this one was too tall compared to the other components.  So I cut the plastic guide and pins a little bit.  Using a small piece of double sided tap with foam two supercaps (2.5V, 10F) were attached to the bottom of the PCB and soldered in series together. In order for ensuring the supercaps in place securely, a thin cable tie was used. I cut one of those USB cable found from my junk box and attached female connector to the red (+) and black (-) wires of the USB cable.

Step 6: Test

With one full charge (about one minute), I could turn one of my TVs on and off more than 40 times from about 6.5m (21 feet) away. Of course I used STOP button right after it turned on (or off) the TV. It does save power!

Share

    Recommendations

    • Planter Challenge

      Planter Challenge
    • Woodworking Contest

      Woodworking Contest
    • Oil Contest

      Oil Contest
    user

    We have a be nice policy.
    Please be positive and constructive.

    Tips

    Questions

    92 Comments

    Hai ,

    What other transistor can I use instead of the 2N2907 please

    Kind Regards

    1 reply

    Any PNP bipolar junction transistor (BJT) having over 600mA of collector current will work.

    Hi i downloaded firmware1.2 from your link but it has in main.c regionswitch is it neccessery to add that // exit do loop if REGIONSWITCH is pressed

    if ((region == US && !(PINB & _BV(REGIONSWITCH)))
    || (region == EU && (PINB & _BV(REGIONSWITCH)))) break;

    3 replies

    If you downloaded the firmware from Adafruit's website (which is the link in my post here), you need to add those lines in the main.c.

    Hi I also read from your tutorial that attiny 85-20 runs at internal 8mhz and 85-10 runs external.I have a 85-20 so can I configure it to run at external 8mhz crystal/resonator

    Both can be configured for either internal or external oscillator. You need to set proper fuse bits for the configuration. Try to search for attiny85 fuse bit setting. You may also want to look at the datasheet (LINK), page 163 for maximum frequency vs voltage.

    What pnp resistor used for? i see several tv b gone design that just connected directly to npn transisitor, and how if i wanna get a longer range without considering battery life? hook up some more LEDs? and how? thanks

    1 reply

    The pnp transistor is for triggering the transistors for the LEDs. I also tried with npn transistors and it works fine. I just followed the same circuitry from Adafruit. Regarding the longer range modification, you need to calculate total current the IR LEDs will consume and pick a proper transistor (or power FET). I have seen those high power modification from here on Instructables. Try to search for high power TV b gone. Good luck and enjoy building one.

    Hi thank you for a great instructable.I have managed to create the make file in avr notepad and i didnt get any errors, but i dont know what to do next to get the code into attiny 85.Please can you give me a step by step guide to do so i am using usbisp and this will be my first attempt at using this device to programme a chip.

    5 replies

    Sorry, I haven't used the usbisp. Did you mean USBTiny ISP? If so, I believe adafruit.com has an excellent tutorial. See

    https://learn.adafruit.com/usbtinyisp/overview

    Hi i have managed to finally upload code to the chip (i think) well did not get any errors anyway,just waiting on resonator to arrive to test it out.I have a question regarding the fuses,do i need to change them in any way, it was a brand new chip and i have not made any changes to fuses i just uploaded the modified firmware.Also am i right in thinking that the LED on pin 7 will not light without the resonator in the circuit.I have built mine from your EU mod schematic.

    I'm glad you managed to upload the code. Did you use WinAVR or AVRdude? Anyway, if it is a brand new chip, you may need to change the fuses. For the TV-B-Gone with an 8MHz resonator using Arduino ISP, I use the avrdude command as below.

    avrdude -c stk500v1 -P com%1 -p attiny85 -b 19200 -U lfuse:w:0xfe:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m

    You will need to replace the programmer name stk500v1 with yours and the port com%1 with your connection..

    Thank you for reply, jes im sorry my mistake i am using usbasb

    Well, did you mean USBASP by usbasb? I'm not familiar with the programmer you are using, but try to follow the steps below with replacing the programmer name with yours in the MAKEFILE. You may want to contact the manufacturer of your programmer to find correct programmer name so that Avrdude can work properly.

    1. Download WinAVR (http://sourceforge.net/projects/winavr/files/latest/download?source=files) and install.
    2. Browse into where the WinAVR is installed: Start-All programs-WinAVR-20100110 and run Progrmmers Notepad
    3. Open the source code and edit
    4.
    Open the MAKEFILE and edit it (follow instruction in the post from my
    blog:
    http://jeonlab.wordpress.com/2011/11/22/makefile-setting-for-the-attiny4585-programmer-with-jeonlab-mini-or-arduino/

    5. Go to Tools menu and click [WinAVR] Make all to compile. If you have any problem with compiling, look closely this MAKEFILE.
    6.
    Now I assume you already have any kind of programmer (not software but a
    physical device to put your Attiny85 chip and connect it to your
    computer such as the one I introduced
    (https://www.instructables.com/id/ATtiny-programmer-using-Arduino-ISP/)
    or DASA or any other commercial product.
    7. Insert an Attiny85 chip on the programmer and hook it to your computer.
    8. From the Progrmmers Notepad, go to Tools and click on [WinAVR] Program to upload the hex file.

    hi!! im from argentina...and its hard to get some of the components, the oscilator for example... some body could help me?? i need the code for the arduino IDE to this TV-B-Gone whitout the oscilator...

    The circuit its the same right?

    I´m using a Arduino nano as ISP

    I have four Attiny85 20pu... and thats all!! no more buys outside the country, our government blocks all, no more adafruit, sparkfun, Techsupplies or Aliexpress for all the argentinian people... :(

    Please Help!!!

    1 reply

    You can use an internal oscillator. In order to do that, you need to change fuse bit (http://www.engbedded.com/fusecalc). However, the frequency of the internal oscillator varies with environment temperature and power supply voltage, so the device might not work properly.

    user

    hi, Sorry if iam out of topic
    does tv bgone work in asia?
    and sorry for my bad english

    1 reply

    I think the most of the asian TVmodels use the same ir codes as North American. Visit Adafruit.com for full list of applicable TV models.

    Im having trouble with the last part here. You said to make the changes, I did. Then compile and upload to the chip. what do we use to change the main.c into a .hex??? also once it is a .hex how do you program that using arduino-isp? ive sent arduino code to a attiny85 before but never a hex. Please let us know! Thanks!

    1 reply

    So you did make the changes in the programs which must be main.c, didn't you? And from WinAVR (if you don't have this, download it from http://sourceforge.net/projects/winavr/files/), you can compile and upload the .hex file directly to the ATtiny85 chip. But you need a programmer connected to your computer first. You can buy one from electronics shops (I just googled and found one at Sparkfun: https://www.sparkfun.com/products/11460) or you can make one. Try search "attiny avr programmer." You can also use your Arduino to upload .hex file. There are useful links in one of my blog post: http://jeonlab.wordpress.com/2011/11/20/jeonlab-mini-attiny-programmer-using-arduino-isp/ .