From 986f7c7b3d433d9a61012881d14a49e6c55ec06f Mon Sep 17 00:00:00 2001 From: Bdale Garbee Date: Thu, 12 Jun 2025 13:24:17 -0600 Subject: [PATCH] battery holder for 3 pieces 18650 --- packages/.gitignore | 1 + packages/18650x3.py | 131 ++++++++++++++++++++++++++++++++++++++++++++ packages/Makefile | 3 +- 3 files changed, 134 insertions(+), 1 deletion(-) create mode 100755 packages/18650x3.py diff --git a/packages/.gitignore b/packages/.gitignore index a0d84ac..5b22604 100644 --- a/packages/.gitignore +++ b/packages/.gitignore @@ -170,3 +170,4 @@ XLR3.fp XLR4.fp XLR5.fp sj-63033a.fp +18650x3.fp diff --git a/packages/18650x3.py b/packages/18650x3.py new file mode 100755 index 0000000..4720fa4 --- /dev/null +++ b/packages/18650x3.py @@ -0,0 +1,131 @@ +#!/usr/bin/python3 +# Copyright 2025 by Bdale Garbee . GPLv3 +# +# Program to emit PCB footprint for 3x 18650 battery holder +# + +# dimensions in mm from AliExpress seller page and direct measurement +BodyX = 60.0 +BodyY = 77.0 + +PinSpacing = 72.0 +RowSpacing = 19.0 + +Drill = 1.75 # diameter of drill hole +Thickness = 2.75 # outer diameter of copper annulus +Clearance = 1 # delta in diameter above Thickness for plane clearance +Mask = 2.9 # mask opening diameter + +SilkWidth = 10 # in units of 1/1000 inch +SilkNative = SilkWidth * 100 + +import sys + +# we're going to use the 1/100 of a mil fundamental unit form +def mm2mils100( mm ): + return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 ) + +print('# author: Bdale Garbee') +print('# email: bdale@gag.com') +print('# dist-license: GPL 3') +print('# use-license: unlimited') + +print('Element[0x0 "1MS1T1B4M7" "" "" 0 0 0 0 0 100 0x0]') +print("(") +print(' Pin[',\ + mm2mils100(-RowSpacing), \ + mm2mils100(-PinSpacing/2), \ + mm2mils100(Thickness), \ + mm2mils100(Clearance), \ + mm2mils100(Mask), \ + mm2mils100(Drill), \ + '"pin1" "1" 0x0101]') + +print(' Pin[',\ + mm2mils100(-RowSpacing), \ + mm2mils100(PinSpacing/2), \ + mm2mils100(Thickness), \ + mm2mils100(Clearance), \ + mm2mils100(Mask), \ + mm2mils100(Drill), \ + '"pin2" "2" 0x0001]') + +print(' Pin[',\ + 0, \ + mm2mils100(-PinSpacing/2), \ + mm2mils100(Thickness), \ + mm2mils100(Clearance), \ + mm2mils100(Mask), \ + mm2mils100(Drill), \ + '"pin3" "3" 0x0001]') + +print(' Pin[',\ + 0, \ + mm2mils100(PinSpacing/2), \ + mm2mils100(Thickness), \ + mm2mils100(Clearance), \ + mm2mils100(Mask), \ + mm2mils100(Drill), \ + '"pin4" "4" 0x0001]') + +print(' Pin[',\ + mm2mils100(RowSpacing), \ + mm2mils100(-PinSpacing/2), \ + mm2mils100(Thickness), \ + mm2mils100(Clearance), \ + mm2mils100(Mask), \ + mm2mils100(Drill), \ + '"pin5" "5" 0x0001]') + +print(' Pin[',\ + mm2mils100(RowSpacing), \ + mm2mils100(PinSpacing/2), \ + mm2mils100(Thickness), \ + mm2mils100(Clearance), \ + mm2mils100(Mask), \ + mm2mils100(Drill), \ + '"pin6" "6" 0x0001]') + +print(' ElementLine[',\ + mm2mils100(-BodyX/2), \ + mm2mils100(-BodyY/2), \ + mm2mils100(-BodyX/2), \ + mm2mils100(BodyY/2), \ + SilkNative, ']') + +print(' ElementLine[',\ + mm2mils100(-BodyX/2), \ + mm2mils100(-BodyY/2), \ + mm2mils100(BodyX/2), \ + mm2mils100(-BodyY/2), \ + SilkNative, ']') + +print(' ElementLine[',\ + mm2mils100(BodyX/2), \ + mm2mils100(-BodyY/2), \ + mm2mils100(BodyX/2), \ + mm2mils100(BodyY/2), \ + SilkNative, ']') + +print(' ElementLine[',\ + mm2mils100(-BodyX/2), \ + mm2mils100(BodyY/2), \ + mm2mils100(BodyX/2), \ + mm2mils100(BodyY/2), \ + SilkNative, ']') + +print(' ElementLine[',\ + mm2mils100(-BodyX/15), \ + mm2mils100(-BodyY/2.75), \ + mm2mils100(BodyX/15), \ + mm2mils100(-BodyY/2.75), \ + 2*SilkNative, ']') + +print(' ElementLine[',\ + 0, \ + mm2mils100(-BodyY/2.75-BodyX/15), \ + 0, \ + mm2mils100(-BodyY/2.75+BodyX/15), \ + 2*SilkNative, ']') + +print(")") diff --git a/packages/Makefile b/packages/Makefile index f9f505d..f46ef76 100644 --- a/packages/Makefile +++ b/packages/Makefile @@ -185,7 +185,8 @@ FOOTPRINTS= \ XLR3.fp \ XLR4.fp \ XLR5.fp \ - sj-63033a.fp + sj-63033a.fp \ + 18650x3.fp .5c.fp: nickle $*.5c -o $@ -- 2.47.2