diff --git a/coil_generator-12.ipynb b/coil_generator-12.ipynb index e2112a8..bf2f890 100644 --- a/coil_generator-12.ipynb +++ b/coil_generator-12.ipynb @@ -22,6 +22,7 @@ " flip_x,\n", " optimize_points,\n", " chaikin,\n", + " rotate_point,\n", ")\n", "from pcb_json import (\n", " dump_json,\n", @@ -46,42 +47,45 @@ "metadata": {}, "outputs": [], "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_DRILL = 0.4\n", + "\n", "# this is for a 1.27mm pitch pin\n", "PIN_DIAM = 1.0\n", "PIN_DRILL = 0.65\n", "\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_PITCH = 2.5\n", "\n", - "# where to put the input pads\n", - "INPUT_PAD_RADIUS = 19.5\n", - "\n", "# PCB Edge size\n", - "STATOR_RADIUS = 23\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_RADIUS = 25\n", "STATOR_HOLE_RADIUS = 5.5\n", "\n", - "# Track width and spacing\n", - "TRACK_WIDTH = 0.127\n", - "TRACK_SPACING = 0.127\n", + "# where to puth the mounting pins\n", + "SCREW_HOLE_DRILL_DIAM = 2.3 # 2.3mm drill for a 2mm screw\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", "# Coil params\n", - "TURNS = 9\n", - "COIL_CENTER_RADIUS = 11.8\n", - "COIL_VIA_RADIUS = 12.8\n", + "TURNS = 12\n", + "COIL_CENTER_RADIUS = 16\n", + "COIL_VIA_RADIUS = 17\n", "\n", "# where to place the pins\n", "# CONNECTION_PINS_RADIUS = 16.5\n", "\n", "USE_SPIRAL = False\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", "# template must also be convex\n", "template = [\n", - " (-1.5, 0),\n", - " (-1.5, -0.1),\n", - " (1.9, -0.8),\n", + " (-3.5, 0),\n", + " (-3.5, -0.01),\n", + " (1.9, -1.45),\n", " (1.9, 0.0),\n", - " (1.9, 0.8),\n", - " (-1.5, 0.1),\n", + " (1.9, 1.45),\n", + " (-3.5, 0.01),\n", "]" ] }, @@ -264,37 +268,28 @@ "mounting_holes = []\n", "silk = []\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", - "# angle_B = 120\n", - "# pads.append(create_pad(CONNECTION_PINS_RADIUS, angle_B - 30, \"B\"))\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", + "# shift the coils aronnd to make connections a bit easier\n", + "COIL_ROTATION = -360 / 12\n", "\n", + "coil_angles = []\n", + "for i in range(12):\n", + " angle = i * 360 / 12 + COIL_ROTATION\n", + " coil_angles.append(angle)\n", "\n", "# the main coils\n", "coil_labels = [\"A\", \"B\", \"C\"]\n", "coils_f = []\n", "coils_b = []\n", "for i in range(12):\n", - " angle = i * 360 / 12\n", + " angle = coil_angles[i]\n", " if (i // 3) % 2 == 0:\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", " else:\n", " # slightly nudge the coils so that they don't overlap when flipped\n", - " coil_A_f = translate(\n", - " rotate(flip_y(points_f), angle - 2), COIL_CENTER_RADIUS, angle\n", - " )\n", - " coil_A_b = translate(\n", - " rotate(flip_y(points_b), angle - 2), COIL_CENTER_RADIUS, angle\n", - " )\n", + " coil_A_f = translate(rotate(flip_y(points_f), angle), COIL_CENTER_RADIUS, angle)\n", + " coil_A_b = translate(rotate(flip_y(points_b), angle), COIL_CENTER_RADIUS, angle)\n", " # keep track of the coils\n", " coils_f.append(coil_A_f)\n", " coils_b.append(coil_A_b)\n", @@ -312,15 +307,15 @@ "# create tracks to link the A coils around the center\n", "connection_via_radius_A = connection_radius1 + 3 * TRACK_SPACING + VIA_DIAM / 2\n", "coil_A1_A2_inner = (\n", - " [get_arc_point(0, connection_via_radius_A)]\n", - " + draw_arc(0, 3 * 360 / 12, connection_radius1)\n", - " + [get_arc_point(3 * 360 / 12, connection_via_radius_A)]\n", + " [get_arc_point(coil_angles[0], connection_via_radius_A)]\n", + " + draw_arc(COIL_ROTATION, coil_angles[3], connection_radius1)\n", + " + [get_arc_point(coil_angles[3], connection_via_radius_A)]\n", ")\n", "tracks_f.append(coil_A1_A2_inner)\n", "coil_A3_A4_inner = (\n", - " [get_arc_point(6 * 360 / 12, connection_via_radius_A)]\n", - " + draw_arc(6 * 360 / 12, 9 * 360 / 12, connection_radius1)\n", - " + [get_arc_point(9 * 360 / 12, connection_via_radius_A)]\n", + " [get_arc_point(coil_angles[6], connection_via_radius_A)]\n", + " + draw_arc(coil_angles[6], coil_angles[9], connection_radius1)\n", + " + [get_arc_point(coil_angles[9], connection_via_radius_A)]\n", ")\n", "tracks_f.append(coil_A3_A4_inner)\n", "# connect up the bottoms of the A coils\n", @@ -335,9 +330,9 @@ "vias.append(create_via(coil_A3_A4_inner[-1]))\n", "\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", - "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", "# connect up the bottoms of the A coils\n", "coils_b[1].append(coil_B1_B2_inner[0])\n", @@ -347,9 +342,9 @@ "\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", - "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", - "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", "# connect up the bottoms of the B coils\n", "coils_b[2].append(coil_C1_C2_inner[0])\n", @@ -364,49 +359,54 @@ "\n", "# connect the last three coils together\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", - "coils_f[9].append(get_arc_point(9 * 360 / 12, common_connection_radius))\n", - "coils_f[10].append(get_arc_point(10 * 360 / 12, common_connection_radius))\n", - "coils_f[11].append(get_arc_point(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(coil_angles[9], 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(coil_angles[11], common_connection_radius))\n", "\n", "# connect the outer A coils together\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", - "coils_f[3].append(get_arc_point(3 * 360 / 12, outer_connection_radius_A))\n", - "coils_f[6].append(get_arc_point(6 * 360 / 12, outer_connection_radius_A))\n", + "outer_connection_radius_A = SCREW_HOLE_RADIUS - (SCREW_HOLE_DRILL_DIAM / 2 + 0.5)\n", + "tracks_f.append(draw_arc(coil_angles[3], coil_angles[6], 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(coil_angles[6], outer_connection_radius_A))\n", "\n", "# connect the outer B coils together\n", "outer_connection_radius_B = outer_connection_radius_A - TRACK_SPACING - VIA_DIAM / 2\n", "tracks_b.append(\n", - " [get_arc_point(4 * 360 / 12, outer_connection_radius_B)]\n", - " + draw_arc(4 * 360 / 12, 7 * 360 / 12, outer_connection_radius_A)\n", - " + [get_arc_point(7 * 360 / 12, outer_connection_radius_B)]\n", + " [get_arc_point(coil_angles[4], outer_connection_radius_B)]\n", + " + draw_arc(coil_angles[4], coil_angles[7], outer_connection_radius_A)\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", - "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", "# 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", - "tracks_b.append(draw_arc(5 * 360 / 12, 8 * 360 / 12, outer_connection_radius_C))\n", - "coils_f[5].append(get_arc_point(5 * 360 / 12, outer_connection_radius_C))\n", - "coils_f[8].append(get_arc_point(8 * 360 / 12, outer_connection_radius_C))\n", - "vias.append(create_via(get_arc_point(5 * 360 / 12, outer_connection_radius_C)))\n", - "vias.append(create_via(get_arc_point(8 * 360 / 12, outer_connection_radius_C)))\n", - "\n", - "# create pins for the input\n", - "# for angle in range(0, 360, 15):\n", - "# pins.append(create_pin(CONNECTION_PINS_RADIUS, angle, \"A\"))\n", - "\n", - "# coils_f[0].append(get_arc_point(0, CONNECTION_PINS_RADIUS))\n", - "# coils_f[1].append(get_arc_point(1 * 360 / 12, CONNECTION_PINS_RADIUS))\n", - "# coils_f[2].append(get_arc_point(2 * 360 / 12, CONNECTION_PINS_RADIUS))\n", - "\n", - "# coils_f[0].append(get_arc_point(15, CONNECTION_PINS_RADIUS))\n", - "# coils_f[1].append(get_arc_point(15 + 1 * 360 / 12, CONNECTION_PINS_RADIUS))\n", - "# coils_f[2].append(get_arc_point(15 + 2 * 360 / 12, CONNECTION_PINS_RADIUS))\n", + "outer_connection_radius_C = outer_connection_radius_B - TRACK_SPACING - VIA_DIAM / 2\n", + "tracks_b.append(\n", + " draw_arc(\n", + " 5 * 360 / 12 + COIL_ROTATION,\n", + " 8 * 360 / 12 + COIL_ROTATION,\n", + " outer_connection_radius_C,\n", + " )\n", + ")\n", + "coils_f[5].append(\n", + " get_arc_point(5 * 360 / 12 + COIL_ROTATION, outer_connection_radius_C)\n", + ")\n", + "coils_f[8].append(\n", + " get_arc_point(8 * 360 / 12 + COIL_ROTATION, outer_connection_radius_C)\n", + ")\n", + "vias.append(\n", + " create_via(get_arc_point(5 * 360 / 12 + COIL_ROTATION, outer_connection_radius_C))\n", + ")\n", + "vias.append(\n", + " create_via(get_arc_point(8 * 360 / 12 + COIL_ROTATION, outer_connection_radius_C))\n", + ")\n", "\n", "# create mounting holes at 45 degree angles\n", "mounting_holes = [\n", @@ -428,20 +428,16 @@ "pads.append(create_pad((INPUT_PAD_RADIUS, PAD_PITCH), PAD_WIDTH, PAD_HEIGHT, \"b\"))\n", "\n", "# connect coil A to the top pad\n", - "pad_connection_point_x = INPUT_PAD_RADIUS + PAD_WIDTH / 2 - VIA_DIAM\n", - "coils_f[0].append((pad_connection_point_x, -PAD_PITCH))\n", - "vias.append(create_via(((pad_connection_point_x, -PAD_PITCH))))\n", + "pad_connection_point_x = INPUT_PAD_RADIUS\n", + "pad_angle = np.rad2deg(np.arcsin(PAD_PITCH / pad_connection_point_x))\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", - "coils_f[1].append((pad_connection_point_x, 0))\n", - "vias.append(create_via(((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 + PAD_WIDTH / 2 + VIA_DIAM / 2, 0))))\n", "# connect coil C to the bottom pad\n", - "coils_f[2].append(\n", - " get_arc_point(\n", - " 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))))" + "coils_f[2].append(get_arc_point(coil_angles[2], pad_connection_point_x))\n", + "vias.append(create_via(get_arc_point(coil_angles[2], pad_connection_point_x)))" ] }, { @@ -454,8 +450,16 @@ "tracks_in1 = []\n", "tracks_in2 = []\n", "if LAYERS == 4:\n", - " tracks_in1 = tracks_b\n", - " tracks_in2 = tracks_f\n", + " tracks_in1 = tracks_b.copy()\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", "# dump out the json version\n", "json_result = dump_json(\n", diff --git a/coil_generator-6.ipynb b/coil_generator-6.ipynb index c65000d..bef5f6f 100644 --- a/coil_generator-6.ipynb +++ b/coil_generator-6.ipynb @@ -45,39 +45,41 @@ "metadata": {}, "outputs": [], "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_DRILL = 0.4\n", + "\n", "# this is for a 1.27mm pitch pin\n", "PIN_DIAM = 1.0\n", "PIN_DRILL = 0.65\n", "\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_PITCH = 2.5\n", "\n", "# PCB Edge size\n", - "STATOR_RADIUS = 23\n", - "SCREW_HOLE_RADIUS = 20\n", - "SCREW_HOLE_DRILL_DIAM = 2.3 # 2.3mm drill for a 2mm screw\n", + "STATOR_RADIUS = 25\n", "STATOR_HOLE_RADIUS = 5.5\n", "\n", - "# where to put the input pads\n", - "INPUT_PAD_RADIUS = 19.5\n", + "# where to puth the mounting pins\n", + "SCREW_HOLE_DRILL_DIAM = 2.3 # 2.3mm drill for a 2mm screw\n", + "SCREW_HOLE_RADIUS = STATOR_RADIUS\n", "\n", - "# Track width and spacing\n", - "TRACK_WIDTH = 0.127\n", - "TRACK_SPACING = 0.127\n", + "# where to put the input pads\n", + "INPUT_PAD_RADIUS = STATOR_RADIUS - (PAD_WIDTH / 2 + VIA_DIAM + TRACK_SPACING)\n", "\n", "# Coil params\n", - "TURNS = 18\n", - "COIL_CENTER_RADIUS = 12.2\n", - "\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", + "TURNS = 24\n", + "COIL_CENTER_RADIUS = 16\n", + "COIL_VIA_RADIUS = 17\n", "\n", "# where to place the pins\n", - "CONNECTION_PINS_RADIUS = 16.5\n", + "# CONNECTION_PINS_RADIUS = 16.5\n", "\n", "USE_SPIRAL = False\n", "\n", @@ -380,17 +382,19 @@ "vias.append(create_via(get_arc_point(angle_C_opp, COIL_CENTER_RADIUS)))\n", "\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", "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_C_opp_f.append(get_arc_point(angle_C_opp, common_connection_radius))\n", "\n", - "tracks_b.append(common_coil_connections_b)\n", + "tracks_f.append(common_coil_connections_b)\n", "\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_C_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_C_opp, common_connection_radius)))\n", "\n", "# wires for connecting to opposite coils\n", "connection_radius1 = STATOR_HOLE_RADIUS + (2 * TRACK_SPACING)\n", @@ -464,29 +468,64 @@ ")\n", "pads.append(create_pad((PAD_PITCH, INPUT_PAD_RADIUS), PAD_HEIGHT, PAD_WIDTH, \"b\"))\n", "\n", - "# connect coil A to the top pad\n", - "pad_connection_point_y = INPUT_PAD_RADIUS + PAD_WIDTH / 2 - VIA_DIAM\n", - "input_pad_connection_radius = SCREW_HOLE_RADIUS + SCREW_HOLE_DRILL_DIAM / 2 + 0.5\n", + "# connect coil A to the right pad\n", + "pad_angle = np.rad2deg(np.arcsin(PAD_PITCH / INPUT_PAD_RADIUS))\n", + "input_connection_radius = common_connection_radius - (TRACK_SPACING + VIA_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", + " draw_arc(angle_A, angle_A - 30, input_connection_radius, 1) + [coil_A_f[-1]]\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", + "vias.append(create_via(get_arc_point(angle_A - 30, input_connection_radius)))\n", + "tracks_b.append(\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", - "# 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)))" + "# connect the C coil to the left pad\n", + "tracks_f.append(\n", + " 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)))" ] }, { diff --git a/helpers.py b/helpers.py index 5df373e..d7b41e0 100644 --- a/helpers.py +++ b/helpers.py @@ -1,5 +1,6 @@ import numpy as np + # get the point on an arc at the given angle def get_arc_point(angle, radius): return ( @@ -10,6 +11,10 @@ def get_arc_point(angle, radius): # draw an arc 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 = [] for angle in np.arange(start_angle, end_angle + step, step): 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 def translate(points, distance, angle): return [ diff --git a/pcb_json.py b/pcb_json.py index b50b5a9..42f1b9d 100644 --- a/pcb_json.py +++ b/pcb_json.py @@ -3,6 +3,8 @@ import pandas as pd import numpy as np import matplotlib.pyplot as plt +from helpers import rotate + def create_pin(radius, angle, name): 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 { "x": point[0], "y": point[1], "width": width, "height": height, "layer": layer, + "angle": angle, } @@ -141,6 +144,8 @@ def plot_json(json_result): pad["height"], fill=True, color=color, + # rotate by the angle + angle=pad["angle"], ) )