steve/precision-shaft
Precision round shaft for linear bearings: any diameter and length, with the common sizes as presets.
NEMA stepper motor envelope: frames 8, 11, 14, 17, 23 and 34, with common models such as 17HS4401 as presets.
| 1 | """Hybrid stepper motor, NEMA frame sizes 8, 11, 14, 17, 23 and 34: envelope for assemblies. |
| 2 | |
| 3 | The mounting face is on the XY plane at the origin: the square body runs down along -Z for `body_length`, the round |
| 4 | pilot and the shaft stand up along +Z. Four mounting holes on a square pattern (threads drawn at their nominal diameter; |
| 5 | NEMA 23 and 34 have plain holes through the front flange). The D-flat on the smaller frames' shaft faces +Y. |
| 6 | Windings, end bell, wires and connector are not modelled, and a NEMA 34 shaft's key is not drawn. |
| 7 | """ |
| 8 | import math |
| 9 | |
| 10 | from steve import Model |
| 11 | |
| 12 | frame = "NEMA17" # NEMA frame size |
| 13 | body_length = 40 # mm Body length, mounting face to the back of the motor |
| 14 | shaft_diameter = 5 # mm Shaft diameter |
| 15 | |
| 16 | # frame: (square side, hole spacing, hole diameter, hole depth, pilot diameter, pilot height, shaft length, |
| 17 | # flat length from the shaft end) |
| 18 | # Leadshine, CM Series Stepper Motors data sheet (c) 2018, section 2.3, printed pp. 07-14 (NEMA 8 to 34 drawings); NEMA 17 |
| 19 | # side, hole depth and pilot height: SOYO SY42STH47-1206A sheet (42.3 max, depth 4.5 min, pilot 2), Leadshine shows 42, |
| 20 | # depth 4, pilot 1.8. NEMA 34 pilot height: Novanta NEMA 34 data sheet 2022 (2.5 +-0.5 mm). |
| 21 | FRAMES = { |
| 22 | "NEMA8": (20.3, 15.4, 2.0, 2.0, 16.0, 1.5, 10.0, 0.0), |
| 23 | "NEMA11": (28.2, 23.0, 2.5, 2.5, 22.0, 2.0, 20.0, 15.0), |
| 24 | "NEMA14": (35.2, 26.0, 3.0, 4.5, 22.0, 2.0, 24.0, 15.0), |
| 25 | "NEMA17": (42.3, 31.0, 3.0, 4.5, 22.0, 2.0, 24.0, 15.0), |
| 26 | "NEMA23": (56.4, 47.14, 5.0, 5.0, 38.1, 1.6, 21.0, 15.0), |
| 27 | "NEMA34": (86.0, 69.6, 5.5, 10.0, 73.0, 2.5, 32.0, 0.0), |
| 28 | } |
| 29 | # frame: {shaft diameter: width across the flat} (0: round shaft, no flat). Leadshine, as above: 4.5 on the 5 mm shafts; |
| 30 | # NEMA 23 table: D 6.35 E 5.8, D 8 E 7.5. |
| 31 | SHAFTS = { |
| 32 | "NEMA8": {4: 0}, |
| 33 | "NEMA11": {5: 4.5}, |
| 34 | "NEMA14": {5: 4.5}, |
| 35 | "NEMA17": {5: 4.5}, |
| 36 | "NEMA23": {6.35: 5.8, 8: 7.5}, |
| 37 | "NEMA34": {12.7: 0, 14: 0}, |
| 38 | } |
| 39 | # frame: (shortest, longest) body length of the sourced models: Leadshine's tables (NEMA 8 33-45, 11 32-51, 14 31-47, |
| 40 | # 17 33-60, 23 41-85, 34 65-129), the body length is the maker's choice within a frame. |
| 41 | BODY_RANGE = {"NEMA8": (33, 45), "NEMA11": (32, 51), "NEMA14": (31, 47), "NEMA17": (33, 60), "NEMA23": (41, 85), "NEMA34": (65, 129)} |
| 42 | |
| 43 | side, spacing, hole_d, hole_depth, pilot_d, pilot_h, shaft_l, flat_l = FRAMES[frame] |
| 44 | if shaft_diameter not in SHAFTS[frame]: |
| 45 | raise ValueError(f"{frame} shafts: {', '.join(str(d) for d in SHAFTS[frame])} mm.") |
| 46 | low, high = BODY_RANGE[frame] |
| 47 | if not low <= body_length <= high: |
| 48 | raise ValueError(f"{frame} body lengths in the sourced data: {low} to {high} mm.") |
| 49 | across_flat = SHAFTS[frame][shaft_diameter] |
| 50 | half = spacing / 2 |
| 51 | |
| 52 | model = Model() |
| 53 | with model.sketch("body_sketch", on="XY", name="Body") as sk: |
| 54 | sk.rect("square", (-side / 2, -side / 2), (side / 2, side / 2)) |
| 55 | model.extrude("body", "body_sketch", distance=-body_length, name="Body") |
| 56 | with model.sketch("pilot_sketch", on="XY", name="Pilot") as sk: |
| 57 | sk.circle("pilot_circle", (0, 0), pilot_d / 2) |
| 58 | model.extrude("pilot", "pilot_sketch", distance=pilot_h, name="Pilot") |
| 59 | with model.sketch("shaft_sketch", on="XY", name="Shaft") as sk: |
| 60 | sk.circle("shaft_circle", (0, 0), shaft_diameter / 2) |
| 61 | model.extrude("shaft", "shaft_sketch", distance=shaft_l, name="Shaft") |
| 62 | with model.sketch("holes_sketch", on="XY", name="Mounting holes") as sk: |
| 63 | for i, (x, y) in enumerate([(-half, -half), (half, -half), (half, half), (-half, half)]): |
| 64 | sk.circle(f"hole_{i + 1}", (x, y), hole_d / 2) |
| 65 | model.extrude("holes", "holes_sketch", distance=-hole_depth, op="cut", name="Mounting holes") |
| 66 | if across_flat: |
| 67 | model.plane("flat_plane", on="XY", offset=shaft_l - flat_l, name="Flat start") |
| 68 | y0 = across_flat - shaft_diameter / 2 |
| 69 | with model.sketch("flat_sketch", on="flat_plane", name="Shaft flat") as sk: |
| 70 | sk.rect("flat", (-shaft_diameter, y0), (shaft_diameter, shaft_diameter)) |
| 71 | model.extrude("flat_cut", "flat_sketch", distance=flat_l, op="cut", name="Shaft flat") |
| 72 | model.material("steel-generic", color="#3a3c40") |
| 73 | result = model.result() |
| 74 |
| 1 | name = "steve/nema-stepper-motor" |
| 2 | version = "1.0.0" |
| 3 | runtime = "steve" |
| 4 | license = "MIT" |
| 5 | summary = "NEMA stepper motor envelope: frames 8, 11, 14, 17, 23 and 34, with common models such as 17HS4401 as presets." |
| 6 | description = """Hybrid stepper motor envelope for assemblies: square body, round pilot, shaft with its flat and the four \ |
| 7 | mounting holes, in NEMA frame sizes 8, 11, 14, 17, 23 and 34. The mounting face is on the XY plane, the shaft points along +Z. \ |
| 8 | Dimensions from makers' public data sheets (see the README); not affiliated with any maker named.""" |
| 9 | tags = ["motor", "stepper", "nema", "nema-17", "actuator", "motion"] |
| 10 | |
| 11 | [parameters.frame] |
| 12 | type = "choice" |
| 13 | default = "NEMA17" |
| 14 | choices = ["NEMA8", "NEMA11", "NEMA14", "NEMA17", "NEMA23", "NEMA34"] |
| 15 | label = "Frame size" |
| 16 | |
| 17 | [parameters.body_length] |
| 18 | type = "number" |
| 19 | default = 40 |
| 20 | min = 31 |
| 21 | max = 129 |
| 22 | unit = "mm" |
| 23 | label = "Body length" |
| 24 | description = "Mounting face to the back of the motor. Each frame accepts the range its sourced models span." |
| 25 | |
| 26 | [parameters.shaft_diameter] |
| 27 | type = "number" |
| 28 | default = 5 |
| 29 | min = 4 |
| 30 | max = 14 |
| 31 | unit = "mm" |
| 32 | label = "Shaft diameter" |
| 33 | description = "NEMA 8: 4; 11, 14, 17: 5; 23: 6.35 or 8; 34: 12.7 or 14." |
| 34 |
| 1 | # Presets of this part (factory/PRESETS.md). Written by factory/gen.py. |
| 2 | |
| 3 | [[presets]] |
| 4 | id = "NEMA8-L34" |
| 5 | title = "NEMA 8, 34 mm body" |
| 6 | params = { frame = "NEMA8", body_length = 34, shaft_diameter = 4 } |
| 7 | aliases = ["NEMA 8", "NEMA8", "NEMA 8 34 mm", "NEMA 8 stepper motor", "NEMA8 stepper 34mm"] |
| 8 | standard = "Leadshine CM" |
| 9 | |
| 10 | [[presets]] |
| 11 | id = "NEMA8-L40" |
| 12 | title = "NEMA 8, 40 mm body" |
| 13 | params = { frame = "NEMA8", body_length = 40, shaft_diameter = 4 } |
| 14 | aliases = ["NEMA 8", "NEMA8", "NEMA 8 40 mm", "NEMA 8 stepper motor", "NEMA8 stepper 40mm"] |
| 15 | standard = "Leadshine CM" |
| 16 | |
| 17 | [[presets]] |
| 18 | id = "NEMA11-L34" |
| 19 | title = "NEMA 11, 34 mm body" |
| 20 | params = { frame = "NEMA11", body_length = 34, shaft_diameter = 5 } |
| 21 | aliases = ["NEMA 11", "NEMA11", "NEMA 11 34 mm", "NEMA 11 stepper motor", "NEMA11 stepper 34mm"] |
| 22 | standard = "Leadshine CM" |
| 23 | |
| 24 | [[presets]] |
| 25 | id = "NEMA11-L40" |
| 26 | title = "NEMA 11, 40 mm body" |
| 27 | params = { frame = "NEMA11", body_length = 40, shaft_diameter = 5 } |
| 28 | aliases = ["NEMA 11", "NEMA11", "NEMA 11 40 mm", "NEMA 11 stepper motor", "NEMA11 stepper 40mm"] |
| 29 | standard = "Leadshine CM" |
| 30 | |
| 31 | [[presets]] |
| 32 | id = "NEMA11-L48" |
| 33 | title = "NEMA 11, 48 mm body" |
| 34 | params = { frame = "NEMA11", body_length = 48, shaft_diameter = 5 } |
| 35 | aliases = ["NEMA 11", "NEMA11", "NEMA 11 48 mm", "NEMA 11 stepper motor", "NEMA11 stepper 48mm"] |
| 36 | standard = "Leadshine CM" |
| 37 | |
| 38 | [[presets]] |
| 39 | id = "NEMA14-L34" |
| 40 | title = "NEMA 14, 34 mm body" |
| 41 | params = { frame = "NEMA14", body_length = 34, shaft_diameter = 5 } |
| 42 | aliases = ["NEMA 14", "NEMA14", "NEMA 14 34 mm", "NEMA 14 stepper motor", "NEMA14 stepper 34mm"] |
| 43 | standard = "Leadshine CM" |
| 44 | |
| 45 | [[presets]] |
| 46 | id = "NEMA14-L40" |
| 47 | title = "NEMA 14, 40 mm body" |
| 48 | params = { frame = "NEMA14", body_length = 40, shaft_diameter = 5 } |
| 49 | aliases = ["NEMA 14", "NEMA14", "NEMA 14 40 mm", "NEMA 14 stepper motor", "NEMA14 stepper 40mm"] |
| 50 | standard = "Leadshine CM" |
| 51 | |
| 52 | [[presets]] |
| 53 | id = "NEMA17-L34" |
| 54 | title = "NEMA 17, 34 mm body" |
| 55 | params = { frame = "NEMA17", body_length = 34, shaft_diameter = 5 } |
| 56 | aliases = ["NEMA 17", "NEMA17", "NEMA 17 34 mm", "NEMA 17 stepper motor", "NEMA17 stepper 34mm"] |
| 57 | standard = "Leadshine CM" |
| 58 | |
| 59 | [[presets]] |
| 60 | id = "NEMA17-L40" |
| 61 | title = "NEMA 17, 40 mm body" |
| 62 | params = { frame = "NEMA17", body_length = 40, shaft_diameter = 5 } |
| 63 | aliases = ["17HS4401", "17HS4401S", "17HS4401 stepper motor", "NEMA 17 17HS4401", "42BYGH 40mm", "NEMA 17", "NEMA17", "NEMA 17 40 mm", "NEMA 17 stepper motor", "NEMA17 stepper 40mm"] |
| 64 | standard = "Leadshine CM" |
| 65 | |
| 66 | [[presets]] |
| 67 | id = "NEMA17-L48" |
| 68 | title = "NEMA 17, 48 mm body" |
| 69 | params = { frame = "NEMA17", body_length = 48, shaft_diameter = 5 } |
| 70 | aliases = ["NEMA 17", "NEMA17", "NEMA 17 48 mm", "NEMA 17 stepper motor", "NEMA17 stepper 48mm"] |
| 71 | standard = "Leadshine CM" |
| 72 | |
| 73 | [[presets]] |
| 74 | id = "NEMA17-L60" |
| 75 | title = "NEMA 17, 60 mm body" |
| 76 | params = { frame = "NEMA17", body_length = 60, shaft_diameter = 5 } |
| 77 | aliases = ["42CM08", "Leadshine 42CM08", "NEMA 17 60 mm", "NEMA 17", "NEMA17", "NEMA 17 stepper motor", "NEMA17 stepper 60mm"] |
| 78 | standard = "Leadshine CM" |
| 79 | |
| 80 | [[presets]] |
| 81 | id = "NEMA23-L48" |
| 82 | title = "NEMA 23, 48 mm body" |
| 83 | params = { frame = "NEMA23", body_length = 48, shaft_diameter = 6.35 } |
| 84 | aliases = ["NEMA 23", "NEMA23", "NEMA 23 48 mm", "NEMA 23 stepper motor", "NEMA23 stepper 48mm"] |
| 85 | standard = "Leadshine CM" |
| 86 | |
| 87 | [[presets]] |
| 88 | id = "NEMA23-L60" |
| 89 | title = "NEMA 23, 60 mm body" |
| 90 | params = { frame = "NEMA23", body_length = 60, shaft_diameter = 6.35 } |
| 91 | aliases = ["NEMA 23", "NEMA23", "NEMA 23 60 mm", "NEMA 23 stepper motor", "NEMA23 stepper 60mm"] |
| 92 | standard = "Leadshine CM" |
| 93 | |
| 94 | [[presets]] |
| 95 | id = "NEMA23-L76" |
| 96 | title = "NEMA 23, 76 mm body" |
| 97 | params = { frame = "NEMA23", body_length = 76, shaft_diameter = 6.35 } |
| 98 | aliases = ["NEMA 23", "NEMA23", "NEMA 23 76 mm", "NEMA 23 stepper motor", "NEMA23 stepper 76mm"] |
| 99 | standard = "Leadshine CM" |
| 100 | |
| 101 | [[presets]] |
| 102 | id = "NEMA23-L84" |
| 103 | title = "NEMA 23, 84 mm body" |
| 104 | params = { frame = "NEMA23", body_length = 84, shaft_diameter = 6.35 } |
| 105 | aliases = ["NEMA 23", "NEMA23", "NEMA 23 84 mm", "NEMA 23 stepper motor", "NEMA23 stepper 84mm"] |
| 106 | standard = "Leadshine CM" |
| 107 | |
| 108 | [[presets]] |
| 109 | id = "SY42STH47-1206A" |
| 110 | title = "SY42STH47-1206A (NEMA 17, 47 mm body)" |
| 111 | params = { frame = "NEMA17", body_length = 47, shaft_diameter = 5 } |
| 112 | aliases = ["SOYO SY42STH47", "NEMA 17 47 mm", "42CM06", "Leadshine 42CM06", "NEMA 17", "NEMA 17 stepper motor"] |
| 113 | standard = "maker's data sheet" |
| 114 | |
| 115 | [[presets]] |
| 116 | id = "42CM02" |
| 117 | title = "42CM02 (NEMA 17, 33 mm body)" |
| 118 | params = { frame = "NEMA17", body_length = 33, shaft_diameter = 5 } |
| 119 | aliases = ["Leadshine 42CM02", "NEMA 17 33 mm", "NEMA 17", "NEMA 17 stepper motor"] |
| 120 | standard = "maker's data sheet" |
| 121 | |
| 122 | [[presets]] |
| 123 | id = "20CM003" |
| 124 | title = "20CM003 (NEMA 8, 33 mm body)" |
| 125 | params = { frame = "NEMA8", body_length = 33, shaft_diameter = 4 } |
| 126 | aliases = ["Leadshine 20CM003", "NEMA 8 33 mm", "NEMA 8", "NEMA 8 stepper motor"] |
| 127 | standard = "maker's data sheet" |
| 128 | |
| 129 | [[presets]] |
| 130 | id = "20CM005" |
| 131 | title = "20CM005 (NEMA 8, 45 mm body)" |
| 132 | params = { frame = "NEMA8", body_length = 45, shaft_diameter = 4 } |
| 133 | aliases = ["Leadshine 20CM005", "NEMA 8 45 mm", "NEMA 8", "NEMA 8 stepper motor"] |
| 134 | standard = "maker's data sheet" |
| 135 | |
| 136 | [[presets]] |
| 137 | id = "28CM006" |
| 138 | title = "28CM006 (NEMA 11, 32 mm body)" |
| 139 | params = { frame = "NEMA11", body_length = 32, shaft_diameter = 5 } |
| 140 | aliases = ["Leadshine 28CM006", "NEMA 11 32 mm", "NEMA 11", "NEMA 11 stepper motor"] |
| 141 | standard = "maker's data sheet" |
| 142 | |
| 143 | [[presets]] |
| 144 | id = "28CM010" |
| 145 | title = "28CM010 (NEMA 11, 41 mm body)" |
| 146 | params = { frame = "NEMA11", body_length = 41, shaft_diameter = 5 } |
| 147 | aliases = ["Leadshine 28CM010", "NEMA 11 41 mm", "NEMA 11", "NEMA 11 stepper motor"] |
| 148 | standard = "maker's data sheet" |
| 149 | |
| 150 | [[presets]] |
| 151 | id = "28CM013" |
| 152 | title = "28CM013 (NEMA 11, 51 mm body)" |
| 153 | params = { frame = "NEMA11", body_length = 51, shaft_diameter = 5 } |
| 154 | aliases = ["Leadshine 28CM013", "NEMA 11 51 mm", "NEMA 11", "NEMA 11 stepper motor"] |
| 155 | standard = "maker's data sheet" |
| 156 | |
| 157 | [[presets]] |
| 158 | id = "35CM015" |
| 159 | title = "35CM015 (NEMA 14, 31 mm body)" |
| 160 | params = { frame = "NEMA14", body_length = 31, shaft_diameter = 5 } |
| 161 | aliases = ["Leadshine 35CM015", "NEMA 14 31 mm", "NEMA 14", "NEMA 14 stepper motor"] |
| 162 | standard = "maker's data sheet" |
| 163 | |
| 164 | [[presets]] |
| 165 | id = "35CM04" |
| 166 | title = "35CM04 (NEMA 14, 47 mm body)" |
| 167 | params = { frame = "NEMA14", body_length = 47, shaft_diameter = 5 } |
| 168 | aliases = ["Leadshine 35CM04", "NEMA 14 47 mm", "NEMA 14", "NEMA 14 stepper motor"] |
| 169 | standard = "maker's data sheet" |
| 170 | |
| 171 | [[presets]] |
| 172 | id = "57CM13" |
| 173 | title = "57CM13 (NEMA 23, 55 mm body)" |
| 174 | params = { frame = "NEMA23", body_length = 55, shaft_diameter = 6.35 } |
| 175 | aliases = ["Leadshine 57CM13", "NEMA 23 55 mm", "NEMA 23", "NEMA 23 stepper motor"] |
| 176 | standard = "maker's data sheet" |
| 177 | |
| 178 | [[presets]] |
| 179 | id = "57CM23" |
| 180 | title = "57CM23 (NEMA 23, 76 mm body)" |
| 181 | params = { frame = "NEMA23", body_length = 76, shaft_diameter = 8 } |
| 182 | aliases = ["Leadshine 57CM23", "NEMA 23 76 mm", "NEMA 23", "NEMA 23 stepper motor"] |
| 183 | standard = "maker's data sheet" |
| 184 | |
| 185 | [[presets]] |
| 186 | id = "86CM35" |
| 187 | title = "86CM35 (NEMA 34, 65 mm body)" |
| 188 | params = { frame = "NEMA34", body_length = 65, shaft_diameter = 12.7 } |
| 189 | aliases = ["Leadshine 86CM35", "NEMA 34 65 mm", "NEMA 34", "NEMA 34 stepper motor"] |
| 190 | standard = "maker's data sheet" |
| 191 | |
| 192 | [[presets]] |
| 193 | id = "86CM45" |
| 194 | title = "86CM45 (NEMA 34, 80 mm body)" |
| 195 | params = { frame = "NEMA34", body_length = 80, shaft_diameter = 12.7 } |
| 196 | aliases = ["Leadshine 86CM45", "NEMA 34 80 mm", "NEMA 34", "NEMA 34 stepper motor"] |
| 197 | standard = "maker's data sheet" |
| 198 | |
| 199 | [[presets]] |
| 200 | id = "86CM80" |
| 201 | title = "86CM80 (NEMA 34, 98 mm body)" |
| 202 | params = { frame = "NEMA34", body_length = 98, shaft_diameter = 12.7 } |
| 203 | aliases = ["Leadshine 86CM80", "NEMA 34 98 mm", "NEMA 34", "NEMA 34 stepper motor"] |
| 204 | standard = "maker's data sheet" |
| 205 | |
| 206 | [[presets]] |
| 207 | id = "86CM85" |
| 208 | title = "86CM85 (NEMA 34, 118 mm body)" |
| 209 | params = { frame = "NEMA34", body_length = 118, shaft_diameter = 12.7 } |
| 210 | aliases = ["Leadshine 86CM85", "NEMA 34 118 mm", "NEMA 34", "NEMA 34 stepper motor"] |
| 211 | standard = "maker's data sheet" |
| 212 | |
| 213 | [[presets]] |
| 214 | id = "86CM120" |
| 215 | title = "86CM120 (NEMA 34, 129 mm body)" |
| 216 | params = { frame = "NEMA34", body_length = 129, shaft_diameter = 14 } |
| 217 | aliases = ["Leadshine 86CM120", "NEMA 34 129 mm", "NEMA 34", "NEMA 34 stepper motor"] |
| 218 | standard = "maker's data sheet" |
| 219 |
Hybrid stepper motor envelope for assemblies, NEMA frame sizes 8, 11, 14, 17, 23 and 34.
The mounting face is on the XY plane at the origin. The square body runs along -Z for body_length; the pilot and the
shaft stand along +Z. Four mounting holes on a square pattern (threaded holes are drawn at their nominal diameter). The
shaft's D-flat faces +Y where the frame has one. Windings, end bell, wires and connector aren't modelled, and neither is
the key on a NEMA 34 shaft (5 mm wide, 25 mm long on the data sheet).
| Parameter | Meaning |
|---|---|
frame |
NEMA8, NEMA11, NEMA14, NEMA17, NEMA23, NEMA34 |
body_length |
Mounting face to the back of the motor, mm. Not fixed by the frame size: it is the maker's choice |
shaft_diameter |
4, 5, 6.35, 8, 12.7 or 14 mm, as the frame allows |
| Frame | Side | Hole spacing | Holes | Pilot Ø × height | Shaft Ø | Shaft length | Flat |
|---|---|---|---|---|---|---|---|
| NEMA 8 | 20.3 | 15.4 | M2 × 2 | 16 × 1.5 | 4 | 10 | none drawn |
| NEMA 11 | 28.2 | 23 | M2.5 × 2.5 | 22 × 2 | 5 | 20 | 4.5 across, 15 long |
| NEMA 14 | 35.2 | 26 | M3 × 4.5 | 22 × 2 | 5 | 24 | 4.5 across, 15 long |
| NEMA 17 | 42.3 | 31 | M3 × 4.5 | 22 × 2 | 5 | 24 | 4.5 across, 15 long |
| NEMA 23 | 56.4 | 47.14 | Ø5 through a 5 flange | 38.1 × 1.6 | 6.35 or 8 | 21 | 5.8 or 7.5 across, 15 long |
| NEMA 34 | 86 | 69.6 | Ø5.5 through a 10 flange | 73 × 2.5 | 12.7 or 14 | 32 | key, not drawn |
Every row is in part.py (FRAMES, SHAFTS, BODY_RANGE).
Body lengths are limited per frame to the range of the sourced models (BODY_RANGE): a length outside it has no maker's
data, so the recipe refuses it. Motor names in the presets identify the sizes those makers publish; this part is not made
by or affiliated with any of them. Drawing tolerances vary by maker and are not stated here.
Preset list: frame sizes of the step.parts catalogue (MIT) and the makers' models above, see library/NOTICE.md.
| 1 | # NEMA stepper motor |
| 2 | |
| 3 | Hybrid stepper motor envelope for assemblies, NEMA frame sizes 8, 11, 14, 17, 23 and 34. |
| 4 | |
| 5 | ## Geometry |
| 6 | |
| 7 | The mounting face is on the XY plane at the origin. The square body runs along -Z for `body_length`; the pilot and the |
| 8 | shaft stand along +Z. Four mounting holes on a square pattern (threaded holes are drawn at their nominal diameter). The |
| 9 | shaft's D-flat faces +Y where the frame has one. Windings, end bell, wires and connector aren't modelled, and neither is |
| 10 | the key on a NEMA 34 shaft (5 mm wide, 25 mm long on the data sheet). |
| 11 | |
| 12 | ## Parameters |
| 13 | |
| 14 | | Parameter | Meaning | |
| 15 | |---|---| |
| 16 | | `frame` | `NEMA8`, `NEMA11`, `NEMA14`, `NEMA17`, `NEMA23`, `NEMA34` | |
| 17 | | `body_length` | Mounting face to the back of the motor, mm. Not fixed by the frame size: it is the maker's choice | |
| 18 | | `shaft_diameter` | 4, 5, 6.35, 8, 12.7 or 14 mm, as the frame allows | |
| 19 | |
| 20 | ## Source |
| 21 | |
| 22 | - **All frames:** Leadshine Technology, *CM Series Stepper Motors* data sheet, (c) 2018, section 2.3 Motor Specifications, |
| 23 | printed pp. 07 to 14, drawings and model tables, as hosted by a distributor: |
| 24 | <https://cdn.shopify.com/s/files/1/0250/8347/8109/files/Leadshine_Hybrid_Stepper_Motor_CM_Series_Data_Sheet.pdf> |
| 25 | - **NEMA 17 side (42.3 max), hole depth (4.5 min), pilot height (2):** Changzhou Songyang (SOYO) *SY42STH47-1206A* |
| 26 | technical conditions sheet, <https://www.pololu.com/file/0J685/SY42STH47-1206A.pdf>. Leadshine draws 42 square, depth 4, |
| 27 | pilot 1.8. |
| 28 | - **NEMA 34 pilot height:** Novanta, *NEMA 34 motors* data sheet, 2022 (2.5 +-0.5 mm), |
| 29 | <https://novanta.com/robotics-automation/wp-content/uploads/sites/3/2026/01/Nema34_motors_2022.pdf>. |
| 30 | - **17HS4401 body length (40 mm):** Handson Technology, *17HS4401S* data specs, p. 2, |
| 31 | <https://www.handsontec.com/dataspecs/17HS4401S.pdf>. That sheet draws a 42.0 max square and a 23 mm shaft; the preset |
| 32 | uses this recipe's NEMA 17 frame table (42.3 and 24). |
| 33 | |
| 34 | | Frame | Side | Hole spacing | Holes | Pilot Ø × height | Shaft Ø | Shaft length | Flat | |
| 35 | |---|---|---|---|---|---|---|---| |
| 36 | | NEMA 8 | 20.3 | 15.4 | M2 × 2 | 16 × 1.5 | 4 | 10 | none drawn | |
| 37 | | NEMA 11 | 28.2 | 23 | M2.5 × 2.5 | 22 × 2 | 5 | 20 | 4.5 across, 15 long | |
| 38 | | NEMA 14 | 35.2 | 26 | M3 × 4.5 | 22 × 2 | 5 | 24 | 4.5 across, 15 long | |
| 39 | | NEMA 17 | 42.3 | 31 | M3 × 4.5 | 22 × 2 | 5 | 24 | 4.5 across, 15 long | |
| 40 | | NEMA 23 | 56.4 | 47.14 | Ø5 through a 5 flange | 38.1 × 1.6 | 6.35 or 8 | 21 | 5.8 or 7.5 across, 15 long | |
| 41 | | NEMA 34 | 86 | 69.6 | Ø5.5 through a 10 flange | 73 × 2.5 | 12.7 or 14 | 32 | key, not drawn | |
| 42 | |
| 43 | Every row is in `part.py` (`FRAMES`, `SHAFTS`, `BODY_RANGE`). |
| 44 | |
| 45 | Body lengths are limited per frame to the range of the sourced models (`BODY_RANGE`): a length outside it has no maker's |
| 46 | data, so the recipe refuses it. Motor names in the presets identify the sizes those makers publish; this part is not made |
| 47 | by or affiliated with any of them. Drawing tolerances vary by maker and are not stated here. |
| 48 | |
| 49 | Preset list: frame sizes of the step.parts catalogue (MIT) and the makers' models above, see `library/NOTICE.md`. |
| 50 |
Hybrid stepper motor envelope for assemblies: square body, round pilot, shaft with its flat and the four mounting holes, in NEMA frame sizes 8, 11, 14, 17, 23 and 34. The mounting face is on the XY plane, the shaft points along +Z. Dimensions from makers' public data sheets (see the README); not affiliated with any maker named.
Hybrid stepper motor envelope for assemblies, NEMA frame sizes 8, 11, 14, 17, 23 and 34.
The mounting face is on the XY plane at the origin. The square body runs along -Z for body_length; the pilot and the
shaft stand along +Z. Four mounting holes on a square pattern (threaded holes are drawn at their nominal diameter). The
shaft's D-flat faces +Y where the frame has one. Windings, end bell, wires and connector aren't modelled, and neither is
the key on a NEMA 34 shaft (5 mm wide, 25 mm long on the data sheet).
| Parameter | Meaning |
|---|---|
frame |
NEMA8, NEMA11, NEMA14, NEMA17, NEMA23, NEMA34 |
body_length |
Mounting face to the back of the motor, mm. Not fixed by the frame size: it is the maker's choice |
shaft_diameter |
4, 5, 6.35, 8, 12.7 or 14 mm, as the frame allows |
| Frame | Side | Hole spacing | Holes | Pilot Ø × height | Shaft Ø | Shaft length | Flat |
|---|---|---|---|---|---|---|---|
| NEMA 8 | 20.3 | 15.4 | M2 × 2 | 16 × 1.5 | 4 | 10 | none drawn |
| NEMA 11 | 28.2 | 23 | M2.5 × 2.5 | 22 × 2 | 5 | 20 | 4.5 across, 15 long |
| NEMA 14 | 35.2 | 26 | M3 × 4.5 | 22 × 2 | 5 | 24 | 4.5 across, 15 long |
| NEMA 17 | 42.3 | 31 | M3 × 4.5 | 22 × 2 | 5 | 24 | 4.5 across, 15 long |
| NEMA 23 | 56.4 | 47.14 | Ø5 through a 5 flange | 38.1 × 1.6 | 6.35 or 8 | 21 | 5.8 or 7.5 across, 15 long |
| NEMA 34 | 86 | 69.6 | Ø5.5 through a 10 flange | 73 × 2.5 | 12.7 or 14 | 32 | key, not drawn |
Every row is in part.py (FRAMES, SHAFTS, BODY_RANGE).
Body lengths are limited per frame to the range of the sourced models (BODY_RANGE): a length outside it has no maker's
data, so the recipe refuses it. Motor names in the presets identify the sizes those makers publish; this part is not made
by or affiliated with any of them. Drawing tolerances vary by maker and are not stated here.
Preset list: frame sizes of the step.parts catalogue (MIT) and the makers' models above, see library/NOTICE.md.
Precision round shaft for linear bearings: any diameter and length, with the common sizes as presets.
Profile linear guide envelope: HGR15, 20, 25 and MGN rails of any length, HGH and HGW blocks.
Trapezoidal lead screw envelope: Tr8, Tr10, Tr12 and Tr16, leads 2 to 8 mm, any length.
HIWIN MGN miniature linear guideway, sizes 7, 9, 12 and 15: rail (MGNR) or block (MGN-C / MGN-H).