Auto wiring up for new larger stator completed

This commit is contained in:
Chris Greening 2022-11-01 13:21:26 +00:00
parent 7c7df2add0
commit e604178bd0
4 changed files with 201 additions and 136 deletions

View file

@ -22,6 +22,7 @@
" flip_x,\n", " flip_x,\n",
" optimize_points,\n", " optimize_points,\n",
" chaikin,\n", " chaikin,\n",
" rotate_point,\n",
")\n", ")\n",
"from pcb_json import (\n", "from pcb_json import (\n",
" dump_json,\n", " dump_json,\n",
@ -46,42 +47,45 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"# Track width and spacing\n",
"TRACK_WIDTH = 0.127\n",
"TRACK_SPACING = 0.127\n",
"\n",
"# via defaults\n",
"VIA_DIAM = 0.8\n", "VIA_DIAM = 0.8\n",
"VIA_DRILL = 0.4\n", "VIA_DRILL = 0.4\n",
"\n",
"# this is for a 1.27mm pitch pin\n", "# this is for a 1.27mm pitch pin\n",
"PIN_DIAM = 1.0\n", "PIN_DIAM = 1.0\n",
"PIN_DRILL = 0.65\n", "PIN_DRILL = 0.65\n",
"\n", "\n",
"# this is for the PCB connector - see https://www.farnell.com/datasheets/2003059.pdf\n", "# this is for the PCB connector - see https://www.farnell.com/datasheets/2003059.pdf\n",
"PAD_WIDTH = 6\n", "PAD_WIDTH = 3\n",
"PAD_HEIGHT = 2\n", "PAD_HEIGHT = 2\n",
"PAD_PITCH = 2.5\n", "PAD_PITCH = 2.5\n",
"\n", "\n",
"# where to put the input pads\n",
"INPUT_PAD_RADIUS = 19.5\n",
"\n",
"# PCB Edge size\n", "# PCB Edge size\n",
"STATOR_RADIUS = 23\n", "STATOR_RADIUS = 25\n",
"STATOR_HOLE_RADIUS = 5\n",
"SCREW_HOLE_RADIUS = 20\n",
"SCREW_HOLE_DRILL_DIAM = 2.3 # 2.3mm drill for a 2mm screw\n",
"STATOR_HOLE_RADIUS = 5.5\n", "STATOR_HOLE_RADIUS = 5.5\n",
"\n", "\n",
"# Track width and spacing\n", "# where to puth the mounting pins\n",
"TRACK_WIDTH = 0.127\n", "SCREW_HOLE_DRILL_DIAM = 2.3 # 2.3mm drill for a 2mm screw\n",
"TRACK_SPACING = 0.127\n", "SCREW_HOLE_RADIUS = STATOR_RADIUS\n",
"\n",
"# where to put the input pads\n",
"INPUT_PAD_RADIUS = STATOR_RADIUS - (PAD_WIDTH / 2 + VIA_DIAM + TRACK_SPACING)\n",
"\n", "\n",
"# Coil params\n", "# Coil params\n",
"TURNS = 9\n", "TURNS = 12\n",
"COIL_CENTER_RADIUS = 11.8\n", "COIL_CENTER_RADIUS = 16\n",
"COIL_VIA_RADIUS = 12.8\n", "COIL_VIA_RADIUS = 17\n",
"\n", "\n",
"# where to place the pins\n", "# where to place the pins\n",
"# CONNECTION_PINS_RADIUS = 16.5\n", "# CONNECTION_PINS_RADIUS = 16.5\n",
"\n", "\n",
"USE_SPIRAL = False\n", "USE_SPIRAL = False\n",
"\n", "\n",
"LAYERS = 2" "LAYERS = 4"
] ]
}, },
{ {
@ -100,12 +104,12 @@
"# templates must be simetric around the X axis and must include the center points on both size (e.g. (X1, 0).... (X2, 0) )\n", "# templates must be simetric around the X axis and must include the center points on both size (e.g. (X1, 0).... (X2, 0) )\n",
"# template must also be convex\n", "# template must also be convex\n",
"template = [\n", "template = [\n",
" (-1.5, 0),\n", " (-3.5, 0),\n",
" (-1.5, -0.1),\n", " (-3.5, -0.01),\n",
" (1.9, -0.8),\n", " (1.9, -1.45),\n",
" (1.9, 0.0),\n", " (1.9, 0.0),\n",
" (1.9, 0.8),\n", " (1.9, 1.45),\n",
" (-1.5, 0.1),\n", " (-3.5, 0.01),\n",
"]" "]"
] ]
}, },
@ -264,37 +268,28 @@
"mounting_holes = []\n", "mounting_holes = []\n",
"silk = []\n", "silk = []\n",
"\n", "\n",
"# create the pads at CONNECTION_PINS radius - 2 for each of the coils, A, B and C\n",
"# angle_A = 0\n",
"# pads.append(create_pad(CONNECTION_PINS_RADIUS, angle_A - 30, \"A\"))\n",
"# pads.append(create_pad(CONNECTION_PINS_RADIUS, angle_A + 30, \"A\"))\n",
"\n", "\n",
"# angle_B = 120\n", "# shift the coils aronnd to make connections a bit easier\n",
"# pads.append(create_pad(CONNECTION_PINS_RADIUS, angle_B - 30, \"B\"))\n", "COIL_ROTATION = -360 / 12\n",
"# pads.append(create_pad(CONNECTION_PINS_RADIUS, angle_B + 30, \"B\"))\n",
"\n",
"# angle_C = 240\n",
"# pads.append(create_pad(CONNECTION_PINS_RADIUS, angle_C - 30, \"C\"))\n",
"# pads.append(create_pad(CONNECTION_PINS_RADIUS, angle_C + 30, \"C\"))\n",
"\n", "\n",
"coil_angles = []\n",
"for i in range(12):\n",
" angle = i * 360 / 12 + COIL_ROTATION\n",
" coil_angles.append(angle)\n",
"\n", "\n",
"# the main coils\n", "# the main coils\n",
"coil_labels = [\"A\", \"B\", \"C\"]\n", "coil_labels = [\"A\", \"B\", \"C\"]\n",
"coils_f = []\n", "coils_f = []\n",
"coils_b = []\n", "coils_b = []\n",
"for i in range(12):\n", "for i in range(12):\n",
" angle = i * 360 / 12\n", " angle = coil_angles[i]\n",
" if (i // 3) % 2 == 0:\n", " if (i // 3) % 2 == 0:\n",
" coil_A_f = translate(rotate(points_f, angle), COIL_CENTER_RADIUS, angle)\n", " coil_A_f = translate(rotate(points_f, angle), COIL_CENTER_RADIUS, angle)\n",
" coil_A_b = translate(rotate(points_b, angle), COIL_CENTER_RADIUS, angle)\n", " coil_A_b = translate(rotate(points_b, angle), COIL_CENTER_RADIUS, angle)\n",
" else:\n", " else:\n",
" # slightly nudge the coils so that they don't overlap when flipped\n", " # slightly nudge the coils so that they don't overlap when flipped\n",
" coil_A_f = translate(\n", " coil_A_f = translate(rotate(flip_y(points_f), angle), COIL_CENTER_RADIUS, angle)\n",
" rotate(flip_y(points_f), angle - 2), COIL_CENTER_RADIUS, angle\n", " coil_A_b = translate(rotate(flip_y(points_b), angle), COIL_CENTER_RADIUS, angle)\n",
" )\n",
" coil_A_b = translate(\n",
" rotate(flip_y(points_b), angle - 2), COIL_CENTER_RADIUS, angle\n",
" )\n",
" # keep track of the coils\n", " # keep track of the coils\n",
" coils_f.append(coil_A_f)\n", " coils_f.append(coil_A_f)\n",
" coils_b.append(coil_A_b)\n", " coils_b.append(coil_A_b)\n",
@ -312,15 +307,15 @@
"# create tracks to link the A coils around the center\n", "# create tracks to link the A coils around the center\n",
"connection_via_radius_A = connection_radius1 + 3 * TRACK_SPACING + VIA_DIAM / 2\n", "connection_via_radius_A = connection_radius1 + 3 * TRACK_SPACING + VIA_DIAM / 2\n",
"coil_A1_A2_inner = (\n", "coil_A1_A2_inner = (\n",
" [get_arc_point(0, connection_via_radius_A)]\n", " [get_arc_point(coil_angles[0], connection_via_radius_A)]\n",
" + draw_arc(0, 3 * 360 / 12, connection_radius1)\n", " + draw_arc(COIL_ROTATION, coil_angles[3], connection_radius1)\n",
" + [get_arc_point(3 * 360 / 12, connection_via_radius_A)]\n", " + [get_arc_point(coil_angles[3], connection_via_radius_A)]\n",
")\n", ")\n",
"tracks_f.append(coil_A1_A2_inner)\n", "tracks_f.append(coil_A1_A2_inner)\n",
"coil_A3_A4_inner = (\n", "coil_A3_A4_inner = (\n",
" [get_arc_point(6 * 360 / 12, connection_via_radius_A)]\n", " [get_arc_point(coil_angles[6], connection_via_radius_A)]\n",
" + draw_arc(6 * 360 / 12, 9 * 360 / 12, connection_radius1)\n", " + draw_arc(coil_angles[6], coil_angles[9], connection_radius1)\n",
" + [get_arc_point(9 * 360 / 12, connection_via_radius_A)]\n", " + [get_arc_point(coil_angles[9], connection_via_radius_A)]\n",
")\n", ")\n",
"tracks_f.append(coil_A3_A4_inner)\n", "tracks_f.append(coil_A3_A4_inner)\n",
"# connect up the bottoms of the A coils\n", "# connect up the bottoms of the A coils\n",
@ -335,9 +330,9 @@
"vias.append(create_via(coil_A3_A4_inner[-1]))\n", "vias.append(create_via(coil_A3_A4_inner[-1]))\n",
"\n", "\n",
"# create tracks to link the B coils around the center - this can all be done on the bottom layer\n", "# create tracks to link the B coils around the center - this can all be done on the bottom layer\n",
"coil_B1_B2_inner = draw_arc(1 * 360 / 12, 4 * 360 / 12, connection_radius1)\n", "coil_B1_B2_inner = draw_arc(coil_angles[1], coil_angles[4], connection_radius1)\n",
"tracks_b.append(coil_B1_B2_inner)\n", "tracks_b.append(coil_B1_B2_inner)\n",
"coil_B3_B4_inner = draw_arc(7 * 360 / 12, 10 * 360 / 12, connection_radius1)\n", "coil_B3_B4_inner = draw_arc(coil_angles[7], coil_angles[10], connection_radius1)\n",
"tracks_b.append(coil_B3_B4_inner)\n", "tracks_b.append(coil_B3_B4_inner)\n",
"# connect up the bottoms of the A coils\n", "# connect up the bottoms of the A coils\n",
"coils_b[1].append(coil_B1_B2_inner[0])\n", "coils_b[1].append(coil_B1_B2_inner[0])\n",
@ -347,9 +342,9 @@
"\n", "\n",
"# create tracks to link the C coils around the center\n", "# create tracks to link the C coils around the center\n",
"connection_via_radius_C = connection_via_radius_A + 3 * TRACK_SPACING + VIA_DIAM / 2\n", "connection_via_radius_C = connection_via_radius_A + 3 * TRACK_SPACING + VIA_DIAM / 2\n",
"coil_C1_C2_inner = draw_arc(2 * 360 / 12, 5 * 360 / 12, connection_via_radius_C)\n", "coil_C1_C2_inner = draw_arc(coil_angles[2], coil_angles[5], connection_via_radius_C)\n",
"tracks_f.append(coil_C1_C2_inner)\n", "tracks_f.append(coil_C1_C2_inner)\n",
"coil_C3_C4_inner = draw_arc(8 * 360 / 12, 11 * 360 / 12, connection_via_radius_C)\n", "coil_C3_C4_inner = draw_arc(coil_angles[8], coil_angles[11], connection_via_radius_C)\n",
"tracks_f.append(coil_C3_C4_inner)\n", "tracks_f.append(coil_C3_C4_inner)\n",
"# connect up the bottoms of the B coils\n", "# connect up the bottoms of the B coils\n",
"coils_b[2].append(coil_C1_C2_inner[0])\n", "coils_b[2].append(coil_C1_C2_inner[0])\n",
@ -364,49 +359,54 @@
"\n", "\n",
"# connect the last three coils together\n", "# connect the last three coils together\n",
"common_connection_radius = SCREW_HOLE_RADIUS - (SCREW_HOLE_DRILL_DIAM / 2 + 0.5)\n", "common_connection_radius = SCREW_HOLE_RADIUS - (SCREW_HOLE_DRILL_DIAM / 2 + 0.5)\n",
"tracks_f.append(draw_arc(9 * 360 / 12, 11 * 360 / 12, common_connection_radius))\n", "tracks_f.append(draw_arc(coil_angles[9], coil_angles[11], common_connection_radius))\n",
"coils_f[9].append(get_arc_point(9 * 360 / 12, common_connection_radius))\n", "coils_f[9].append(get_arc_point(coil_angles[9], common_connection_radius))\n",
"coils_f[10].append(get_arc_point(10 * 360 / 12, common_connection_radius))\n", "coils_f[10].append(get_arc_point(coil_angles[10], common_connection_radius))\n",
"coils_f[11].append(get_arc_point(11 * 360 / 12, common_connection_radius))\n", "coils_f[11].append(get_arc_point(coil_angles[11], common_connection_radius))\n",
"\n", "\n",
"# connect the outer A coils together\n", "# connect the outer A coils together\n",
"outer_connection_radius_A = SCREW_HOLE_RADIUS + (SCREW_HOLE_DRILL_DIAM / 2 + 0.5)\n", "outer_connection_radius_A = SCREW_HOLE_RADIUS - (SCREW_HOLE_DRILL_DIAM / 2 + 0.5)\n",
"tracks_f.append(draw_arc(3 * 360 / 12, 6 * 360 / 12, outer_connection_radius_A))\n", "tracks_f.append(draw_arc(coil_angles[3], coil_angles[6], outer_connection_radius_A))\n",
"coils_f[3].append(get_arc_point(3 * 360 / 12, outer_connection_radius_A))\n", "coils_f[3].append(get_arc_point(coil_angles[3], outer_connection_radius_A))\n",
"coils_f[6].append(get_arc_point(6 * 360 / 12, outer_connection_radius_A))\n", "coils_f[6].append(get_arc_point(coil_angles[6], outer_connection_radius_A))\n",
"\n", "\n",
"# connect the outer B coils together\n", "# connect the outer B coils together\n",
"outer_connection_radius_B = outer_connection_radius_A - TRACK_SPACING - VIA_DIAM / 2\n", "outer_connection_radius_B = outer_connection_radius_A - TRACK_SPACING - VIA_DIAM / 2\n",
"tracks_b.append(\n", "tracks_b.append(\n",
" [get_arc_point(4 * 360 / 12, outer_connection_radius_B)]\n", " [get_arc_point(coil_angles[4], outer_connection_radius_B)]\n",
" + draw_arc(4 * 360 / 12, 7 * 360 / 12, outer_connection_radius_A)\n", " + draw_arc(coil_angles[4], coil_angles[7], outer_connection_radius_A)\n",
" + [get_arc_point(7 * 360 / 12, outer_connection_radius_B)]\n", " + [get_arc_point(coil_angles[7], outer_connection_radius_B)]\n",
")\n",
"coils_f[4].append(get_arc_point(coil_angles[4], outer_connection_radius_B))\n",
"coils_f[7].append(get_arc_point(coil_angles[7], outer_connection_radius_B))\n",
"vias.append(\n",
" create_via(get_arc_point(4 * 360 / 12 + COIL_ROTATION, outer_connection_radius_B))\n",
")\n",
"vias.append(\n",
" create_via(get_arc_point(7 * 360 / 12 + COIL_ROTATION, outer_connection_radius_B))\n",
")\n", ")\n",
"coils_f[4].append(get_arc_point(4 * 360 / 12, outer_connection_radius_B))\n",
"coils_f[7].append(get_arc_point(7 * 360 / 12, outer_connection_radius_B))\n",
"vias.append(create_via(get_arc_point(4 * 360 / 12, outer_connection_radius_B)))\n",
"vias.append(create_via(get_arc_point(7 * 360 / 12, outer_connection_radius_B)))\n",
"\n", "\n",
"# connect the outer C coilds together\n", "# connect the outer C coilds together\n",
"outer_connection_radius_C = SCREW_HOLE_RADIUS - (SCREW_HOLE_DRILL_DIAM / 2 + 0.5)\n", "outer_connection_radius_C = outer_connection_radius_B - TRACK_SPACING - VIA_DIAM / 2\n",
"# outer_connection_radius_C = outer_connection_radius_B - TRACK_SPACING - VIA_DIAM / 2\n", "tracks_b.append(\n",
"tracks_b.append(draw_arc(5 * 360 / 12, 8 * 360 / 12, outer_connection_radius_C))\n", " draw_arc(\n",
"coils_f[5].append(get_arc_point(5 * 360 / 12, outer_connection_radius_C))\n", " 5 * 360 / 12 + COIL_ROTATION,\n",
"coils_f[8].append(get_arc_point(8 * 360 / 12, outer_connection_radius_C))\n", " 8 * 360 / 12 + COIL_ROTATION,\n",
"vias.append(create_via(get_arc_point(5 * 360 / 12, outer_connection_radius_C)))\n", " outer_connection_radius_C,\n",
"vias.append(create_via(get_arc_point(8 * 360 / 12, outer_connection_radius_C)))\n", " )\n",
"\n", ")\n",
"# create pins for the input\n", "coils_f[5].append(\n",
"# for angle in range(0, 360, 15):\n", " get_arc_point(5 * 360 / 12 + COIL_ROTATION, outer_connection_radius_C)\n",
"# pins.append(create_pin(CONNECTION_PINS_RADIUS, angle, \"A\"))\n", ")\n",
"\n", "coils_f[8].append(\n",
"# coils_f[0].append(get_arc_point(0, CONNECTION_PINS_RADIUS))\n", " get_arc_point(8 * 360 / 12 + COIL_ROTATION, outer_connection_radius_C)\n",
"# coils_f[1].append(get_arc_point(1 * 360 / 12, CONNECTION_PINS_RADIUS))\n", ")\n",
"# coils_f[2].append(get_arc_point(2 * 360 / 12, CONNECTION_PINS_RADIUS))\n", "vias.append(\n",
"\n", " create_via(get_arc_point(5 * 360 / 12 + COIL_ROTATION, outer_connection_radius_C))\n",
"# coils_f[0].append(get_arc_point(15, CONNECTION_PINS_RADIUS))\n", ")\n",
"# coils_f[1].append(get_arc_point(15 + 1 * 360 / 12, CONNECTION_PINS_RADIUS))\n", "vias.append(\n",
"# coils_f[2].append(get_arc_point(15 + 2 * 360 / 12, CONNECTION_PINS_RADIUS))\n", " create_via(get_arc_point(8 * 360 / 12 + COIL_ROTATION, outer_connection_radius_C))\n",
")\n",
"\n", "\n",
"# create mounting holes at 45 degree angles\n", "# create mounting holes at 45 degree angles\n",
"mounting_holes = [\n", "mounting_holes = [\n",
@ -428,20 +428,16 @@
"pads.append(create_pad((INPUT_PAD_RADIUS, PAD_PITCH), PAD_WIDTH, PAD_HEIGHT, \"b\"))\n", "pads.append(create_pad((INPUT_PAD_RADIUS, PAD_PITCH), PAD_WIDTH, PAD_HEIGHT, \"b\"))\n",
"\n", "\n",
"# connect coil A to the top pad\n", "# connect coil A to the top pad\n",
"pad_connection_point_x = INPUT_PAD_RADIUS + PAD_WIDTH / 2 - VIA_DIAM\n", "pad_connection_point_x = INPUT_PAD_RADIUS\n",
"coils_f[0].append((pad_connection_point_x, -PAD_PITCH))\n", "pad_angle = np.rad2deg(np.arcsin(PAD_PITCH / pad_connection_point_x))\n",
"vias.append(create_via(((pad_connection_point_x, -PAD_PITCH))))\n", "coils_f[0].append(get_arc_point(coil_angles[0], pad_connection_point_x))\n",
"vias.append(create_via(get_arc_point(coil_angles[0], pad_connection_point_x)))\n",
"# connect coil B to the middle pad\n", "# connect coil B to the middle pad\n",
"coils_f[1].append((pad_connection_point_x, 0))\n", "coils_f[1].append((pad_connection_point_x + PAD_WIDTH / 2 + VIA_DIAM / 2, 0))\n",
"vias.append(create_via(((pad_connection_point_x, 0))))\n", "vias.append(create_via(((pad_connection_point_x + PAD_WIDTH / 2 + VIA_DIAM / 2, 0))))\n",
"# connect coil C to the bottom pad\n", "# connect coil C to the bottom pad\n",
"coils_f[2].append(\n", "coils_f[2].append(get_arc_point(coil_angles[2], pad_connection_point_x))\n",
" get_arc_point(\n", "vias.append(create_via(get_arc_point(coil_angles[2], pad_connection_point_x)))"
" 2 * 360 / 12, SCREW_HOLE_RADIUS - (SCREW_HOLE_DRILL_DIAM / 2 + TRACK_SPACING)\n",
" )\n",
")\n",
"coils_f[2].append((pad_connection_point_x, PAD_PITCH))\n",
"vias.append(create_via(((pad_connection_point_x, PAD_PITCH))))"
] ]
}, },
{ {
@ -454,8 +450,16 @@
"tracks_in1 = []\n", "tracks_in1 = []\n",
"tracks_in2 = []\n", "tracks_in2 = []\n",
"if LAYERS == 4:\n", "if LAYERS == 4:\n",
" tracks_in1 = tracks_b\n", " tracks_in1 = tracks_b.copy()\n",
" tracks_in2 = tracks_f\n", " tracks_in2 = tracks_f.copy()\n",
"\n",
"# these final bits of wiring up to the input pads don't need to be duplicated\n",
"tracks_b.append(\n",
" [(pad_connection_point_x + PAD_WIDTH / 2, 0), (pad_connection_point_x, 0)]\n",
")\n",
"tracks_b.append(draw_arc(coil_angles[0], -pad_angle, pad_connection_point_x, 1))\n",
"tracks_b.append(draw_arc(coil_angles[2], pad_angle, pad_connection_point_x, 1))\n",
"\n",
"\n", "\n",
"# dump out the json version\n", "# dump out the json version\n",
"json_result = dump_json(\n", "json_result = dump_json(\n",

View file

@ -45,39 +45,41 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"# Track width and spacing\n",
"TRACK_WIDTH = 0.127\n",
"TRACK_SPACING = 0.127\n",
"\n",
"# via defaults\n",
"VIA_DIAM = 0.8\n", "VIA_DIAM = 0.8\n",
"VIA_DRILL = 0.4\n", "VIA_DRILL = 0.4\n",
"\n",
"# this is for a 1.27mm pitch pin\n", "# this is for a 1.27mm pitch pin\n",
"PIN_DIAM = 1.0\n", "PIN_DIAM = 1.0\n",
"PIN_DRILL = 0.65\n", "PIN_DRILL = 0.65\n",
"\n", "\n",
"# this is for the PCB connector - see https://www.farnell.com/datasheets/2003059.pdf\n", "# this is for the PCB connector - see https://www.farnell.com/datasheets/2003059.pdf\n",
"PAD_WIDTH = 6\n", "PAD_WIDTH = 3\n",
"PAD_HEIGHT = 2\n", "PAD_HEIGHT = 2\n",
"PAD_PITCH = 2.5\n", "PAD_PITCH = 2.5\n",
"\n", "\n",
"# PCB Edge size\n", "# PCB Edge size\n",
"STATOR_RADIUS = 23\n", "STATOR_RADIUS = 25\n",
"SCREW_HOLE_RADIUS = 20\n",
"SCREW_HOLE_DRILL_DIAM = 2.3 # 2.3mm drill for a 2mm screw\n",
"STATOR_HOLE_RADIUS = 5.5\n", "STATOR_HOLE_RADIUS = 5.5\n",
"\n", "\n",
"# where to put the input pads\n", "# where to puth the mounting pins\n",
"INPUT_PAD_RADIUS = 19.5\n", "SCREW_HOLE_DRILL_DIAM = 2.3 # 2.3mm drill for a 2mm screw\n",
"SCREW_HOLE_RADIUS = STATOR_RADIUS\n",
"\n", "\n",
"# Track width and spacing\n", "# where to put the input pads\n",
"TRACK_WIDTH = 0.127\n", "INPUT_PAD_RADIUS = STATOR_RADIUS - (PAD_WIDTH / 2 + VIA_DIAM + TRACK_SPACING)\n",
"TRACK_SPACING = 0.127\n",
"\n", "\n",
"# Coil params\n", "# Coil params\n",
"TURNS = 18\n", "TURNS = 24\n",
"COIL_CENTER_RADIUS = 12.2\n", "COIL_CENTER_RADIUS = 16\n",
"\n", "COIL_VIA_RADIUS = 17\n",
"# where do we want to stop routing any tracks?\n",
"MAX_TRACK_RADIUS = SCREW_HOLE_RADIUS - (SCREW_HOLE_DRILL_DIAM / 2 + TRACK_SPACING * 2)\n",
"\n", "\n",
"# where to place the pins\n", "# where to place the pins\n",
"CONNECTION_PINS_RADIUS = 16.5\n", "# CONNECTION_PINS_RADIUS = 16.5\n",
"\n", "\n",
"USE_SPIRAL = False\n", "USE_SPIRAL = False\n",
"\n", "\n",
@ -380,17 +382,19 @@
"vias.append(create_via(get_arc_point(angle_C_opp, COIL_CENTER_RADIUS)))\n", "vias.append(create_via(get_arc_point(angle_C_opp, COIL_CENTER_RADIUS)))\n",
"\n", "\n",
"# connect the front copper opposite coils together\n", "# connect the front copper opposite coils together\n",
"common_connection_radius = MAX_TRACK_RADIUS\n", "common_connection_radius = SCREW_HOLE_RADIUS - (\n",
" TRACK_SPACING + SCREW_HOLE_DRILL_DIAM / 2\n",
")\n",
"common_coil_connections_b = draw_arc(angle_A_opp, angle_C_opp, common_connection_radius)\n", "common_coil_connections_b = draw_arc(angle_A_opp, angle_C_opp, common_connection_radius)\n",
"coil_A_opp_f.append(get_arc_point(angle_A_opp, common_connection_radius))\n", "coil_A_opp_f.append(get_arc_point(angle_A_opp, common_connection_radius))\n",
"coil_B_opp_f.append(get_arc_point(angle_B_opp, common_connection_radius))\n", "coil_B_opp_f.append(get_arc_point(angle_B_opp, common_connection_radius))\n",
"coil_C_opp_f.append(get_arc_point(angle_C_opp, common_connection_radius))\n", "coil_C_opp_f.append(get_arc_point(angle_C_opp, common_connection_radius))\n",
"\n", "\n",
"tracks_b.append(common_coil_connections_b)\n", "tracks_f.append(common_coil_connections_b)\n",
"\n", "\n",
"vias.append(create_via(get_arc_point(angle_A_opp, common_connection_radius)))\n", "# vias.append(create_via(get_arc_point(angle_A_opp, common_connection_radius)))\n",
"vias.append(create_via(get_arc_point(angle_B_opp, common_connection_radius)))\n", "# vias.append(create_via(get_arc_point(angle_B_opp, common_connection_radius)))\n",
"vias.append(create_via(get_arc_point(angle_C_opp, common_connection_radius)))\n", "# vias.append(create_via(get_arc_point(angle_C_opp, common_connection_radius)))\n",
"\n", "\n",
"# wires for connecting to opposite coils\n", "# wires for connecting to opposite coils\n",
"connection_radius1 = STATOR_HOLE_RADIUS + (2 * TRACK_SPACING)\n", "connection_radius1 = STATOR_HOLE_RADIUS + (2 * TRACK_SPACING)\n",
@ -464,29 +468,64 @@
")\n", ")\n",
"pads.append(create_pad((PAD_PITCH, INPUT_PAD_RADIUS), PAD_HEIGHT, PAD_WIDTH, \"b\"))\n", "pads.append(create_pad((PAD_PITCH, INPUT_PAD_RADIUS), PAD_HEIGHT, PAD_WIDTH, \"b\"))\n",
"\n", "\n",
"# connect coil A to the top pad\n", "# connect coil A to the right pad\n",
"pad_connection_point_y = INPUT_PAD_RADIUS + PAD_WIDTH / 2 - VIA_DIAM\n", "pad_angle = np.rad2deg(np.arcsin(PAD_PITCH / INPUT_PAD_RADIUS))\n",
"input_pad_connection_radius = SCREW_HOLE_RADIUS + SCREW_HOLE_DRILL_DIAM / 2 + 0.5\n", "input_connection_radius = common_connection_radius - (TRACK_SPACING + VIA_DIAM / 2)\n",
"tracks_f.append(\n", "tracks_f.append(\n",
" draw_arc(angle_A, 80, input_pad_connection_radius, 5)\n", " draw_arc(angle_A, angle_A - 30, input_connection_radius, 1) + [coil_A_f[-1]]\n",
" + [(PAD_PITCH, pad_connection_point_y)]\n",
")\n", ")\n",
"# connect coil B to the middle pad\n", "vias.append(create_via(get_arc_point(angle_A - 30, input_connection_radius)))\n",
"tracks_f.append(\n", "tracks_b.append(\n",
" [(0, pad_connection_point_y)] + draw_arc(90, angle_B, INPUT_PAD_RADIUS, 5)\n", " [get_arc_point(angle_A - 30, input_connection_radius)]\n",
" + draw_arc(angle_A - 30, 90 - pad_angle, common_connection_radius, 1)\n",
")\n", ")\n",
"# connect coil C to the bottom pad\n",
"tracks_f.append(\n",
" [(-PAD_PITCH, pad_connection_point_y)]\n",
" + draw_arc(100, angle_C, input_pad_connection_radius, 5)\n",
")\n",
"coil_A_f.append(get_arc_point(angle_A, input_pad_connection_radius))\n",
"coil_B_f.append(get_arc_point(angle_B, INPUT_PAD_RADIUS))\n",
"coil_C_f.append(get_arc_point(angle_C, input_pad_connection_radius))\n",
"\n", "\n",
"vias.append(create_via((-PAD_PITCH, pad_connection_point_y)))\n", "# connect the C coil to the left pad\n",
"vias.append(create_via((0, pad_connection_point_y)))\n", "tracks_f.append(\n",
"vias.append(create_via((PAD_PITCH, pad_connection_point_y)))" " draw_arc(angle_C, angle_C - 30, input_connection_radius, 1) + [coil_C_f[-1]]\n",
")\n",
"vias.append(create_via(get_arc_point(angle_C - 30, input_connection_radius)))\n",
"tracks_b.append(\n",
" draw_arc(angle_C - 30, 90 + pad_angle, common_connection_radius, 1)\n",
" + [get_arc_point(angle_C - 30, input_connection_radius)]\n",
")\n",
"\n",
"# connect the B coil to the middle pad\n",
"tracks_f.append(\n",
" [get_arc_point(90, input_connection_radius - (PAD_WIDTH))]\n",
" + draw_arc(angle_B, angle_B - 30, input_connection_radius, 1)\n",
" + [coil_B_f[-1]]\n",
")\n",
"vias.append(create_via(get_arc_point(90, input_connection_radius - (PAD_WIDTH))))\n",
"tracks_b.append(\n",
" [\n",
" get_arc_point(90, input_connection_radius - (PAD_WIDTH)),\n",
" get_arc_point(angle_B - 30, input_connection_radius),\n",
" ]\n",
")\n",
"\n",
"# pad_connection_point_y = SCREW_HOLE_RADIUS - (TRACK_SPACING + SCREW_HOLE_DRILL_DIAM / 2)\n",
"# input_pad_connection_radius = SCREW_HOLE_RADIUS - (TRACK_SPACING + SCREW_HOLE_DRILL_DIAM / 2)\n",
"# tracks_f.append(\n",
"# draw_arc(angle_A, 80, input_pad_connection_radius, 5)\n",
"# + [(PAD_PITCH, pad_connection_point_y)]\n",
"# )\n",
"# # connect coil B to the middle pad\n",
"# tracks_f.append(\n",
"# [(0, pad_connection_point_y)] + draw_arc(90, angle_B, INPUT_PAD_RADIUS, 5)\n",
"# )\n",
"# # connect coil C to the bottom pad\n",
"# tracks_f.append(\n",
"# [(-PAD_PITCH, pad_connection_point_y)]\n",
"# + draw_arc(100, angle_C, input_pad_connection_radius, 5)\n",
"# )\n",
"# coil_A_f.append(get_arc_point(angle_A, input_pad_connection_radius))\n",
"# coil_B_f.append(get_arc_point(angle_B, INPUT_PAD_RADIUS))\n",
"# coil_C_f.append(get_arc_point(angle_C, input_pad_connection_radius))\n",
"\n",
"# vias.append(create_via((-PAD_PITCH, pad_connection_point_y)))\n",
"# vias.append(create_via((0, pad_connection_point_y)))\n",
"# vias.append(create_via((PAD_PITCH, pad_connection_point_y)))"
] ]
}, },
{ {

View file

@ -1,5 +1,6 @@
import numpy as np import numpy as np
# get the point on an arc at the given angle # get the point on an arc at the given angle
def get_arc_point(angle, radius): def get_arc_point(angle, radius):
return ( return (
@ -10,6 +11,10 @@ def get_arc_point(angle, radius):
# draw an arc # draw an arc
def draw_arc(start_angle, end_angle, radius, step=10): def draw_arc(start_angle, end_angle, radius, step=10):
# make sure start_angle is less then end_angle
if start_angle > end_angle:
start_angle, end_angle = end_angle, start_angle
points = [] points = []
for angle in np.arange(start_angle, end_angle + step, step): for angle in np.arange(start_angle, end_angle + step, step):
x = radius * np.cos(np.deg2rad(angle)) x = radius * np.cos(np.deg2rad(angle))
@ -29,6 +34,18 @@ def rotate(points, angle):
] ]
# rotate a point
def rotate_point(x, y, angle, ox=0, oy=0):
x -= ox
y -= oy
qx = x * np.cos(np.deg2rad(angle)) - y * np.sin(np.deg2rad(angle))
qy = x * np.sin(np.deg2rad(angle)) + y * np.cos(np.deg2rad(angle))
qx += ox
qy += oy
return qx, qy
# move the points out to the distance at the requited angle # move the points out to the distance at the requited angle
def translate(points, distance, angle): def translate(points, distance, angle):
return [ return [

View file

@ -3,6 +3,8 @@ import pandas as pd
import numpy as np import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from helpers import rotate
def create_pin(radius, angle, name): def create_pin(radius, angle, name):
return { return {
@ -12,13 +14,14 @@ def create_pin(radius, angle, name):
} }
def create_pad(point, width, height, layer): def create_pad(point, width, height, layer, angle=0):
return { return {
"x": point[0], "x": point[0],
"y": point[1], "y": point[1],
"width": width, "width": width,
"height": height, "height": height,
"layer": layer, "layer": layer,
"angle": angle,
} }
@ -141,6 +144,8 @@ def plot_json(json_result):
pad["height"], pad["height"],
fill=True, fill=True,
color=color, color=color,
# rotate by the angle
angle=pad["angle"],
) )
) )