Golf GPS

After a few years of golfing, although my score is still not very good, I found that knowing the distance to the hole and how far I hit with the club helped me to choose a club better. There are commercial products to do this, but I wanted to make one for myself.

I have searched for small enough components to fit in a small plastic box (45mm x 30mm x 11mm inside) for golfing. Here is the list of the components for the gadget.

  • Plastic box: Hammond 1551F
  • GPS: PA6C
  • Display: OLED 128×64, I2C
  • Battery: LiPo 150mAh
  • Two push button switch with a little high actuation force to avoid accidental press
  • Microcontroller: Arduino bootloader (internal oscillator, 8MHz) loaded ATmega328p TQFP
  • Battery charger: MAX1555
  • PCB: 0.8mm thick with 2oz copper, designed with Eagle, used OSH Park to make 3 boards

The functions and requirements I thought about the gadget are listed below.

  • When powered on
    • Display date and time
    • If you are moving faster than 3km/h (like driving or walking), shows speed and bearing
    • Menu is ready to start playing golf
  • Before starting
    • Choose a course to play
    • Select starting hole, front or back
  • Display following information while playing golf.
    • Hole number
    • Current time
    • Distance to the hole (center of the green) in yard
    • Distance from the last shot (to see how far I can hit with the club I used) in yard
    • Total number of shots
    • Number of shots for current hole
  • Automatic advance to the next hole
  • Change hole to play manually at anytime in case you need to skip a hole or the automatic advance didn’t work properly (for example, you moved around the green back and forth to find the ball or forgotten club or whatever)
  • Subtract a shot from the total number of shots in cases of a shot added by mistake
  • Battery should last at least 5 hours
  • Two push button switches for menu and select
  • Programming port for improving the program, adding new course data, and battery charge
  • When the battery voltage drops below 3.5V, replace time on screen with “LOW”

Once I get a chance to play, I will find more functions to add (or remove). Hopefully it gets warmer soon.

So, here is the schematic diagram.

JeonLab golfGPS

Here is a little story about my experiences with the PCB fab houses. I used to order my PCBs to Seeedstudio. It was a few years ago when I ordered the PCB from there and the shipping fee was inexpensive although it took a little longer for delivery. Late last year, my son designed his first PCB and I helped him to order the PCB. I have also used OSH Park some time ago, so I compared the services between Seeedstudio and OSH Park. Since the PCB size was a little big (few inches by few inches), so I picked Seeedstudio which was cheaper. But later, I found they don’t offer regular mail to Canada anymore. They only offer express shipping options. That was even more expensive than for the PCB itself, but I wanted my son to get the board as quickly as possible, so ordered the parts to Seeedstudio. Later I found I needed to pay brokerage charge for custom. Bad bad experience. I will never use them anymore. Compared to them, OSH Park is amazing. For this small size PCBs, I paid just about $10 with free shipping to anywhere in Canada and US. It also took less than 2 weeks.

Here is the picture of the PCB. I don’t really like purple, but purple is their default color. But the color is not that important anyway.



And some pictures of assembled.



The plastic housing material is transparent with blue tint, but the surface is not smooth and has some texture. So, I had to sand the surface for better visibility for the OLED display. As you can see in pictures below, there is no problem to read numbers.



I was planning to add a micro SD card reader so that I can enter new course coordinate data from my laptop by simple text editing. But I changed my mind. First, there is no more space in the package for the SD card reader. Secondly, I won’t need to add new courses that often. Currently I have 4 courses around my place in the program. The 18 hole coordinate data is stored as 3 dimension array with float type. So, it will take only 144bytes (4bytes x 2 (latitude and longitude) x 18holes) per course. The compiled program occupies about 61% of the program storage area and there is still over 11kbytes.

For the OLED display, I used the library from Rinky-Dink Electronics. I’d like to thank him for sharing the library. It’s very small and fast. I also used the fonts found from his website and modified a little bit for narrower size.

I wrote my own GPS data parsing function. It reads only GPRMC data and parses date, time, and coordinate. I have used this parsing function previously in this post.

Regarding the distance calculation, I have developed a simple formula some time ago. It works pretty well even for short distance. See this post for more detail.

You can download the Arduino code here. You can freely use/modify it for your own projects under GPL-3.0 license. If you have any questions, email me or leave a comment below.


Binary golf shot counter

I have never liked to either play or watch any sports. A few years ago, there was a golf outing at work when I have ever tried golf for the first time. Golfing became one of my favorite things to do since. Well, I’m still playing over 100 and my non-athletic body does not cooperate very well. But I have no plan to take any class or get a coach for better play. I just enjoy to think about how to improve my swing, angle, balance, and steadiness. I have no intention or any possibility to become a professional golfer. All I want is to go out on a nice and sunny day with my wife and enjoy the time.

So, as you can imagine, I often forget how many shots I played during the game. If you are really good and can play no more than bogey, you may be easy to count how many shots you played. But that’s not the case for me. Many times, I asked myself, “was that the third or fourth?”

I have searched for golf shot counter, and for sure, found a lot of different type of counters, from beads on a string, plastic dial, to a fancy digital one with LCD displays. But none of them attracts me and thought I would design one with simple portable electronics.

At first, I thought about using one of those ATtiny chips with a small LCD. But all I need is a button switch to add 1 to the total number and show the number when I want to see it. So the ATtiny chip with the LCD sounded like overkill. And then I thought about binary display with a few LEDs. If I have 4 LEDs, it can show up to 15 which is more than I need (I’m not THAT bad). 3 LEDs might be too small because it can count only up to 7. Considering when I play triple bogey or worse for par 5 hole, I will need at least 8 or more. So, 4 LEDs it is.

Now, how to make a binary counting circuit was the question. I immediately thought about a flip-flop circuit which is a basic calculator and memory element. If I have 4 of those and connect the output to the next one, that can make a binary counter. Wait a minute… there is a binary counter chips already. I don’t need to make one myself. So I ordered a part from Digi-key and that part is SN74HC393. This one has dual 4 digit binary counters, but I would use only one of them.

As soon as I got the part, I connected switches and LEDs and checked if it works fine and found I need a debouncer for the SHOT button switch. That was fixed easily with a Schmitt trigger with a resistor and a capacitor.

Below schematic is the final circuit diagram.


I ordered the PCB and will post the result as soon as it’s ready to show.


GPS distance measurement between two coordinates using Arduino

I knew the dimension of the LCD (Nokia 5110) as 43mm x 43mm but it looked smaller than I thought.  That’s good because I want to put it on top of the GPS (Holux M-1000).

In my previous post, I explained how to get coordinates, date & time, speed, and bearing data from GPS, Holux M-1000.  Now that I have the LCD, it’s time to add two parts to the Arduino sketch: 1) LCD driver/display, 2) distance calculation between two locations.

1. LCD Driver

First of all, I searched for a simple and small library for the LCD, Nokia 5110. There were a few different libraries for this LCD: Adafruit’s, Sparkfun’s, and Henning Karlsen’s.  Among these libraries, I chose Henning Karlsen’s because I needed only simple text display with a couple of different font sizes.  Henning Karlsen has separate library for graphics as well.  I would like to thank Henning for his sharing his nice work on the library.  Henning’s library supports 3 different font sizes: SmallFont (text and number, 6×8), MediumNumber (number only, 12×16), and BigNumber (number only, 14x 24).  Only downside of this library is that the Medium and Big fonts do not support texts but only numbers. However I would need only numbers to display with bigger fonts, this limitation was no problem with me.

2. Distance calculation between two locations

There are number of websites showing how to calculate distance between two locations from latitudes and longitudes. Movable Type Scripts shows various  calculations of distance, bearing and other useful conversions using Haversine formula and BlueMM posted the Excel formula to calculate distance which is basically the same way as Haversine.

The calculation is quite straightforward but I found there was a problem: Arduino (Atmega328p) cannot handle over 6-7th decimal digits which is very important in trigonometric calculation for short distance.

Arduino reference page says “Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.”

Let me give you an example.  Suppose we started from a position A (lat: 40.00, long: 80) to a position B (lat: 40.01, long: 80.00). That is, we moved 0.01 degrees in latitude only. If you calculate the distance using Haversine formula on your PC, you will get about 1,111.9m. However, Arduino calculates it as 3,110.8m. Big error!  More interesting thing is that even if you reduce the latitude difference to 0.001 or 0.0001 degrees, you get the same results, 3,110.8m. So I investigate further what exactly cause this error. Of course I know the culprit is the float precision limitation as said above. But I wanted to know which part of the calculation by Arduino cause this big error. In the Haversine formula, there are COS, SIN and ACOS functions used.  I tested a few different calculations using these functions and found the calculation of COS and SIN functions affect minimal but the problem was the ACOS.  If you calculate the formula on your PC only inside of ACOS bracket, you will get 0.9999999848. See my point? The decimal places below 6th in ACOS function is actually important to calculate the angular difference for small distance, but unfortunately Arduino cannot handle this.  Not only for small distance but for even relatively long distance (say over 1 degree for instance) there is error between the results on the PC and Arduino.

Well, so I started thinking about how to avoid trigonometric function calculation when over 6th decimal places are important. And I found a solution! Instead of calculating angular difference between two positions and THEN calculating the distance by multiplying the mean earth radius, calculating a ratio of angle between two positions (latitude and longitude separately) over 360 degrees and divide the circumference of the earth by this ratio. In other words, keep the numbers big while calculation. Arduino’s float type has a limitation on the small decimal places, but can handle relatively big numbers!

Here is my formula:

The mean circumference of the earth is 2 x 6,371,000m x π = 40,030,170m

Δd (lat) = 40,030,170 x ΔΘ (lat) / 360 (assuming ΔΘ is small)

Δd(long) = 40,030,170 x ΔΘ(long) x cosΘm / 360 (Θm: mean latitude between two positions)

Now, the distance is √[Δd (lat)^2 + Δd (long)^2]

Below is the test Arduino sketch to test my formula.  The result is 11.029m while Haversine formula for the same coordinates gives 11.119m.  This is close enough considering the accuracy of the most GPS is bigger than one meter.

float gpsLat0 = 40.0;
float gpsLat = 40.0001;
float gpsLong0 = 80.0;
float gpsLong = 80.0;

void setup()
float delLat = abs(gpsLat0-gpsLat)*111194.9;
float delLong = 111194.9*abs(gpsLong0-gpsLong)*cos(radians((gpsLat0+gpsLat)/2));
float distance = sqrt(pow(delLat,2)+pow(delLong,2));

void loop()

To be continued….

GPS (M-1000) with LCD (Nokia 5110)

Finally, I got the Nokia 5110 LCD that was ordered on eBay a few weeks ago. It took me a couple of days to find the best library for the LCD and quickly updated my Arduino program to display current location (latitude and longitude), date/time, speed, and bearing. There is 2.8V regulated power in the GPS that powers the JeonLab mini and LCD. I will upload my sketch and full detail later.

 photo GPSwithLCD5110_currentlocation.jpg

GPS (Holux M-1000) signal read using Arduino 1: coordinate/bearing/speed and UTC

Holux M-1000 is a GPS receiver with a Bluetooth.  I had used it for navigation with Palm TX and Treo700p (yes, I have long been a big fan of Palm PDA series) and Geocaching until I bought Android smartphone which has a built-in GPS module. So Holux M-1000 has been in my drawer collecting dust for more than a year. From last summer, I began to play golf and I think I’m getting better. 🙂  I searched and found a lot of Android applications for assist golfing with maps, hole/hazard information, showing how many yards left and so on. I’m a gadget mania so I downloaded most of them and tried but none of them satisfied me.  In most of cases, I didn’t bother to pull out my phone and enter my password to unlock the phone and go to the application and run and wait.  Well, one might say that why not keep the phone ON while you are playing? Yes, you can do that. But the GPS module drains battery so fast and I don’t want to miss any phone calls because of the low battery.  Not only because of the battery consumption, I can’t find any application fits me (yet). So I thought I would like to have a GPS module, very simple module, that can show distance between two locations. For example, at a tee, the first location can be marked by pressing a button on the device and from that point, the device shows how far I moved while I walk to the spot for the second shot. And then I can push another (or the same) button to clear the first point and mark current spot as the first location and do the same, and so on. What parts would I need for building this device?  Here is the list of the part I noted.

  • GPS module that can communicate with Arduino (or Jeonlab mini, of course 🙂
  • LCD: I have a 16×2 LCD but it’s bulky and shows only two lines. I have ordered popular Nokia 5110 LCD on ebay and I’m waiting for it as of this writing.
  • Arduino compatible board (preferably small)
  • Power (battery for sure)
  • some resistors, caps, wire, prototyping board, push button switches etc.

That’s when I remembered my old gadget, Holux M-1000.  It has a bluetooth which means it should have serial output somewhere between the GPS module and the bluetooth module.  I started opening up the Holux M-1000 and found RX… TX… on the PCB. YES!!  But I needed to know what voltage requirements for these pins. So I searched on internet for a datasheet or instruction manual of Holux M-1000 and found there were already some people tried to read GPS signal from the Holux M-1000 using either Arduino or PIC microcontrollers. Maybe I was not very lucky to find good articles but none of them were quite useful to give me answers what I wanted clearly.  I found the User’s Manual (1371865.pdf) from Holux homepage and I got very important information as below.

  • Pin 4 and 3 on the USB mini B connector on Holux M-1000 are TX and RX (so I don’t have to add wires from the PCB. That’s good news to make my life easier. In fact, I had thought the USB jack is only for charging the battery!)
  • Pins 5 and 1 of the USB connector are Vcharge (5V) and GND, respectively as standard USB pinouts.
  • Those two RX and TX pins’ voltage range is 3.3 – 5V
  • Data format: NMEA0183 V3.01, GGA, RMC, VTG, GSA, GSV
  • Power consumption: 40 – 50mA in normal mode, 35mA in power saving mode

Now, I’m not familiar with NMEA data format, so I searched on internet again and found some good sites here and there. There are bunch of GPS information you can get from sentences that Holux M-1000 generates periodically as GGA, RMC, VTG, GSA, and GSV, but I don’t need all of them. All I need is latitude and longitude actually, but additional information such as time and date, bearing, speed will be good to know as well.  The sentence, RMC has all of these. Well, program might be simple if I needed to read data from only one sentence, then.  photo Holux-Jeonlab.jpg The GPS (Holux M-1000) and the Jeonlab mini v1.3 with an FTDI breakout board are shown above. I have USB A to mini-B cable but I didn’t want to cut the cable, so I used a female USB-A connector as shown below. Note that only 3 pins (V+, GND, and TX from GPS) are used since I only need to read serial data from the GPS, not sending any command or data to it.  photo USBpinout.jpg And the picture below shows how they connected each other. The FTDI breakout board is connected to my computer through USB cable.  photo Holux-Jeonlabconnection.jpg While I’m testing, I need serial communication between the Jeonlab mini and my computer and I will need these pins (RX, TX on the Jeonlab mini) later when I want to modify my program.  So I decided to use the Softwareserial library which is already included in the Arduino libraries. The TX pin from the GPS is connected to the pin 10 of the Jeonlab mini.  I also connected the V+ from the GPS to the Vcc pin of the Jeonlab mini as well as GND pins. In fact, you don’t need to connect the V+ pins as long as they are powered up by their own power source, but this way I can continuously charge the GPS battery from my computer USB port. I will need more time to finish the whole program while I’m waiting for the LCD that I bought, but let me show how I have programmed so far.  It can read RMC data from the GPS and get the coordinate, bearing, speed, date and time. Thanks to ‘serial parse’ function that is included in the Arduino version >1.0, it was easy to get numeric values from the serial data coming in from the GPS. However, one tricky thing was to get the local time from UTC time and date. I had to consider time zone, DST(daylight saving time), number of days of each month, leap year, etc. That was fun to figure out how to get correct time and date. Here is my code so far. I guess it is quite straight forward, but if you have any question, please add a comment below.

 GPS distance measuring
    - GPS: Holux M-1000
    - Arduino: JeonLab mini v1.3
    - LCD: Nokia 5110
 Programmed by: Jinseok Jeon (
 Date: Sep 2013
 Revised: Oct 28, 2013

#include <SoftwareSerial.h>
SoftwareSerial gps(10, 0); // RX, TX

const int TimeZone = -5; //EST
int DSTbegin[] = { //DST 2013 - 2025 in Canada and US
  310, 309, 308, 313, 312, 311, 310, 308, 314, 313, 312, 310, 309
int DSTend[] = { //DST 2013 - 2025 in Canada and US
  1103, 1102, 1101, 1106, 1105, 1104, 1103, 1101, 1107, 1106, 1105, 1103, 1102
int DaysAMonth[] = { //number of days a month
  31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
int gpsYear;
int gpsMonth;
int gpsDay;
int gpsHour;
byte gpsMin;
byte gpsSec;
//float distance;
float gpsLat0;
float gpsLong0;
float gpsLat;
float gpsLong;
float gpsSpeed; //km/h
float gpsBearing; //deg
boolean LEDstate = false;
boolean SpeedWatch50;
boolean SpeedWatch70;
boolean SpeedWatch120;

#include <LCD5110_Basic.h>

LCD5110 LCD(6, 5, 4, 2, 3); //SCLK, MOSI/DIN, DC, RST, CS/CE
extern uint8_t SmallFont[];      // 6x8 pixels
extern uint8_t MediumNumbers[];  // 12x16 pixels
//extern uint8_t BigNumbers[];     // 14x24 pixels

void setup()
  pinMode(8, OUTPUT); //LED
  digitalWrite(8, 1); //LED off
  pinMode(7, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  LCD.setContrast(70); //0-127, you need to find proper number
  LCD.print("JeonLab", RIGHT, 16);

void loop()
  int a1, a2, b1, b2;
  if (gps.available() > 1)
    if (char( == 'R' && char( == 'M' && char( == 'C')
      gps.parseFloat(); //discard unnecessary part
      a1 = gps.parseInt();
      a2 = gps.parseInt();
      b1 = gps.parseInt();
      b2 = gps.parseInt();
      gpsLatLong(a1, a2, b1, b2);
      gpsSpeed = gps.parseFloat() * 1.852; //knot to km/h
      gpsBearing = gps.parseFloat();
      if (gpsYear % 4 == 0) DaysAMonth[1] = 29; //leap year check

      //Time zone adjustment
      gpsHour += TimeZone;
      //DST adjustment
      if (gpsMonth * 100 + gpsDay >= DSTbegin[gpsYear - 13] &&
          gpsMonth * 100 + gpsDay < DSTend[gpsYear - 13]) gpsHour += 1;
      if (gpsHour < 0)
        gpsHour += 24;
        gpsDay -= 1;
        if (gpsDay < 1)
          if (gpsMonth == 1)
            gpsMonth = 12;
            gpsYear -= 1;
            gpsMonth -= 1;
          gpsDay = DaysAMonth[gpsMonth - 1];
      if (gpsHour >= 24)
        gpsHour -= 24;
        gpsDay += 1;
        if (gpsDay > DaysAMonth[gpsMonth - 1])
          gpsDay = 1;
          gpsMonth += 1;
          if (gpsMonth > 12) gpsYear += 1;
      LCD.clrRow(0);//8 pixel high row to clear (0-5)
      LCD.printNumF(gpsSpeed, 0, LEFT, 0); //km/h
      if (gpsSpeed > 2)
        LCD.printNumF(gpsBearing, 0, RIGHT, 0); //bearing in degree

      LCD.printNumI(gpsMonth, 0, 24, 2, '0');
      LCD.print("-", 12, 24);
      LCD.printNumI(gpsDay, 18, 24, 2, '0');
      LCD.print("-", 30, 24);
      LCD.printNumI(gpsYear, 36, 24);

      LCD.printNumI(gpsHour, 54, 24, 2, '0');
      LCD.print(":", 66, 24);
      LCD.printNumI(gpsMin, 72, 24, 2, '0');

      if (gpsLat0 != 0.0)
        float distLat = abs(gpsLat0 - gpsLat) * 111194.9;
        float distLong = 111194.9 * abs(gpsLong0 - gpsLong) * cos(radians((gpsLat0 + gpsLat) / 2));
        float distance = sqrt(pow(distLat, 2) + pow(distLong, 2));

        LCD.clrRow(4);//8 pixel high row to clear (0-5)
        LCD.printNumF(distance, 0, LEFT, 32);
        LCD.print("meter", RIGHT, 32);
        LCD.printNumF(distance / 0.9144, 0, LEFT, 40);
        LCD.print("yard", RIGHT, 40);
      if (gpsSpeed <= 50) SpeedWatch50 = 0;
      if (gpsSpeed <= 70) SpeedWatch70 = 0;
      if (gpsSpeed <= 120) SpeedWatch120 = 0;

      if (gpsSpeed > 50 && SpeedWatch50 == 0)
        SpeedWatch50 = 1;
        tone(11, 4978, 100);
      if (gpsSpeed > 70 && SpeedWatch70 == 0)
        SpeedWatch70 = 1;
        for (int i = 1; i <= 2; i++)
          tone(11, 4978, 100);
      if (gpsSpeed > 120 && SpeedWatch120 == 0)
        SpeedWatch120 = 1;
        for (int i = 1; i <= 3; i++)
          tone(11, 4978, 100);
  if (digitalRead(12) == LOW) //marking current position
    tone(11, 3140, 100);
    if (gpsLat0 == 0.0)
      gpsLat0 = gpsLat;
      gpsLong0 = gpsLong;
      gpsLat0 = 0.0;
      gpsLong0 = 0.0;
  if (digitalRead(7) == LOW) //LED backlight toggle
    tone(11, 2810, 100);
    digitalWrite(8, LEDstate); //LED on
    LEDstate = !LEDstate;
  if (digitalRead(9) == LOW) //for future functional button
    tone(11, 3910, 100);


void gpsTime(long UTC)
  gpsHour = int(UTC / 10000);
  gpsMin = int(UTC % 10000 / 100);
  gpsSec = UTC % 100;

void gpsLatLong(int lat1, int lat2, int long1, int long2)
  gpsLat = int(lat1 / 100) + (lat1 % 100) / 60.0 + float(lat2) / 10000.0 / 60.0;
  gpsLong = int(long1 / 100) + (long1 % 100) / 60.0 + float(long2) / 10000.0 / 60.0;

void gpsDate(long dateRead)
  gpsDay = int(dateRead / 10000);
  gpsMonth = int(dateRead % 10000 / 100);
  gpsYear = dateRead % 100; //last 2 digits, e.g. 2013-> 13

TV-B-Gone mod for battery saving and region/range selection

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.

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.
simple TV-B-Gone with supercaps

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.

I also tried v1.2 on a tiny bread board as shown below.

TV-B-Gone on breadboard

I haven’t taken a picture, but on the breadboard shown above, I added a 8MHz ceramic resonator and uploaded v1.2 firmware on an ATtiny85V-10 and found it can last double the time. 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).

I have thought about to turn off the device before the full cycle finished. I thought about to add a power switch but that wasn’t very attractive to me.

A couple days ago, I suddenly got a good idea to utilize the Region Detection pin6. Once the program detects the region from the level of pin 6 (float (internal pull-up): US, pull-down: EU), it is not used until all the code 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 is the schematic for the US version. I also added a slide switch to select IR LEDs between 2 wide but short ones and 1 narrow but long beam LED.

TV-B-Gone JeonLab Mod-US

And EU version:

TV-B-Gone JeonLab Mod-EU

If you want to have both in hand like me, you can use following design with a DPDT slide switch to change region.

TV-B-Gone JeonLab Mod-Uni

More updates will be followed.

If you want to buy an ATtiny85v-10 chip with this modified firmware loaded, send me an email with your location.  It will be $5.00 + shipping.

The full kit will be ready soon, too.


USB chargeable flashlight & circuit tester with charge indicator LED

This is another supercap (super capacitor) application. I like supercaps. Although it can hold much smaller charge than rechargeable batteries and a little bit expensive, it can be charged extremely quick (about 30 seconds through USB for 2x 2.5V, 10F), light, and has no memory effect. If the load is not very heavy, you can use it for many applications as a power source.

I used the small blue box that I have introduced for the Wii nunchuck mod and the JeonLab mini v1.0.  The inside of the box is just big enough for 2 supercaps and other parts. What I’d like to make with this box and the supercap is handy, portable, and quick USB chargeable LED flashlight AND a simple circuit tester (beeps when two probe touch a closed circuit like the one of the multi-meter functions). I also wanted to include a charge-complete indicator LEDs.

Not very critical but exciting part was the charge-complete indicator. At first, I thought I could use an NPN transistor, two resistors for a voltage divider to turn the transistor on and off (by the level of charge), and an LED (connected to the  collector and the emitter).  But I couldn’t find proper resistor combination from what I had. I didn’t want to add a variable potentiometer in such a small box. So I searched on internet to find better and simpler voltage indicator and found this post from a forum called ModRetro, written by Daftmike, and found his circuit for low voltage indicator is very similar to my design except for another LED to indicate the power which is connected to the emitter of the transistor and ground. I quickly added an LED and found a good resistor combination (2.2k and 3.3k for my case) with this additional LED. Adding an LED simply solved my problem.  I’d like to thank him for sharing the circuit idea.

Anyway, here is the whole circuit diagram.

USB light n tester

I have added a schottky diode (1N5818) to prevent discharge of the supercaps when they are not charging. There is about 0.5V of voltage drop across the diode, but it is fine for this kind of circuit to light an LED or beep a piezo buzzer. It is not necessary to be exactly 5V.

Here is a picture of parts before assembling.

supercap light & tester parts

Part list:

  • supercap: 2.7V(2.5V is fine as well), 10F x2
  • LEDs:
    • white: high intensity, 3V, 5mm
    • red: 3mm, 10mA, 2V
    • green: 3mm, 10mA, 2.1V
  • transistor: 2N3904
  • schottky diode: 1N5818
  • resistors:
    • 2.2k, 1/4W
    • 3.3k, 1/4W
    • 100, 1/8W x2
  • piezo buzzer: 2.73kHz, 5V, 9.6mm
  • slide switch: small
  • mini-B USB female connector
  • 2-pin socket (any)
  • blue box (Hammond 1551F, ABS)

Here are some pictures showing my tests to see what voltages for each stage.

1. Discharged, unplugged from USB (both red and green LEDs are off)
supercap light prototype_unplug n discharged

2. Charging, plugged (both LEDs are on)
supercap light prototype_charging

3. Charge indicating LED (red) is almost off at 4.6V
supercap light prototype_charging RED off

4. about 30 seconds after plugged in, it is 4.75V (red LED is completely off)
supercap light prototype_full charge

With USB, after it reaches about 4.8V, it takes long time (more than 10-15 minutes) to approach to 5V. Maybe impossible.  I just didn’t have enough patience to wait hours to see if the USB can charge this up to 5V. 😉  But if you plug it in to 5V, 1A wall adapter, it is much faster (less than 5 seconds) to reach this point and even charged to over 5V.

Here is a picture showing the inside of the fully assembled ….. hmm what should I call it… JeonLight maybe? 🙂

IMG_0014 (Large)

As for the circuit tester, you can connect any solid wire (about 20-18 AWG) or long header pins.

Some pictures with lights on.
IMG_0018 (Large)

IMG_0025 (Large)

IMG_0024 (Large)

There are some more detail pictures on my Flickr photo library.

Should you have any questions or comments, please leave a comment below or send me an email.