Initial commit

This commit is contained in:
Matt McWilliams 2025-02-12 12:36:14 -05:00
commit b230f7346a
14 changed files with 58916 additions and 0 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "scad/common"]
path = scad/common
url = https://git.sixteenmillimeter.com/modules/common.git

52
README.md Normal file
View File

@ -0,0 +1,52 @@
# 110 Cartridge
This module contains a 3D printable 110 cartridge for downspooling 16mm guage film for use with 110 still cameras.
Previously this was called the "minolta16_cartridge" on this site but it is compatible with all standard 110 cameras.
This design requires loading in a changing bag or completely dark room.
Initially this was created for [FDM printers](https://en.wikipedia.org/wiki/Fused_filament_fabrication), but updates can be made to the design for it to be used with resin [SLA printers](https://en.wikipedia.org/wiki/Stereolithography).
It does not have a top cover on the cartridge itself, currently, because of the minimum z-height for FDM printing but SLA printers should be able to make a cartridge thin enough that it can support a cover.
The actual opaqueness of available printing materials is another concern, which is why this design is recommended to use only in a changing bag or darkened room.
If there is any light transmission at all, this can compromise the film by fogging or flashing it.
-----
## 110 Cartridge Body
This is the main body of the cartridge and is one of only two absolutely necessary parts to print to be able to load and shoot film; the other being the takeup insert.
Film is loaded into the feed (smaller) side of the cartridge and threaded through to the takeup side and affixed to the takeup insert
![110 Cartridge Body](./img/110_cartridge_body.jpg)
[Download STL](./stl/110_cartridge_body.stl)
-----
## 110 Cartridge Takeup Insert
This takeup insert is where film is affixed and wound around it while the camera advances between frames.
![110 Cartridge Takeup Insert](./img/110_cartridge_takeup.jpg)
[Download STL](./stl/110_cartridge_takeup.stl)
-----
## 110 Cartridge Case
This is the case for the cartridge.
It should not be considered light safe without testing.
As mentioned above, 3D printed materials have different levels of light transmission, even if they are completely black.
![110 Cartridge Case](./img/110_cartridge_case.jpg)
[Download STL](./stl/110_cartridge_case.stl)
-----
## 110 Cartridge Cover
![110 Cartridge Cover](./img/110_cartridge_cover.jpg)
[Download STL](./stl/110_cartridge_cover.stl)

BIN
img/110_cartridge_body.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
img/110_cartridge_case.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
img/110_cartridge_cover.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

74
meta.json Normal file
View File

@ -0,0 +1,74 @@
{
"camera" : {
"x" : 0,
"y" : 0,
"z" : 0,
},
"objects": [
{
"name": "110_cartridge_case",
"material": "black_plastic",
"position": {
"x": 0,
"y": 0,
"z": -40
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
}
},
{
"name": "110_cartridge_body",
"material": "black_plastic",
"position": {
"x": 0,
"y": 0,
"z": 0
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
}
},
{
"name": "110_cartridge_takeup",
"material": "black_plastic",
"position": {
"x": -21,
"y": 0,
"z": 35
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
}
},
{
"name": "110_cartridge_takeup",
"material": "black_plastic",
"position": {
"x": 0,
"y": 0,
"z": 45
},
"rotation": {
"x": 180,
"y": 0,
"z": 180
}
}
],
"src" : [
"README.md",
"LICENSE",
"scad.sh",
"scad/110_cartridge.scad",
"scad/common/common.scad",
"scad/common/c14n_stl.py",
"scad/common/scad.sh"
]
}

3
scad.sh Normal file
View File

@ -0,0 +1,3 @@
#!/bin/bash
bash scad/common/scad.sh scad/110_cartridge.scad "${@}"

185
scad/110_cartridge.scad Normal file
View File

@ -0,0 +1,185 @@
use <./common/common.scad>;
$fn = 150;
SPACING = 42;
WALL_THICKNESS = 1.25 + .5;
PLANE_BACK = 1.55;
CART_H = 16.85 + .75;
FEED_D = 19.14;
TAKEUP_D = 22.04;
TAKEUP_OFFSET_Y = -(TAKEUP_D - FEED_D) / 2;
CONNECT_X = SPACING - (TAKEUP_D / 2) - (FEED_D / 2) + 2;
CONNECT_Y = 8.85;
CONNECT_Z = 1.3;
CONNECT_OFFSET_X = ((TAKEUP_D / 2) - (FEED_D / 2)) / 2;
CONNECT_OFFSET_Y = (FEED_D / 2) - (CONNECT_Y / 2) - 5.02;
CONNECT_OFFSET_Z = -(CART_H / 2) + (CONNECT_Z / 2);
FILM_NEG_Y = .75;
FILM_NEG_OFFSET_Y = 8.5;
CAP_LIP_H = 5.92;
CAP_LIP = .56;
CAP_THICKNESS = .5;
TOP_H = 1;
module 110_cartridge_case () {
H = 19;
FOD = FEED_D + 3;
FID = FEED_D + .5;
TOD = TAKEUP_D + 3;
TID = TAKEUP_D + .5;
MID = 17;
MID_OFFSET = 2.55;
difference () {
union () {
translate([SPACING / 2, 0, 0]) cylinder(r = R(FOD), h = H, center = true);
translate([-SPACING / 2, TAKEUP_OFFSET_Y, 0]) cylinder(r = R(TOD), h = H, center = true);
translate([0, MID_OFFSET, 0]) cube([SPACING, MID, H], center = true);
}
translate([0, 0, -1]) union () {
translate([SPACING / 2, 0, 0]) cylinder(r = R(FID), h = H, center = true);
translate([-SPACING / 2, TAKEUP_OFFSET_Y, 0]) cylinder(r = R(TID), h = H, center = true);
translate([0, MID_OFFSET - .25, 0]) cube([SPACING, MID - 2, H], center = true);
}
}
}
module 110_cartridge_cover () {
H = 4;
FOD = FEED_D + 3;
TOD = TAKEUP_D + 3;
MID = 17;
MID_OFFSET = 2.55;
difference () {
union () {
translate([SPACING / 2, 0, 0]) cylinder(r = R(FOD + 3), h = H, center = true);
translate([-SPACING / 2, TAKEUP_OFFSET_Y, 0]) cylinder(r = R(TOD + 3), h = H, center = true);
translate([0, MID_OFFSET, 0]) cube([SPACING, MID + 3, H], center = true);
}
translate([0, 0, 1.5]) union () {
translate([SPACING / 2, 0, 0]) cylinder(r = R(FOD), h = H, center = true);
translate([-SPACING / 2, TAKEUP_OFFSET_Y, 0]) cylinder(r = R(TOD), h = H, center = true);
translate([0, MID_OFFSET, 0]) cube([SPACING, MID, H], center = true);
}
}
}
module 110_cartridge_takeup () {
H = 15.95;
D = 15.5;
INNER_D = 14;
difference() {
cylinder(r = R(D), h = H, center = true);
translate([0, 0, .65]) cylinder(r = R(INNER_D), h = H, center = true);
translate([-3, 7, .65]) rotate([0, 0, 60]) cube([10, .5, H], center = true);
}
translate([0, 0, -(D / 2) + 1.5]) cylinder(r = R(4), h = 3, center = true);
for (i = [0:3]) {
rotate([0, 0, i * 90]) translate([(D / 4) - .75, 1.25, -(D / 2) + 1.5]) cube([(D / 2) + 1, 1, 3], center = true);
}
}
module 110_cartridge_takeup_cover () {
INNER_D = TAKEUP_D - WALL_THICKNESS;
difference () {
union () {
cylinder(r = R(TAKEUP_D), h = 1, center = true);
translate([TAKEUP_D / 4, TAKEUP_D / 4, 0]) {
cube([TAKEUP_D / 2, TAKEUP_D / 2, 1], center = true);
}
translate([0, 0, -1.5]) cylinder(r = R(13.87) + .2, h = 3, center = true);
}
translate([0, 0, .65]) cylinder(r = R(13.87) - .5, h = 100, center = true);
}
translate([(TAKEUP_D / 2) - 1, 7.5, -1]) cube([1.8, 1.8, 1.8], center = true);
}
module feed (pos = [0, 0, 0]) {
INNER_D = FEED_D - WALL_THICKNESS;
1_OFFSET_Z = (CART_H / 2) - (CAP_LIP_H / 2);
translate(pos) difference () {
union () {
cylinder(r = R(FEED_D), h = CART_H, center = true);
translate([-FEED_D / 4, FEED_D / 4, 0]) {
cube([FEED_D / 2, FEED_D / 2, CART_H], center = true);
}
}
translate([0, 0, WALL_THICKNESS]) cylinder(r = R(INNER_D), h = CART_H, center = true);
//film neg
translate ([-FEED_D / 2, FILM_NEG_OFFSET_Y, WALL_THICKNESS / 2]) {
cube([FEED_D, FILM_NEG_Y, CART_H], center = true);
}
}
}
module feed_cap () {
cylinder(r = R(FEED_D), h = CART_H, center = true);
}
module feed_cap_neg () {
INNER_D = FEED_D - CAP_LIP;
difference () {
cylinder(r = R(FEED_D), h = CAP_LIP_H, center = true);
translate([0, 0, WALL_THICKNESS]) cylinder(r = R(INNER_D), h = CART_H, center = true);
translate([-FEED_D / 4, FEED_D / 4, 0]) {
cube([FEED_D / 2, FEED_D / 2, CART_H], center = true);
}
}
}
module takeup (pos = [0, 0, 0]) {
INNER_D = TAKEUP_D - WALL_THICKNESS;
translate(pos) difference () {
union () {
cylinder(r = R(TAKEUP_D), h = CART_H, center = true);
translate([TAKEUP_D / 4, TAKEUP_D / 4, 0]) {
cube([TAKEUP_D / 2, TAKEUP_D / 2, CART_H], center = true);
}
}
//notch
translate([0, 0, WALL_THICKNESS]) cylinder(r = R(INNER_D), h = CART_H, center = true);
//film neg
translate ([TAKEUP_D / 2, FILM_NEG_OFFSET_Y - TAKEUP_OFFSET_Y, WALL_THICKNESS / 2]) {
cube([TAKEUP_D, FILM_NEG_Y, CART_H], center = true);
}
}
}
module connector (pos = [0, 0, 0]) {
translate(pos) cube([CONNECT_X, CONNECT_Y, CONNECT_Z], center = true);
}
module 110_cartridge_body () {
feed([SPACING / 2, 0, 0]);
takeup([-SPACING / 2, TAKEUP_OFFSET_Y, 0]);
connector([CONNECT_OFFSET_X, CONNECT_OFFSET_Y, CONNECT_OFFSET_Z]);
}
PART = "body";
if (PART == "case") {
rotate([180, 0, 0]) 110_cartridge_case();
} else if (PART == "cover") {
110_cartridge_cover();
} else if (PART == "takeup") {
110_cartridge_takeup();
} else if (PART == "body") {
110_cartridge_body();
}

1
scad/common Submodule

@ -0,0 +1 @@
Subproject commit e2eeb27f173d739a174c0d147bcb62a16859e2d9

17124
stl/110_cartridge_body.stl Normal file

File diff suppressed because it is too large Load Diff

14590
stl/110_cartridge_case.stl Normal file

File diff suppressed because it is too large Load Diff

14590
stl/110_cartridge_cover.stl Normal file

File diff suppressed because it is too large Load Diff

12294
stl/110_cartridge_takeup.stl Normal file

File diff suppressed because it is too large Load Diff