pcb-stator-coil-generator/coil.ipynb

315 lines
286 KiB
Text
Raw Normal View History

2022-10-01 20:09:14 +00:00
{
"cells": [
{
"cell_type": "code",
2022-10-02 18:46:28 +00:00
"execution_count": 97,
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",
"from skspatial.objects import LineSegment"
]
},
{
"cell_type": "code",
2022-10-02 18:46:28 +00:00
"execution_count": 98,
"metadata": {},
"outputs": [],
"source": [
"SPACING = 0.4\n",
"TURNS = 9\n",
"STATOR_RADIUS = 20"
]
},
{
"cell_type": "code",
"execution_count": 99,
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-02 15:50:49 +00:00
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
2022-10-02 18:46:28 +00:00
"execution_count": 100,
2022-10-01 20:09:14 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2022-10-02 18:46:28 +00:00
"[<matplotlib.lines.Line2D at 0x146497820>]"
2022-10-01 20:09:14 +00:00
]
},
2022-10-02 18:46:28 +00:00
"execution_count": 100,
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-02 18:46:28 +00:00
"execution_count": 101,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2022-10-02 18:46:28 +00:00
"[<matplotlib.lines.Line2D at 0x14610a470>]"
]
},
2022-10-02 18:46:28 +00:00
"execution_count": 101,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2022-10-02 18:46:28 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAGdCAYAAADaPpOnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRi0lEQVR4nO3deXhU9b0/8PfMJDNZZ0KSyWQ5Q8gGgRASMhEMImsUARWEia21Vq3Vauv91eK1lXtbrfb20qrttbbeam9rqfdqazMgqCyWHREEM0lYAglkIZmTZLInk32b8/tj4lAqItFMzkzyfj1Pnod8zznJJ0xm5p3zOd/vUUiSJIGIiIjIRyjlLoCIiIhoNBheiIiIyKcwvBAREZFPYXghIiIin8LwQkRERD6F4YWIiIh8CsMLERER+RSGFyIiIvIpfnIXMNacTifq6uoQGhoKhUIhdzlERER0DSRJQmdnJ2JjY6FUXv3cyoQLL3V1dTAajXKXQURERF+AzWaDIAhX3WfChZfQ0FAArh9eq9XKXA0RERFdC4fDAaPR6H4fv5oJF14+aRVptVqGFyIiIh9zLZd88IJdIiIi8ikML0RERORTGF6IiIjIpzC8EBERkU9heCEiIiKfwvBCREREPoXhhYiIiHwKwwsRERH5FIYXIiIi8ikML0RERORTGF6IiIjIpzC8EBERkU+ZcDdmJCIi8nYDQ04UXGzFxxfbkKgPxk2zDAjwV8ldls9geCEiIhoHjZ19OFjWhAOljfjgQjO6+ofc27QBfrg9MxZmkxEZgu6a7qw8mSkkSZLkLmIsORwO6HQ6dHR0QKvVyl0OERFNUk6nhNO1Hdhf2ogDZY04JXZctj0yRI35CREoqmlDXUefezwlKgRmk4A7suIQFRow3mXLZjTv3wwvREREY6SzbxAfXGjG/tJGHCxrQnNX/2Xb0+N0WJoahWWpUZgTp4NSqYDTKeFoRQssVht2nbGjf8gJAFApFVg8XY88k4BlM6Og8ZvYbSWGF4YXIiIaB5IkoaKpGwdKG7G/tBEfX2zFkPPS22qIxg8LkyOxLDUKS2boEaW9+pkUR98gdpyqh8Uqwlrd5h4PC/LH2sw4mE0C0mK1E7KtxPDC8EJERB7SNziM41Wt7sBS09pz2fbEyGD32ZXrpoVD7ffFJvZWNHVhi1XE1sJa2B2X2kqp0aEwmwSsnRuHyBDNl/pZvAnDC8MLERGNIXtHH/aPhJUPy5vROzjs3qZWKTE/MRxLZ7gCy7TI4DH93sNOCUfKm5FfYMPfzzZgYKSt5KdUYGlqFMwmActSo+Cv8u3VTxheGF6IiOhLGHZKKLa1jQSWJpyrd1y23aDVYOmMKCxNjcLC5EgEa8Zn8m5HzyDeOVUHi1XESVu7ezwiWI01mXHIyxYwM8Y33/sYXhheiIholDp6BnHogmsq88GyRrT1DLq3KRRApjEMy0YCizdcd3K+odPVViqqRVPnpQuD02K1yDMJuD0zDuHBahkrHB2GF4YXIiL6HJIk4XxDl2sqc2kjrDVtGP6Hi221AX5YNF2PZalRWDxdjwgvvb5kaNiJwxeaYLGK2HO2AYPDrp/BX6VA7kwDzCYBi6fr4eflbSWGF4YXIiK6gt6BYRyrbB4JLE2obe+9bPt0Q4jrYtsZUTDFT/H6N/x/1tY9gHdO1iHfasOZ2kutrsgQDdZluWYrTTeEyljhZ2N4YXghIqIRYluPe2bQ0YoW9zoqAKDxU2JBUsTIVOYoGMODZKx0bJ2rd8BiFbGtqBYt3QPu8QxBB7NJwO0ZcdAF+ctY4eUYXhheiIgmraFhJ6zVbdhf5moHnW/oumx7XFgglqa62kE5iZEIVE/sxd8Gh504UNoIi1XE/tJG9zo0apUSN6UZkGcScGOKHiqlvNfwMLwwvBARTSpd/UPYc9aOfecacfh8Exx9l+4bpFIqYJo6xb32ynRDiOwX28qluasf24vrkF9gQ6m90z1u0GqwLkvA+iwByVEhstTG8MLwQkQ04TmdEo5XtcJiFbHrTD16Bi6tvTIlyB9LRmYGLU7Re1V7xBtIkoSSOldbaXtx7WUzq+ZODUOeyYhbM2KgDRi//zeGF4YXIqIJy9bagy2FIrYUirC1XrrgNjEyGCvTo7Es1YBMY5jsbRBf0T80jAOljcgvEHHwfJN7xpXGT4lbZkfjkSVJSI32/PspwwvDCxHRhNIzMIRdp+2wWEUcq2xxj4dq/HBrRgzMJiOypoZN2nbQWGns7MO2olrkF4i40Oi6VmhWjBY7v3ejx7/3aN6/x2dJQCIiolGSJAkF1W3IL7Bhx6l6dI+0hRQK4IakSJhNAlakRU/4C27HU1RoAB5alIQHb0zEh+Ut+Pofj+NCYyeGhp1eNW2c4YWIiLxKbXsv3i4UYbGKuNhy6aaH8RFBMGcJWGcSEBcWKGOFE59CocCCpAgE+CvRN+iEra0XCWN8z6Yvg+GFiIhk1zc4jPdL7MgvEPFhRTM+uaAhWK3C6jmuttB106awLTSOlEoFEiNDcLbegYrGLoYXIiIiSZJQWNMOi1XEeyfr0Nl/aXrz9YnhyDMZccvs6HG76SF9WlLUSHhp6kIuDHKX48bfCCIiGlf2jj5sLXK1hSqbut3jwpRArM8SYDYJE2qlW1+WpHedbalo6vqcPccXwwsREXlc3+Aw9p5rQH6BiA8uNOGT+x8G+quwMj0aZpOA6xMioOT0Zq+SpHctWFfxDyHTGzC8EBGRR0iShFNiByxWEe+crENH76WF0OZNC4fZJGDVnBiEsC3ktT4JL+WNXZAkyWuuOeJvDBERjalP1gqxWMXL7isUqwvAepNrCfppXnTxJ322hMhgKBRAR+8gWrsHEBGikbskAAwvREQ0BgaGnNh3rgEW65VXac0zGZGTFMFVb31MoFqFuLBAiG29qGjqZnghIiLfdrX742RNDYNZhvvj0NhL0oeMhJcuzEsIl7scAAwvREQ0Sp93Z2KzSXBfK0G+L0kfgkPnm1DR6D0zjhheiIjocw0OO10377OKOFDaiKGRtpDaT4mbZxlgNgm4MUXPttAElBTlfdOlGV6IiOgznat3tYW2FdWipXvAPZ5hDIPZJOD2ObHQBbEtNJF543Rpj95l6fDhw7jtttsQGxsLhUKBbdu2fe4xBw8eRFZWFjQaDZKTk7F582ZPlkhERP+krXsAmz+swq2/+QArf/0B/nikCi3dA4gM0eChRYn4+/cXYft3b8A918czuEwCn4QXW1sP+gaHZa7GxaNnXrq7u5GRkYFvfvObWLdu3efuX1VVhdWrV+Phhx/GG2+8gX379uFb3/oWYmJisGLFCk+WSkQ0qQ0NO3HofBMsVhF7zzVgcNjVFvJXKZA709UWWjxd71V3FqbxERmihjbAD46+IVxs6UZqtFbukjwbXlauXImVK1de8/6vvPIKEhIS8Mtf/hIAMHPmTBw5cgT/9V//xfBCROQBFxo6kW8VsbWwFs1d/e7x2XFamLMErMmMw5RgtYwVktwUCgWSokJQVNOOyqZJEF5G69ixY8jNzb1sbMWKFXjsscfkKYiIaALq6BnEO6fqYCmw4aTY4R6PCFZj7dw4mE0CZsbI/wZF3iNJ7wov3jLjyKvCi91uh8Fw+V0rDQYDHA4Hent7ERgY+Klj+vv70d9/6a8Fh8Ph8TqJiHzNsFPCBxeakG8VsedsAwaGnAAAP6UCS1OjkGcSsGRGFNR+bAvRp126aJfhZUxs2rQJzzzzjNxlEBF5pYqmLlisIrYWimhwXPpDLzU6FHnZRqzJjEWkl6yaSt7r0t2lvWPGkVeFl+joaDQ0NFw21tDQAK1We8WzLgCwceNGbNiwwf25w+GA0Wj0aJ1ERN7M0TeI907Ww2K1obCm3T0eFuSPtZmutlBarNZrbrJH3i8p6tKZF2+4QaNXhZecnBzs3LnzsrE9e/YgJyfnM4/RaDTQaPhXAxFNbsNOCccqWpBvtWH3GTv6R9pCKqUCS6brYTYJWDYzCho/lcyVki+aGh4EP6UCPQPDsDv6EKO78gmF8eLR8NLV1YXy8nL351VVVSguLkZ4eDimTp2KjRs3ora
"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-02 18:46:28 +00:00
"execution_count": 102,
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",
" for angle in np.arange(0, 360, 1):\n",
" 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 15:50:49 +00:00
"def get_points(template, turns, spacing, cache = None):\n",
" if cache is None:\n",
" cache = get_template_point_cache(template)\n",
" points = []\n",
" for angle in np.arange(0, 360 * turns, 1):\n",
" intersection, segment = cache[angle % 360]\n",
" offset = spacing * angle / 360\n",
" 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",
" points.append(intersection + normal * offset)\n",
" return points\n"
]
},
{
"cell_type": "code",
2022-10-02 18:46:28 +00:00
"execution_count": 103,
2022-10-02 15:50:49 +00:00
"metadata": {},
"outputs": [],
"source": [
"cache = get_template_point_cache(template)"
]
},
{
"cell_type": "code",
2022-10-02 18:46:28 +00:00
"execution_count": 104,
2022-10-02 15:50:49 +00:00
"metadata": {},
"outputs": [],
"source": [
"points = get_points(template, TURNS, SPACING, cache)"
2022-10-01 20:09:14 +00:00
]
},
{
"cell_type": "code",
2022-10-02 18:46:28 +00:00
"execution_count": 105,
2022-10-01 20:09:14 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot: xlabel='x'>"
]
},
2022-10-02 18:46:28 +00:00
"execution_count": 105,
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 points\n",
"df = pd.DataFrame(points, columns=['x', 'y'])\n",
"df.plot.line(x='x', y='y')"
]
2022-10-02 15:50:49 +00:00
},
{
"cell_type": "code",
2022-10-02 18:46:28 +00:00
"execution_count": 106,
2022-10-02 15:50:49 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot: xlabel='x'>"
]
},
2022-10-02 18:46:28 +00:00
"execution_count": 106,
2022-10-02 15:50:49 +00:00
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2022-10-02 18:46:28 +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": [
"points = [(0,0)] + get_points(template, TURNS, SPACING, cache) \n",
"\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",
"coil_A = translate(rotate(points, angle_A), COIL_CENTER_RADIUS, angle_A)\n",
"coil_B = translate(rotate(points, angle_B), COIL_CENTER_RADIUS, angle_B)\n",
"coil_C = translate(rotate(points, angle_C), COIL_CENTER_RADIUS, angle_C)\n",
"\n",
"# cretae the opposite coils\n",
"coil_A_opposite = translate(rotate(points, angle_A + 180), COIL_CENTER_RADIUS, angle_A + 180)\n",
"coil_B_opposite = translate(rotate(points, angle_B + 180), COIL_CENTER_RADIUS, angle_B + 180)\n",
"coil_C_opposite = translate(rotate(points, angle_C + 180), COIL_CENTER_RADIUS, angle_C + 180)\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",
"\n",
"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",
"\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
}