Search Results for: nb-5l

Canon NB-5L Batteries: Final Status

A friend now owns my trusty Canon SX230HS camera, but, given the restrictions on shipping lithium batteries, we agreed there was no point in transferring ownership of my nearly dead batteries.

For completeness, their final state:

Canon NB-5L - 2018-03-25

Canon NB-5L – 2018-03-25

The original Canon OEM battery (orange curve) looms above all the offerings from various Amazon sellers.

Searching for NB-5L will excavate many posts relating my misadventures, tests, and test fixtures:

NB-5L Holder - Coil spring - Fit layout

NB-5L Holder – Coil spring – Fit layout

Maybe I should build an astable multivibrator with a slip-in battery compartment.


Leave a comment

Canon NB-5L Battery Status

My pocket camera has begun kvetching about a low battery rather more often than before, which suggests the batteries I’ve been using since 2014 have gone beyond their best-used-by date.

This came as no surprise:

Canon NB-5L - 2017-08-05

Canon NB-5L – 2017-08-05

I re-ran a couple of the batteries to make sure they hadn’t faded away from disuse, which didn’t materially change the results. The lightly used Canon OEM battery continues to lead the, ah, pack.

The camera’s lens capsule accumulated a fair bit of dust from many years in my pocket, which lowers its overall contrast and wrecks the high f/ images produced with the microscope adapter.

Leave a comment

Wasabi NB-5L: Underperformers

Based on the poor performance of the NB-5L batteries I bought from Blue Nook, they sent me three NB-5L batteries from a fresh batch (date code BNI13) and I ran them through the same discharge test:

Canon NB-5L - OEM Wasabi - 2014-10-29

Canon NB-5L – OEM Wasabi – 2014-10-29

The red line off to the far right is the three year old Canon OEM battery, which remains far and away the best battery at 1 A·h.

The previous cells (BNF27) produced the three scattered traces with the lowest initial voltages, ending around 0.8 A·h.

The new cells (BNI13) produced the three tightly clustered traces. They have a higher initial voltage than the OEM cell, but much lower total capacity (about 0.75 A·h).

These batteries obviously don’t come close to their 1400 mA·h rating. The capacity depends on the load current, but I’m using 500 mA because that’s close to the camera’s drain; the results should correlate reasonably well with actual use.

The higher voltage from the new batteries will produce a longer runtime than the previous duds, but their total capacity is lower and they’re still no match for the old Canon OEM battery.

The new ones start out very similar to each other, but the previous batch hasn’t aged well on their shelf. If the date codes mean what I think, all of these batteries will fail quickly.

All that’s quite disappointing, because their NP-BX1 batteries for the Sony camera turned out quite well. The date codes all have the same format and typography, so I think they come from the same factory.

For whatever it’s worth, I think the date coding works like this:

  • B – factory? shift? OEM? Blue Nook?
  • M – last two digits of year: M=13, N=14
  • K – month: F=6, I=9, K=11
  • 20 – day 

For the four batteries / lots I have on hand:

  • BMK20 = 2013 Nov 20 – NP-BX1 bought in early 2014
  • BNI18 = 2014 Sep 18 – NP-BX1 bought in October – new lot
  • BNF27 = 2014 Jun 27 – NB-5L bought in October – old lot
  • BNI13 = 2014 Sep 13 – NB-5L supplied in late October – new lot

So it goes.

1 Comment

Canon SX-230HS: Wasabi NB-5L Batteries

Based on my good experience with the Wasabi NP-BX1 batteries, I also bought three Wasabi NB-5L batteries for my Canon SX-230HS pocket camera:

Canon NB-5L - OEM Wasabi Misc - 2014-10-04

Canon NB-5L – OEM Wasabi Misc – 2014-10-04

Well, that’s not what I expected: the “new” Wasabi batteries perform worse than the three year old Canon OEM battery and no better than the crap batteries from eBay.

Just to be sure, I ran two tests on each of the three new batteries. Unlike the NP-BX1 batteries, these deliver a lower voltage than the Canon OEM battery and have a much lower capacity. The camera cuts off at 3.5 V, so the new batteries deliver 2/3 the run time of the old OEM battery


Tech support at Blue Nook (I am not making that up) says they’ll send me a couple of batteries from their next shipment to see if something’s wrong with this batch; all the batteries have date code BNF27.


Canon NB-5L Battery Status

One of the junker NB-5L eBay batteries for my Canon SX-230HS pocket camera gave up, but the other two have some usable capacity left. The OEM Canon battery seems to be doing fine, perhaps because it sees a relatively low duty cycle:

Canon NB-5L - 2013-11

Canon NB-5L – 2013-11

Compare those curves with the previous tests:

Canon NB-5L - 2011-08-26

Canon NB-5L – 2011-08-26

I harvested the weakest of the four junkers to make that dummy battery.

It’s about time to pick up a few more junkers: alas, I can find no bare cells in a size to fit that case.


Canon NB-5L Battery Teardown, Cheater, and Voltages

The motivation for gutting that Dell laptop battery was to find out if the cells could become a higher-capacity external battery for the Canon SX230HS camera. Those discharge curves suggest they can’t, but I also want to know what voltage levels correspond to the various battery status icons, which means I must feed an adjustable power supply into the camera… so I need a fake NB-5L battery with a cheater cord.

The first step: crack the case of the worst of the eBay junkers. I squeezed it in the bench vise to no avail, then worked a small chisel / scraper (*) into the joint. The lid was firmly bonded to the case, but it eventually came free:

NB-5L Battery - opened

NB-5L Battery – opened

The protective PCB sits at one end of the cell, with a strip of black foam insulating the components from the nickel strips:

NB-5L - protective PCB

NB-5L – protective PCB

It turns out that the cell’s metal shell is the positive contact, which I didn’t expect.

The component side of the PCB has a 10 kΩ resistor connected between the center and negative contacts. That should be a thermistor, but it’s a cheap eBay knockoff and I suppose I should be delighted that there’s not a gaping hole where that contact should be. The PCB fits against the small notch in the case and is held in place by small features on the top and bottom. The negative contact is on the far left:

NB-5L - PCB interior view

NB-5L – PCB interior view

Canon sells an AC adapter for the camera that includes an empty battery with a coaxial jack that aligns with a hole in the battery compartment cover. I soldered a pair of wires to the PCB, drilled a hole in the appropriate spot, added some closed-cell foam and hot-melt glue to anchor the PCB, and made a cheater adapter. For the record, the orange wire is positive:

NB-5L - gutted case with pigtail

NB-5L – gutted case with pigtail

It turns out that the camera battery cover must be closed and latched before the camera will turn on, but the sliding latch mechanism occludes the hole. This cannot be an inadvertent design feature, but I managed to snake the wire out anyway.

Connecting that up to a bench supply (with a meter having 0.1 V resolution) produces the following results:

Voltage Result
3.8 Full charge
3.7 2/3 charge
3.6 Blinking orange
3.5 “Charge the battery”

The camera draws about 500 mA in picture-taking mode, about 300 mA in display mode, and peaks at around 1 A while zooming.

The Genuine Canon NB-5L is good for 800 mA·h to 3.6 V, as are the two best pairs of the Dell cells. The latter remain over 3.7 V for 500 mA·h, which suggests one pair would run for about an hour before starting to blink. Maybe that’s Good Enough, but … a new prismatic battery is looking better all the time.

(*) Made by my father, many years ago, with a simple wood handle that eventually disintegrated. I squished some epoxy putty around the haft and covered it with heatshrink tubing, but (now that I have a 3D printer) I really should print up a spiffy replacement. I’ve been using it to pry objects off the printer’s build platform, so that’d be only fitting…


NB-5L Holder: Coil Springs

Having twice failed to make music-wire springs work, I rummaged around in the Big Box o’ Small Springs with more diligence and unearthed a pair of coil compression springs that exactly match the pin ferrule OD. Twiddling the solid model produced this longer & flatter version with in-line springs and cylindrical plugs holding them in place:

NB-5L Holder - Coil spring - solid model

NB-5L Holder - Coil spring - solid model

A closeup of the pin arrangement, which now looks very clean and easy to build:

NB-5L Holder - Coil spring - detail

NB-5L Holder - Coil spring - detail

The OpenSCAD code will print out a quartet of plugs (pick the best two), but having thought of that too late, I turned a pair from a random acrylic rod:

Turning spring plugs

Turning spring plugs

I did remember to solder the wires before assembling the pins this time…

Pin assemblies

Pin assemblies

Because the pins now index on their shoulder with the springs at partial extension, I set the drills into the pin vice vise [Update: One can probably be arrested for pin vice] to produce depths displayed by the OpenSCAD program before reaming out the  printed holes:

ECHO: "Depth to taper end: 24.72"
ECHO: "         ferrule end: 15.62"
ECHO: "         plug end: 4.62"

Then glue the pin plugs into the holder and the flat lid atop the case to capture the battery, clamping everything to the corner of the Sherline’s countertop:

Gluing pin assemblies

Gluing pin assemblies

And it Just Worked: nice travel between the limits, smooth operation, it’s the way I should have done it from the beginning*. You knew that all along, right?

Here are the three NB-5L Battery Holder versions, all snuggled up together. The longer and flatter coil-spring version sits on the right:

Variations on an NB-5L holder theme

Variations on an NB-5L holder theme

Now I can take some data…

The OpenSCAD source code:

// Holder for Canon NB-5L Li-Ion battery
// Ed Nisley KE4ZNU August 2011

include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
include </home/ed/Thing-O-Matic/lib/MCAD/boxes.scad>
include </home/ed/Thing-O-Matic/Useful Sizes.scad>

// Layout options

Layout = "Build";					// Case Lid Plugs Show Build Fit

//- Extrusion parameters - must match reality!
//  Print with +2 shells and 3 solid layers

ThreadThick = 0.33;
ThreadWidth = 2.0 * ThreadThick;

HoleWindage = 0.2;

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

Protrusion = 0.1;			// make holes end cleanly

BuildOffset = 3.0;			// clearance for build layout

//- Battery dimensions - rationalized from several samples
//  Coordinate origin at battery corner by contact plates on bottom surface

BatteryLength = 45.25;
BatteryWidth = 32.17;
BatteryThick =  7.85;

ContactWidth = 2.10;
ContactLength = 4.10;
ContactRecess = 0.85;

ContactOC = 3.18;			// center-to-center across contact face
ContactOffset = 4.45;		// offset from battery edge
ContactHeight = 3.05;		// offset from battery bottom plane

AlignThick = 2.2;			// alignment recesses on contact face
AlignDepth = 2.0;			// into face
AlignWidth1 = 0.7;			// across face at contacts
AlignWidth2 = 2.8;			//  ... other edge

//- Pin dimensions

PinTipDia = 1.6;
PinTipLength = 10.0;

PinTaperLength = 2.3;

PinShaftDia = 2.4;
PinShaftLength = 6.8;

PinFerruleDia = 3.1;
PinFerruleLength = 2.0;

PinLength = PinTipLength + PinTaperLength + PinShaftLength + PinFerruleLength;

ExtendRelax = 1.5 + ContactRecess;		// pin extension when no battery is present
ExtendOvertravel = 1.0;					//  ... beyond engaged position

//- Spring dimensions

SpringDia = 3.1;						// coil OD
SpringMax = 9.3;
SpringLength = SpringMax - 0.3;			// slightly compressed
SpringMin = 4.5;

SpringPlugDia = 5.0;					// plug retaining the spring
SpringPlugLength = IntegerMultiple(4.0,ThreadWidth);
SpringPlugSides = 12;

SpringTravel = ExtendRelax + ExtendOvertravel;

//- Holder dimensions

GuideRadius = ThreadWidth;						// friction fit ridges
GuideOffset = 10;
WallThick = 4*ThreadWidth;						// holder sidewalls

BaseThick = 6*ThreadThick;			// bottom of holder to bottom of battery
TopThick = 4*ThreadThick;			// top of battery to top of holder

ThumbRadius = 10.0;			// thumb opening at end of battery

CornerRadius = 3*ThreadThick;			// nice corner rounding

CaseLength = SpringPlugLength + SpringLength + PinLength - ExtendRelax
			+ BatteryLength + GuideRadius + WallThick;
CaseWidth = 2*WallThick + 2*GuideRadius + BatteryWidth;
CaseThick = BaseThick + BatteryThick + TopThick;

//- XY origin at front left battery corner, Z on platform below that

CaseLengthOffset = -(SpringPlugLength + SpringLength + PinLength - ExtendRelax);
CaseWidthOffset = -(WallThick + GuideRadius);
CaseThickOffset = BaseThick;

LidLength = ExtendRelax - CaseLengthOffset;

echo(str("Depth to taper end: ",
		 (SpringPlugLength + SpringLength + PinFerruleLength + PinShaftLength + PinTaperLength)));
echo(str("         ferrule end: ",
		  (SpringPlugLength + SpringLength + PinFerruleLength)));
echo(str("         plug end: ",SpringPlugLength));

// Useful routines

module PolyCyl(Dia,Height,ForceSides=0) {			// based on nophead's polyholes

  Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);

  FixDia = Dia / cos(180/Sides);

  cylinder(r=(FixDia + HoleWindage)/2,

module ShowPegGrid(Space = 10.0,Size = 1.0) {

  Range = floor(50 / Space);

	for (x=[-Range:Range])
	  for (y=[-Range:Range])



//-- Guides for tighter friction fit

module Guides() {
		PolyCyl(2*GuideRadius,(BatteryThick - Protrusion),4);
	  translate([GuideOffset,(BatteryWidth + GuideRadius),CaseThickOffset])
		PolyCyl(2*GuideRadius,(BatteryThick - Protrusion),4);
	  translate([(BatteryLength - GuideOffset),-GuideRadius,CaseThickOffset])
		PolyCyl(2*GuideRadius,(BatteryThick - Protrusion),4);
	  translate([(BatteryLength - GuideOffset),(BatteryWidth + GuideRadius),CaseThickOffset])
		PolyCyl(2*GuideRadius,(BatteryThick - Protrusion),4);
	  translate([(BatteryLength + GuideRadius),GuideOffset/2,CaseThickOffset])
		PolyCyl(2*GuideRadius,(BatteryThick - Protrusion),4);
	  translate([(BatteryLength + GuideRadius),(BatteryWidth - GuideOffset/2),CaseThickOffset])
		PolyCyl(2*GuideRadius,(BatteryThick - Protrusion),4);


//-- Contact pins (holes therefore)

module PinShape() {

  union() {
	cylinder(r=(PinTipDia + HoleWindage)/2,h=(PinTipLength + Protrusion),$fn=6);

	  cylinder(r=(PinShaftDia + HoleWindage)/2,
			   h=(PinTaperLength + PinShaftLength + Protrusion),$fn=6);

	translate([0,0,(PinLength - PinFerruleLength)])
	  cylinder(r=(PinFerruleDia + HoleWindage)/2,
				h=(PinFerruleLength + Protrusion),$fn=6);

	  cylinder(r=(SpringDia + HoleWindage)/2,
				h=(SpringLength + Protrusion),$fn=6);

	translate([0,0,(PinLength + SpringLength)])
	  cylinder(r=(SpringPlugDia + HoleWindage)/2,h=(SpringPlugLength + Protrusion),$fn=SpringPlugSides);

	  translate([0,0,(PinLength + SpringLength + SpringPlugLength)])
	  cylinder(r=(SpringPlugDia + HoleWindage)/2,h=2*SpringPlugLength,$fn=SpringPlugSides);	// extend hole


module PinAssembly() {

  translate([ExtendRelax,ContactOffset,CaseThickOffset + ContactHeight]) {
	rotate([0,270,0]) {
	  PinShape();												// pins


//-- Case with origin at battery corner

module Case() {

  difference() {

	union() {

	  difference() {
		translate([(CaseLength/2 + CaseLengthOffset),
				  (CaseWidth/2 + CaseWidthOffset),
		  roundedBox([CaseLength,CaseWidth,CaseThick],CornerRadius); 	// basic case shape

		  cube([(BatteryLength + GuideRadius + ExtendOvertravel),
				(BatteryWidth + 2* GuideRadius),
				(BatteryThick + Protrusion)]);						// battery space



		cube([(AlignDepth + ExtendOvertravel),
			  (AlignWidth1 + GuideRadius),
			  AlignThick]);											// alignment blocks
				 (BatteryWidth - AlignWidth2),
		cube([(AlignDepth + ExtendOvertravel),
			  (AlignWidth2 + GuideRadius),


			   (CaseWidthOffset - Protrusion),
			   (CaseThickOffset + BatteryThick)])
		    (CaseWidth + 2*Protrusion),
		    (TopThick + Protrusion)]);								// battery access

	translate([(CaseLengthOffset - Protrusion),
			   (CaseWidthOffset - Protrusion),
			   (CaseThickOffset + BatteryThick)])
	  cube([(CaseLength + 2*Protrusion),
		    (CaseWidth + 2*Protrusion),
		    (TopThick + Protrusion)]);								// battery insertion allowance

	translate([(BatteryLength - Protrusion),
			    (CaseWidth/2 + CaseWidthOffset),
			    (CaseThickOffset + ThumbRadius)])
				   h=(WallThick + GuideRadius + 2*Protrusion),
				   $fn=22);											// remove thumb notch




module Lid() {

  difference() {
	translate([0,0,(CaseThick/2 - BaseThick - BatteryThick)])

	  cube([(LidLength + 2*Protrusion),
		    (CaseWidth + 2*Protrusion),


module PlugShape() {

  difference() {
	  PolyCyl(PinShaftDia,(SpringPlugLength + 2*Protrusion),SpringPlugSides/2);

module Plugs() {

// Build it!


if (Layout == "Case")

if (Layout == "Lid")

if (Layout == "Plugs")

if (Layout == "Show") {								// reveal pin assembly
  difference() {

	translate([(CaseLengthOffset - Protrusion),
			   (CaseWidthOffset - Protrusion + WallThick + ContactOffset + ContactOC),
			   (BaseThick + ContactHeight)])
	  cube([(-CaseLengthOffset + Protrusion),
			 (CaseWidth + 2*Protrusion),
			 CaseThick + BaseThick - ContactHeight + Protrusion]);

	translate([(CaseLengthOffset - Protrusion),
			   (CaseWidthOffset - Protrusion),
	  cube([(-CaseLengthOffset + Protrusion),
			 (WallThick + GuideRadius + ContactOffset + Protrusion),

  translate([ExtendRelax,ContactOffset,(CaseThickOffset + ContactHeight)]) {	// pins
	rotate([0,270,0]) {
//	  translate([0,(2*ContactOC),0])
//		%PinShape();

  translate([CaseLengthOffset,ContactOffset,(CaseThickOffset + ContactHeight)])

if (Layout == "Build") {
  translate([-(CaseLength/2 + CaseLengthOffset),-(CaseWidthOffset - BuildOffset),0])
  translate([0,(CaseLengthOffset/2 - BuildOffset),0])
  translate([CaseLengthOffset - SpringPlugDia,-CaseWidth/2,0])
  translate([(CaseLengthOffset + SpringPlugDia),-CaseWidth/2,0])	// extra set of plugs

if (Layout == "Fit") {
  translate([(-LidLength/2 + ExtendRelax),
			(CaseWidth/2 + CaseWidthOffset),
			(BaseThick + BatteryThick)])
  translate([ExtendRelax,ContactOffset,CaseThickOffset + ContactHeight]) {	// pins
	rotate([0,270,0]) {

			(ContactOffset + ContactOC),
			(CaseThickOffset + ContactHeight)])


(*) Modulo, of course, simply buying a $5 charger from eBay and gutting it. What’s the fun in that?