pcb-stator-coil-generator/coil.ipynb

400 lines
221 KiB
Text
Raw Normal View History

2022-10-01 20:09:14 +00:00
{
"cells": [
{
"cell_type": "code",
2022-10-04 17:43:35 +00:00
"execution_count": 110,
2022-10-01 20:09:14 +00:00
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib as plt\n",
2022-10-04 17:43:35 +00:00
"import scipy\n",
2022-10-02 19:15:44 +00:00
"from skspatial.objects import LineSegment\n",
"from enum import Enum"
2022-10-01 20:09:14 +00:00
]
},
{
"cell_type": "code",
2022-10-04 17:43:35 +00:00
"execution_count": 111,
2022-10-02 18:46:28 +00:00
"metadata": {},
"outputs": [],
"source": [
2022-10-04 17:43:35 +00:00
"VIA_DIAM = 0.8\n",
"VIA_DRILL = 0.4\n",
"STATOR_HOLE_RADIUS = 4\n",
"TRACK_WIDTH = 0.2\n",
"TRACK_SPACING = 0.2\n",
2022-10-02 18:46:28 +00:00
"TURNS = 9\n",
2022-10-02 19:15:44 +00:00
"STATOR_RADIUS = 20\n",
"Layer = Enum('Layer', 'FRONT BACK')"
2022-10-02 18:46:28 +00:00
]
},
{
"cell_type": "code",
2022-10-04 17:43:35 +00:00
"execution_count": 112,
2022-10-01 20:09:14 +00:00
"metadata": {},
"outputs": [],
"source": [
"# create a square shape\n",
"# template = [(-1, -1), (1, -1), (1, 1), (-1 , 1)]\n",
2022-10-01 20:09:14 +00:00
"# create a triangle\n",
2022-10-02 18:46:28 +00:00
"template = [[-1.5, 0], (1, -1.4), (1, 1.4)]\n",
2022-10-01 20:09:14 +00:00
"# interpolate the shape using numpy\n",
"\n",
"# create a circle template\n",
"# template = [(np.cos(theta), np.sin(theta)) for theta in np.linspace(0, 2*np.pi, 36)]\n",
"\n"
]
},
{
"cell_type": "code",
2022-10-04 17:43:35 +00:00
"execution_count": 113,
2022-10-01 20:09:14 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2022-10-04 17:43:35 +00:00
"[<matplotlib.lines.Line2D at 0x292a54040>]"
2022-10-01 20:09:14 +00:00
]
},
2022-10-04 17:43:35 +00:00
"execution_count": 113,
2022-10-01 20:09:14 +00:00
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2022-10-02 18:46:28 +00:00
"image/png": "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
2022-10-01 20:09:14 +00:00
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot the template shape wrapping around to the first point\n",
"plt.pyplot.plot([x for x, y in template] + [template[0][0]], [y for x, y in template] + [template[0][1]])"
]
},
{
"cell_type": "code",
2022-10-04 17:43:35 +00:00
"execution_count": 114,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2022-10-04 17:43:35 +00:00
"[<matplotlib.lines.Line2D at 0x17f820af0>]"
]
},
2022-10-04 17:43:35 +00:00
"execution_count": 114,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2022-10-02 18:46:28 +00:00
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# apply Chaikin's algorithm to the template - corner cuttine\n",
"def chaikin(arr, iterations):\n",
" if iterations == 0:\n",
" return arr\n",
" l = len(arr)\n",
" smoothed = []\n",
" for i in range(l):\n",
" x1, y1 = arr[i]\n",
" x2, y2 = arr[(i+1)%l]\n",
" smoothed.append([0.9*x1 + 0.1*x2,0.9*y1 + 0.1*y2])\n",
" smoothed.append([0.1*x1 + 0.9*x2,0.1*y1 + 0.9*y2])\n",
" return chaikin(smoothed, iterations - 1)\n",
"\n",
2022-10-02 15:50:49 +00:00
"template = chaikin(template, 2)\n",
"plt.pyplot.plot([x for x, y in template] + [template[0][0]], [y for x, y in template] + [template[0][1]]) "
]
},
{
"cell_type": "code",
2022-10-04 17:43:35 +00:00
"execution_count": 115,
2022-10-01 20:09:14 +00:00
"metadata": {},
"outputs": [],
"source": [
2022-10-02 15:50:49 +00:00
"# this speeds things up dramatically as we only have to compute the line intersections once\n",
"# there are probably much faster ways of doing this - we're just doing a brute force search\n",
"# for the intersections - consult algorithms from games for inspiration...\n",
"def get_template_point_cache(template):\n",
" # sweep a line from the origin through 360 degress times the number of turns in 1 degree increments\n",
" # and find the intersection points with the template shape\n",
" cache = {}\n",
2022-10-04 17:43:35 +00:00
" for angle in np.arange(0, 360, 5):\n",
2022-10-02 15:50:49 +00:00
" line = LineSegment(np.array([0, 0]), np.array([1000 * np.cos(np.deg2rad(angle)), 1000 * np.sin(np.deg2rad(angle))]))\n",
" for i in range(len(template)):\n",
" segment = LineSegment(np.array(template[i]), np.array(template[(i + 1) % len(template)]))\n",
" try:\n",
" intersection = line.intersect_line_segment(segment)\n",
" if intersection is not None:\n",
" cache[angle] = (intersection, segment)\n",
" except ValueError:\n",
" pass\n",
" return cache\n",
2022-10-01 20:09:14 +00:00
"\n",
2022-10-02 19:15:44 +00:00
"# get the points in a coil shape\n",
"# Use reverse for bottom layer (basically flips the y coordinate so that the coil goes in the opposite direction)\n",
"# Also rotates the endpoints by 90 degress so that the exit point on the bottom layer is to the left hand side\n",
"def get_points(template, turns, spacing, layer=Layer.FRONT, cache = None):\n",
2022-10-02 15:50:49 +00:00
" if cache is None:\n",
" cache = get_template_point_cache(template)\n",
" points = []\n",
2022-10-04 17:43:35 +00:00
" for angle in np.arange(0, 360 * turns, 5):\n",
2022-10-02 15:50:49 +00:00
" offset = spacing * angle / 360\n",
2022-10-02 19:15:44 +00:00
" if layer == Layer.BACK:\n",
" angle = angle + 180\n",
" intersection, segment = cache[angle % 360]\n",
2022-10-02 15:50:49 +00:00
" vector = np.array(segment.point_a) - np.array(segment.point_b)\n",
" normal = vector / np.linalg.norm(vector)\n",
" # rotate the vector 90 degrees\n",
" normal = np.array([-normal[1], normal[0]])\n",
" # move the intersection point along the normal vector by the spacing\n",
2022-10-02 19:15:44 +00:00
" coil_point = intersection + normal * offset\n",
" if layer == Layer.BACK:\n",
" points.append((coil_point[0], -coil_point[1]))\n",
" else:\n",
" points.append(coil_point)\n",
2022-10-02 15:50:49 +00:00
" return points\n"
]
},
{
"cell_type": "code",
2022-10-04 17:43:35 +00:00
"execution_count": 116,
2022-10-02 15:50:49 +00:00
"metadata": {},
"outputs": [],
"source": [
"cache = get_template_point_cache(template)"
]
},
{
"cell_type": "code",
2022-10-04 17:43:35 +00:00
"execution_count": 117,
2022-10-02 15:50:49 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2022-10-04 17:43:35 +00:00
"(4.691111111111111, 14.908888888888889, -4.82499131160701, 4.702749879705302)"
2022-10-02 15:50:49 +00:00
]
},
2022-10-04 17:43:35 +00:00
"execution_count": 117,
2022-10-02 15:50:49 +00:00
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2022-10-04 17:43:35 +00:00
"image/png": "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
2022-10-02 19:15:44 +00:00
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2022-10-04 17:43:35 +00:00
"image/png": "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
2022-10-02 15:50:49 +00:00
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2022-10-04 17:43:35 +00:00
"points_f = [(0,0)] + get_points(template, TURNS, TRACK_SPACING+TRACK_WIDTH, Layer.FRONT, cache) \n",
"points_b = [(0,0)] + get_points(template, TURNS, TRACK_SPACING+TRACK_WIDTH, Layer.BACK, cache)\n",
2022-10-02 15:50:49 +00:00
"\n",
"COIL_CENTER_RADIUS = STATOR_RADIUS/2\n",
"\n",
"angle_A = 0\n",
"angle_B = 120\n",
"angle_C = 240\n",
"\n",
"# roate the points by the required angle\n",
"def rotate(points, angle):\n",
" return [[x * np.cos(np.deg2rad(angle)) - y * np.sin(np.deg2rad(angle)), x * np.sin(np.deg2rad(angle)) + y * np.cos(np.deg2rad(angle))] for x, y in points]\n",
"\n",
"# move the points out to the distance at the requited angle\n",
"def translate(points, distance, angle):\n",
" return [[x + distance * np.cos(np.deg2rad(angle)), y + distance * np.sin(np.deg2rad(angle))] for x, y in points]\n",
"\n",
2022-10-04 17:43:35 +00:00
"# flip the y coordinate\n",
"def flip(points):\n",
" return [[x, -y] for x, y in points]\n",
"\n",
"# the main coils\n",
2022-10-02 19:15:44 +00:00
"coil_A_f = translate(rotate(points_f, angle_A), COIL_CENTER_RADIUS, angle_A)\n",
"coil_A_b = translate(rotate(points_b, angle_A), COIL_CENTER_RADIUS, angle_A)\n",
2022-10-02 15:50:49 +00:00
"\n",
2022-10-04 17:43:35 +00:00
"coil_B_f = translate(rotate(points_f, angle_B), COIL_CENTER_RADIUS, angle_B)\n",
"coil_B_b = translate(rotate(points_b, angle_B), COIL_CENTER_RADIUS, angle_B)\n",
"\n",
"coil_C_f = translate(rotate(points_f, angle_C), COIL_CENTER_RADIUS, angle_C)\n",
"coil_C_b = translate(rotate(points_b, angle_C), COIL_CENTER_RADIUS, angle_C)\n",
"\n",
"# the opposite coils - for more power!\n",
"angle_A_opp = angle_A + 180\n",
"angle_B_opp = angle_B + 180\n",
"angle_C_opp = angle_C + 180\n",
"\n",
"coil_A_opp_f = translate(\n",
" rotate(\n",
" flip(points_f),\n",
" angle_A_opp\n",
" ), \n",
" COIL_CENTER_RADIUS, \n",
" angle_A_opp)\n",
"coil_A_opp_b = translate(\n",
" rotate(\n",
" flip(points_b), \n",
" angle_A_opp\n",
" ), \n",
" COIL_CENTER_RADIUS,\n",
" angle_A_opp)\n",
"\n",
"coil_B_opp_f = translate(\n",
" rotate(\n",
" flip(points_f),\n",
" angle_B_opp\n",
" ), COIL_CENTER_RADIUS, angle_B_opp)\n",
"coil_B_opp_b = translate(rotate(flip(points_b), angle_B_opp), COIL_CENTER_RADIUS, angle_B_opp)\n",
"\n",
"coil_C_opp_f = translate(rotate(flip(points_f), angle_C_opp), COIL_CENTER_RADIUS, angle_C_opp)\n",
"coil_C_opp_b = translate(rotate(flip(points_b), angle_C_opp), COIL_CENTER_RADIUS, angle_C_opp)\n",
"\n",
"\n",
"# dump out the results to json\n",
"json_result = {\n",
" \"parameters\": {\n",
" \"trackWidth\": TRACK_WIDTH,\n",
" \"statorHoleRadius\": STATOR_HOLE_RADIUS,\n",
" \"viaDiameter\": VIA_DIAM,\n",
" \"viaDrillDiameter\": VIA_DRILL\n",
"\n",
" },\n",
" \"vias\": [\n",
" { \"x\": COIL_CENTER_RADIUS*np.cos(np.deg2rad(angle_A)), \"y\": COIL_CENTER_RADIUS*np.sin(np.deg2rad(angle_A)) },\n",
" { \"x\": COIL_CENTER_RADIUS*np.cos(np.deg2rad(angle_B)), \"y\": COIL_CENTER_RADIUS*np.sin(np.deg2rad(angle_B)) },\n",
" { \"x\": COIL_CENTER_RADIUS*np.cos(np.deg2rad(angle_C)), \"y\": COIL_CENTER_RADIUS*np.sin(np.deg2rad(angle_C)) }\n",
" ],\n",
" \"silk\": [\n",
" { \"x\": COIL_CENTER_RADIUS*np.cos(np.deg2rad(angle_A)), \"y\": COIL_CENTER_RADIUS*np.sin(np.deg2rad(angle_A)), \"text\": \"A\" },\n",
" { \"x\": COIL_CENTER_RADIUS*np.cos(np.deg2rad(angle_B)), \"y\": COIL_CENTER_RADIUS*np.sin(np.deg2rad(angle_B)), \"text\": \"B\" },\n",
" { \"x\": COIL_CENTER_RADIUS*np.cos(np.deg2rad(angle_C)), \"y\": COIL_CENTER_RADIUS*np.sin(np.deg2rad(angle_C)), \"text\": \"C\" }\n",
" ],\n",
" \"tracks\": [\n",
" {\n",
" \"name\": \"Coil A\",\n",
" \"net\": \"A\",\n",
" \"f\": [{\"x\": x, \"y\": y} for x, y in coil_A_f],\n",
" \"b\": [{\"x\": x, \"y\": y} for x, y in coil_A_b],\n",
" },\n",
" {\n",
" \"name\": \"Coil A Opposite\",\n",
" \"net\": \"A\",\n",
" \"f\": [{\"x\": x, \"y\": y} for x, y in coil_A_opp_f],\n",
" \"b\": [{\"x\": x, \"y\": y} for x, y in coil_A_opp_b],\n",
" },\n",
" {\n",
" \"name\": \"Coil B\",\n",
" \"net\": \"B\",\n",
" \"f\": [{\"x\": x, \"y\": y} for x, y in coil_B_f],\n",
" \"b\": [{\"x\": x, \"y\": y} for x, y in coil_B_b],\n",
" },\n",
" {\n",
" \"name\": \"Coild B Opposite\",\n",
" \"net\": \"B\",\n",
" \"f\": [{\"x\": x, \"y\": y} for x, y in coil_B_opp_f],\n",
" \"b\": [{\"x\": x, \"y\": y} for x, y in coil_B_opp_b],\n",
" },\n",
" {\n",
" \"name\": \"Coil C\",\n",
" \"net\": \"C\",\n",
" \"f\": [{\"x\": x, \"y\": y} for x, y in coil_C_f],\n",
" \"b\": [{\"x\": x, \"y\": y} for x, y in coil_C_b],\n",
" },\n",
" {\n",
" \"name\": \"Coil C Opposite\",\n",
" \"net\": \"C\",\n",
" \"f\": [{\"x\": x, \"y\": y} for x, y in coil_C_opp_f],\n",
" \"b\": [{\"x\": x, \"y\": y} for x, y in coil_C_opp_b],\n",
" }\n",
" ]\n",
"}\n",
"\n",
"import json\n",
"json.dump(json_result, open(\"coil.json\", \"w\"))\n",
"\n",
"\n",
2022-10-02 19:15:44 +00:00
"df = pd.DataFrame(coil_A_f, columns=['x', 'y'])\n",
2022-10-02 15:50:49 +00:00
"ax = df.plot.line(x='x', y='y', label='Coil A', color='blue')\n",
"ax.axis('equal')\n",
2022-10-02 19:15:44 +00:00
"df = pd.DataFrame(coil_A_b, columns=['x', 'y'])\n",
"ax = df.plot.line(x='x', y='y', label='Coil B', color='green')\n",
"ax.axis('equal')\n",
"\n",
"# plot all three coils on the same graph\n",
"# df = pd.DataFrame(coil_A, columns=['x', 'y'])\n",
"# ax = df.plot.line(x='x', y='y', label='Coil A', color='blue')\n",
"# ax.axis('equal')\n",
"# df = pd.DataFrame(coil_B, columns=['x', 'y'])\n",
"# df.plot.line(x='x', y='y', ax=ax, label='Coil B', color='green')\n",
"# df = pd.DataFrame(coil_C, columns=['x', 'y'])\n",
"# df.plot.line(x='x', y='y', ax=ax, label='Coil C', color='red')\n",
2022-10-02 15:50:49 +00:00
"\n",
2022-10-02 19:15:44 +00:00
"# df = pd.DataFrame(coil_A_opposite, columns=['x', 'y'])\n",
"# df.plot.line(x='x', y='y', ax=ax, label='Coil A Opposite', color='blue')\n",
"# df = pd.DataFrame(coil_B_opposite, columns=['x', 'y'])\n",
"# df.plot.line(x='x', y='y', ax=ax, label='Coil B Opposite', color='green')\n",
"# df = pd.DataFrame(coil_C_opposite, columns=['x', 'y'])\n",
"# df.plot.line(x='x', y='y', ax=ax, label='Coil C Opposite', color='red')\n",
2022-10-02 15:50:49 +00:00
"\n"
]
2022-10-01 20:09:14 +00:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.10.7 ('venv': venv)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.7"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "1ce20143987840b9786ebb5907032c9c3a8efacbb887dbb0ebc4934f2ad26cb3"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}