An octet of Eneloop AAA cells arrived, I wanted to measure their as-delivered charge (the package says “Factory Charged With SOLAR ENERGY”, so you know it’s good), and discovered I’d given away my AAA cell holders. You can actually get inter-series adapters on eBay, but what’s the fun in that? Plus, I didn’t want to delay gratification for a month; you know how it is.
Soooo:

It’s basically an AA-size sleeve that fits over the AAA cell, with a lathe-turned brass post conducting juice from the + terminal of the inner cell outward:

Not much to look at when it’s assembled:

The AAA cell fits deliberately loose, because this goes into a metal clip holding everything firmly in place for the battery tester:

The source code tabulates the sizes of several cylindrical cells, exactly zero other pairs of which have been tested; I expect most won’t work correctly. In particular, the table entries should include the contact button OD and thickness for each cell, so that I can turn out the proper terminal for each pair of cells. If I ever need a different adapter, I’ll beat some cooperation out of that, too.
Discovered I needed an adapter after breakfast, started testing cells after lunch. Life is good!
The OpenSCAD source code as a GitHub Gist:
| // Cylindrical cell adapters | |
| // Ed Nisley KE4ZNU April 2017 | |
| //- Extrusion parameters must match reality! | |
| ThreadThick = 0.25; | |
| ThreadWidth = 0.40; | |
| HoleWindage = 0.2; | |
| Protrusion = 0.1; // make holes end cleanly | |
| inch = 25.4; | |
| function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); | |
| //———————- | |
| // Dimensions | |
| OutCell = "AA"; // cell sizes | |
| InCell = "AAA"; | |
| BottomClear = 3*ThreadThick; // shorten outer shell to allow base protrusion | |
| Terminal = [3.0,4.0,2.0]; // terminal: OD = nub dia, length = nub thickness | |
| NAME = 0; | |
| ID = 0; // for non-cell cylinders | |
| OD = 1; | |
| LENGTH = 2; | |
| Cells = [ | |
| ["AAAA",8.3,42.5], | |
| ["AAA",10.5,44.5], | |
| ["AA",14.5,50.5], | |
| ["C",26.2,50], | |
| ["D",34.2,61.5], | |
| ["A23",10.3,28.5], | |
| ["CR123",17.0,34.5], | |
| ["18650",18.6,65.2] | |
| ]; | |
| Outer = search([OutCell],Cells,1,0)[0]; | |
| Inner = search([InCell],Cells,1,0)[0]; | |
| echo(str("Outer cell: ",Cells[Outer][NAME])); | |
| echo(str("Inner cell: ",Cells[Inner][NAME])); | |
| echo(str("Wall: ",Cells[Outer][OD] – (Cells[Inner][OD]/cos(180/NumSides) + 2*ThreadWidth))); | |
| Delta = Cells[Outer][LENGTH] – Cells[Inner][LENGTH]; | |
| echo(str("Terminal OAL: ",Delta)); | |
| echo(str(" … head: ",Terminal[LENGTH])); | |
| echo(str(" … shaft: ",Delta – Terminal[LENGTH])); | |
| NumSides = 3*4; | |
| //———————- | |
| // 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,h=Height,$fn=Sides); | |
| } | |
| //———————- | |
| // Construct adapter | |
| module Adapter() { | |
| difference() { | |
| cylinder(d=Cells[Outer][OD], | |
| h=Cells[Outer][LENGTH] – BottomClear – Terminal[LENGTH], | |
| $fn=NumSides); | |
| translate([0,0,Delta – Terminal[LENGTH]]) | |
| PolyCyl(Cells[Inner][OD] + 2*ThreadWidth, | |
| Cells[Inner][LENGTH] + Protrusion, | |
| NumSides); | |
| translate([0,0,-Protrusion]) | |
| PolyCyl(Terminal[ID], | |
| 2*Cells[Outer][LENGTH], | |
| 6); | |
| } | |
| } | |
| //———————- | |
| // Build it | |
| Adapter(); |
The original doodle:









