pcb-stator-coil-generator/coil.ipynb

363 lines
398 KiB
Text
Raw Normal View History

2022-10-01 20:09:14 +00:00
{
"cells": [
{
"cell_type": "code",
2022-10-02 19:15:44 +00:00
"execution_count": 195,
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-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-02 19:15:44 +00:00
"execution_count": 196,
2022-10-02 18:46:28 +00:00
"metadata": {},
"outputs": [],
"source": [
"SPACING = 0.4\n",
"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-02 19:15:44 +00:00
"execution_count": 197,
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 19:15:44 +00:00
"execution_count": 198,
2022-10-01 20:09:14 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2022-10-02 19:15:44 +00:00
"[<matplotlib.lines.Line2D at 0x164a66fe0>]"
2022-10-01 20:09:14 +00:00
]
},
2022-10-02 19:15:44 +00:00
"execution_count": 198,
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 19:15:44 +00:00
"execution_count": 199,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2022-10-02 19:15:44 +00:00
"[<matplotlib.lines.Line2D at 0x164abfc10>]"
]
},
2022-10-02 19:15:44 +00:00
"execution_count": 199,
"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-02 19:15:44 +00:00
"execution_count": 200,
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 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",
" for angle in np.arange(0, 360 * turns, 1):\n",
" 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-02 19:15:44 +00:00
"execution_count": 201,
2022-10-02 15:50:49 +00:00
"metadata": {},
"outputs": [],
"source": [
"cache = get_template_point_cache(template)"
]
},
{
"cell_type": "code",
2022-10-02 19:15:44 +00:00
"execution_count": 202,
2022-10-02 15:50:49 +00:00
"metadata": {},
"outputs": [],
"source": [
2022-10-02 19:15:44 +00:00
"points_f = get_points(template, TURNS, SPACING, Layer.FRONT, cache)\n",
"points_b = get_points(template, TURNS, SPACING, Layer.BACK, cache)"
2022-10-01 20:09:14 +00:00
]
},
{
"cell_type": "code",
2022-10-02 19:15:44 +00:00
"execution_count": 203,
2022-10-01 20:09:14 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot: xlabel='x'>"
]
},
2022-10-02 19:15:44 +00:00
"execution_count": 203,
2022-10-01 20:09:14 +00:00
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2022-10-02 18:46:28 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGwCAYAAACU8g7/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOxdd1xT5/s9GSRskA0BVAQXsod11r0XiLPT7qrdu/312713qx3aXatVFNx7b7ZMURCVEPae2ff3x01CcLTq+0aues/n0w/1El7eBMh77nOecx4BwzAMePDgwYMHDx48ugHC7t4ADx48ePDgwePOBU9EePDgwYMHDx7dBp6I8ODBgwcPHjy6DTwR4cGDBw8ePHh0G3giwoMHDx48ePDoNvBEhAcPHjx48ODRbeCJCA8ePHjw4MGj2yDu7g38G/R6PcrLy+Hg4ACBQNDd2+HBgwcPHjx4XAMYhkFLSwt8fHwgFP57zYPTRKS8vBx+fn7dvQ0ePHjw4MGDxw1ALpfD19f3Xx/DaSLi4OAAgH0ijo6O3bwbHjx48ODBg8e1oLm5GX5+fqZz/N/AaSJilGMcHR15IsKDBw8ePHjcYriWtgq+WZUHDx48ePDg0W3giQgPHjx48ODBo9vAExEePHjw4MGDR7eB0z0iPHjw4MGDx60MnU4HjUbT3dugDisrK4hEIipr8USEBw8ePHjwoAyGYVBZWYnGxsbu3orF4OzsDC8vL+KcL56I8ODBgwcPHpRhJCEeHh6wtbW9rUI5GYZBe3s7qqurAQDe3t5E6/FEhAcPHjx48KAInU5nIiGurq7dvR2LwMbGBgBQXV0NDw8PIpmGb1blwYMHDx48KMLYE2Jra9vNO7EsjM+PtAeGJyI8ePDgwYOHBXA7yTFXAq3nxxMRHjx48ODBg0e3gSciPHjw4MGDB49uA09EePDgwYMHDx7dBt41w4MHjy5oV2vRotTCWiyC1EoIqVh422vdPHjw6D7wRIQHDx6oa1VhT0EVduVX4lhxHdQ6velzAgEgFQthbSWCtVgEayv2/6VWIliLhbCRdL3Ofk5ouGZ+XQgb09d1fby12eOlYiGEQp748OBxp4AnIjx43KFQNHZgV14lduVXIu1CPfRM5+eEApj+zTCAUqOHUqMHcHOiqiVilrSYyIqBuEiNxEUs7EJyTATnKgSIre50kqFLCRBPfHhYEgzDoEOj65bvbWMluuaK5p9//onnnnsO5eXlkEqlpuuzZs2Cg4MD/vrrL4vskSciPHjcQSita8eWnHLszKtErqKpy+cGyRwxKdgLkwZ5IdDDARqdHkqNzkBCdFBpO//f9FGrQ4daB6VWD5VGd9nnLnv8Fa6rDNc0uk4mpNbqodbq0dRxc14XiUjIVnEuITM2xurOVQiQsYJjfOylBEh6GSli1xCL+Pa8OwkdGh0G/m9Xt3zvgncnwlZybUf9nDlz8PTTT2Pz5s2YM2cOADawbNu2bdi9e7fF9sgTER48bnOotXrsLqjEP6lyHC2uNV0XCICYni6YOMgLEwZ6ws+la/iSlUgIK5EQDtY3Z59anR4qLUtQOq6BAHUhN10+13ldpdEbHnvJmhp9F/lJrWP/3aLU3pTnaiUSdKnSXEqATNUfsQg2ksurPNIupKhrZehKBMiKJz48rgE2NjZYuHAhfvvtNxMRWbVqFfz9/TFq1CiLfV+eiPDgcZuipKYVa9PkWJ9Rhro2NQCWfAzr44apod4YN8AT7g7S/1jl5kEsYisFdtKb87ak0zOXkBz2/zs0OlOV5moEyFj96bgCAVIZr2m7EiSVtpP4aHQMNDotWlQ3h/iIhIIuxEXaRaIy68+xurwXqGsvz5UJkLl05iAV81LXJbCxEqHg3Ynd9r2vB48++ihiYmKgUCggk8nw+++/48EHH7RowzpPRHjwuI2g1OiwK78Sa1JLcbKk3nTdw0GKeTF+mBvtd1nl406FSCiArUQMW8nN+X56PWOq+Fxe0WGJi+pScmNGgFRXIExGAqS6ZB3j/xuh0zNoU+vQprZ8n4KbvQSPjAjAfXf1vGmkkusQCATXLI90NyIiIhAWFoY///wTEyZMQH5+PrZt22bR73nTXpmPP/4Yr732Gp555hl8/fXXN+vb8uBxR6C4ugVrUuXYkFmGxna2oVQoAEb188D8GD+M6e/B9yV0M4RCAWwkIthIbnw42PWAYVjio+pCWi4nQCrtFcjNFWUxc6JzBVlMqwPDALWtany8oxA/HjqHR4b3xv1De8HR2uqmPGcedPDII4/g66+/hkKhwLhx4+Dn52fR73dTiEhaWhp++uknhIaG3oxvx4PHHQGlRoftuRVYk1qKtAsNpuveTtam6oePs0037pBHd0IgEJgkFCdYnggYic/WnAosP1CM87Vt+Hz3Waw4XIIHh/XGQ8N6wflmlZ94EGHhwoV48cUXsXLlSvz5558W/34WJyKtra245557sHLlSrz//vuW/nY8eNz2KKxsxj+pciRllqHZ0FwpEgowpr8HFsT64e6+HhDxGj2Pmwwj8UmI8kVchAxbc8rx3f5iFFe34tt9Rfj16HncP6QnHhkRABc7npBwGU5OTpg9eza2bduGWbNmWfz7WZyILFmyBFOnTsW4ceP+k4ioVCqoVCrTv5ubmy29PR48bgm0q7XYmsNWP7JKG03XZc42mB/jhznRfvByukn2Fh48/gMioQAzw2WYHuqDHXmV+G5/EQorW/D9wXP4/fgF/N/UgVg42L+7t8njX6BQKHDPPfd0yROxFCxKRP755x9kZmYiLS3tmh7/0Ucf4Z133rHklnjwuKWQX96ENaml2JRVbnJYiIUCjB/oifmx/hgR6MY7FHhwFkKhAFNDvTF5kBf2nK7Cd/uLkKdoxhsbc+HpKMXYAZ7dvUUel6ChoQEHDx7EwYMH8f3339+U72kxIiKXy/HMM89gz549sLa+tju11157Dc8//7zp383NzRZvkuHBg2toVWmxJbsca1JLkVPWGTrW09UW82P8kRDlyynbLQ8e/wWhUICJwWxezRsb87A6pRRPr8lC0uJh6Ofl0N3b42GGiIgINDQ04JNPPkG/fv1uyve0GBHJyMhAdXU1IiMjTdd0Oh0OHz6MZcuWQaVSQSTq2j0ulUpvShmIBw8uIk/RhNWppdiUpTDZLK1E7Bv4wlh/3BXgylc/eNzSEAgEeGdGMEpqWnGypB4P/5GGTUuGwdWef9/nCi5cuHDTv6fFiMjYsWORm5vb5dqiRYvQv39/vPLKK5eREB487kS0qrTYfIqtfphHrge42WF+rB9mR/ryb9I8bitYiYT44Z4ozPr+GC7WtePJVZlY9chgSMS3n72cYZj/ftAtDFrPz2JExMHBAYMGDepyzc7ODq6urpdd58HjTgLDMMhVGHo/TpWj3VD9kIiEmBzihQWx/hjc28WiSYbXC5VWh+Pn6rArrxIHz9SgQ6O75oF0xmvSKyR5Xmkui/SSr+fjyW8/9LCT4JcHohG3/DhSL9Tj/zbm4pPZoZz6nSeBlRVrl25vb4eNze1roW9vbwfQ+XxvFLdG1BsPHrcBWpQabDJUP/LLOx1hAe52WBjrj/hIX07ZGttUWhw8U4Nd+ZXYX1iN1kviyG/WQLorxZN3jSC/fMLu1WLKpeJ//3ojEeIlMMsj0MMB3y2MwEO/p2Fdehn6ejrgkREB3b0tKhCJRHB2dkZ1dTUAwNbW9rYhWQB7M9Xe3o7q6mo4OzsTKxwChsO1o+bmZjg5OaGpqQmOjo7dvR0ePK4bDMMgp6wJq1NKsTm73DQKXCIWYsogtvoRy6HqR2O7GnsKqrArvxKHi2qhNpuP4uEgZRsOgz3h7WT9n4PoVNpLEjn/ZSBdZ8Ln5XNZugMSsfCqM1X+bRqvsZpztaF05gTIfK6LlUjAmd+Bm41fjp7He1sLIBQAvzwQg9H9Pbp7S1TAMAwqKyvR2NjY3VuxGJydneHl5XXF393rOb95IsKDhwVQ26rCxiwF1meUobCyxXS9j7sdFg7uifgIGXpwpPrBMAxOltTjn7RS7Mit7DKVtperLSYGe2HiIC+E+zrftEqBXs9Arfu
2022-10-01 20:09:14 +00:00
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
2022-10-02 19:15:44 +00:00
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
2022-10-01 20:09:14 +00:00
}
],
"source": [
"# plot the points\n",
2022-10-02 19:15:44 +00:00
"df = pd.DataFrame(points_f, columns=['x', 'y'])\n",
"df.plot.line(x='x', y='y')\n",
"df = pd.DataFrame(points_b, columns=['x', 'y'])\n",
2022-10-01 20:09:14 +00:00
"df.plot.line(x='x', y='y')"
]
2022-10-02 15:50:49 +00:00
},
{
"cell_type": "code",
2022-10-02 19:15:44 +00:00
"execution_count": 204,
2022-10-02 15:50:49 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2022-10-02 19:15:44 +00:00
"(4.686388888888889, 14.910277777777779, -4.8424889815939665, 4.72228490689062)"
2022-10-02 15:50:49 +00:00
]
},
2022-10-02 19:15:44 +00:00
"execution_count": 204,
2022-10-02 15:50:49 +00:00
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2022-10-02 19:15:44 +00:00
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGwCAYAAACU8g7/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOyddVhVWRfG3xt0it2d2IWNNcaY4zihzoxd2B2jeBURuxMDu7sLERFFBURJAwMUkG64ub8/7nfP4IzjsM+9RwT373l8ROU9a1/Ae96z9tpriQghBAwGg8FgMBgFgLigF8BgMBgMBuPbhRkRBoPBYDAYBQYzIgwGg8FgMAoMZkQYDAaDwWAUGMyIMBgMBoPBKDCYEWEwGAwGg1FgMCPCYDAYDAajwJAW9AI+h0ajQUxMDKysrCASiQp6OQwGg8FgMPIBIQQZGRkoV64cxOLP5zy+aiMSExODihUrFvQyGAwGg8Fg8CA6OhoVKlT47Od81UbEysoKgPaFWFtbF/BqGAwGg8Fg5If09HRUrFiRu49/jq/aiOi2Y6ytrZkRYTAYDAajkJGfsgpWrMpgMBgMBqPAYEaEwWAwGAxGgcGMCIPBYDAYjALjq64RYTAYDAZDH9RqNZRKZUEvo8hhZGQEiURikGsxI8JgMBiMIgchBHFxcUhNTS3opRRZbG1tUaZMGb37fDEjwmAwGIwih86ElCpVCubm5qwppgEhhCA7Oxvx8fEAgLJly+p1PWZEGAwGg1GkUKvVnAkpXrx4QS+nSGJmZgYAiI+PR6lSpfTapmHFqgwGg8EoUuhqQszNzQt4JUUb3ddX3xocZkQYDAaDUSRh2zHCYqivLzMiDAaDwWAwCgxmRBgMBoPBYBQYzIgwGAwGg1HEkMlkaNy4MffnYcOGoX///gW2ns/BjAiDweBNrioXMRkxSJenQ61RF/RyGIwiQVxcHCZNmoRq1arBxMQEFStWRJ8+feDp6Znva8ycOZPq82/fvg2RSMT9MjMzg729Pdzd3fm8BCrY8V0Gg0HNh8wP2PBgA7Y+2oo0eRr39yYSE1gaW8LC2AIWRhb//NjIAhbGH3/8yc/728dmUjNWeMj4Jnjz5g3atm0LW1tbrFq1Cg0aNIBSqcS1a9cwYcIERERE5Os6lpaWsLS0pI7/7NkzWFtbIycnBxcuXMD48eNRvXp1dOnShfpa+YUZEQaDkW+i0qKw/O5y7Hm8B3K1HAAggggEBAAgV8shz5EjKSfJoHFFEHHm5O9Ghvs4H4bmUx8bSYwMulbG1wkhBNnK7C8e19yIrpmak5MTRCIRHj58CAsLC+7v7e3tMWLECO7PUVFRmDRpEjw9PSEWi9GjRw9s2rQJpUuXBqDdmjl79iyCgoKo1luqVCnY2toCACZPnoyNGzciMDCQGREGg1GwvEl9AzcfN3gEeUCp0fYMaFWhFea2nYs+tftAqVYiU5GJLGUWshRZdB8r//+x4p8f624cBASZikxkKjKBLMO+NiOx0b+bGz2MjrmROcQitvv9tZCtzIalG32GQF8y52XCwtjivz8RQHJyMq5evQpXV9ePTIgOnUHQaDTo168fLC0t4e3tDZVKhQkTJuCXX37B7du3DbJuQgiuXbuGqKgoODg4GOSa/wYzIgwG4195lfIKy3yWYd+TfVBpVACATlU6wdnRGY6VHbknPROpCUykJigOw3ax1BANspXZBjU3uo91hkqpUSI1NxWpuakGXTsAmEnNqLeq8vOxicSEbVUVQV6+fAlCCOrUqfPZz/P09ERwcDBev36NihUrAgD2798Pe3t7PHr0CC1atOC9hgoVKgAA5HI5NBoNlixZgg4dOvC+Xn5gRoTBYPyDl8kvscxnGfY/2Q810Rahdq3WFc4dnNG+cvsvtg6xSAxLY0tYGluiNEob9NoKtYIzJ4Y0OlmKLG6rKkeVgxxVDhKyEwy6dolIkr/MDA+jIxEbZqLq14a5kTky52UWSNz8QgjJ1+eFh4ejYsWKnAkBgHr16sHW1hbh4eF6GREfHx9YWVlBLpfj4cOHmDhxIuzs7DB+/Hje1/wvmBFhMBgcz5Oew9XHFYeeHuIMSPfq3eHs6Iw2FdsU8OoMi7HEGMZmxihmVsyg1yWEIEeVQ29uFFnIVH4+i6Ory1ETNdLl6UiXpxt07QDQpEwTLOiwAP3r9C9SW0sikSjfWyQFRc2aNSESifJdkCoEVatW5baA7O3t8eDBA7i6ujIjwmAwhCUiMQJL7yzFkZAj0BANAKBnjZ5wdnRGqwqtCnh1hQuRSARzI3OYG5mjpEVJg15bpVEJksXJVGRy3/fHcY/x4/Ef0bhMY8gcZehbuy/bBvpC2NnZoXv37tiyZQsmT578jzqR1NRU2Nraom7duoiOjkZ0dDSXFQkLC0Nqairq1atn0DVJJBLk5OQY9Jp/hxkRBuMbJiwhDC53XHAs5Bi3ndC7Vm84d3BGi/L807sMYZCKpbAxtYGNqY1Br0sIgVwtR1J2Erb7b8eGBxsQFBeE/sf6o2nZpljccTF61ezFDMkXYMuWLWjbti1atmyJJUuWoGHDhlCpVLhx4wa2bduG8PBwdO3aFQ0aNMCQIUOwfv16qFQqODk5wdHREc2bN9crfnx8PHJzc7mtmQMHDmDgwIEGenWf5ovl3ZYvXw6RSISpU6d+qZAMBuNfCIkPwS8nf0H9rfVxNOQoCAj61e6HgDEBuDDoAjMh3xgikQimUlOUty4Pl84ueD3lNea1mwcLIwsExgaiz5E+cNjlAM9X+W+QxeBHtWrVEBgYiE6dOmHGjBmoX78+vvvuO3h6emLbtm0AtN+vc+fOoVixYujQoQO6du2KatWq4dixY3rHr127NsqWLYsaNWpgzpw5GDt2LDZt2qT3dT+HiOS3OkYPHj16hJ9//hnW1tbo1KkT1q9fny9deno6bGxskJaWBmtra2EXyWB8A7xIeoF5nvNwKvwU93cD6g7Awg4L0bhM44JbGOOrJDE7Eavvrcamh5uQrcyGCCLcGX4H7Sq1K+ilfZbc3Fy8fv0aVatWhampaUEvp8jyua8zzf1b8IxIZmYmhgwZgp07d6JYMcMWhTEYjPyRo8yBs5cz6m+rz5mQgfUG4sm4Jzj18ylmQhifpIR5CSzvuhyvp7zGD3V+AAHBiHMjkKMUtmaA8W0huBGZMGECevXqha5du/7n58rlcqSnp3/0i8Fg6MflF5dhv9UeLndcoFAr0L16dwSPD8aJn06gYemGBb08RiGglEUp7Om3B+WtyuNF8gss9FpY0EtiFCEENSJHjx5FYGAg3Nzc8vX5bm5usLGx4X7lPSPNYDDoiEqLwg/HfkCvw73wOvU1yluVx8mfTuLKkCuoX6p+QS+PUciwNbWFex/tALR1fuvg986vgFfEKCoIZkSio6MxZcoUHDp0KN97dPPmzUNaWhr3Kzo6WqjlMRhFFoVagRV3V6Dulro4G3EWUrEUs9rMQsTECPxY70d28oHBm+9rfo8/Gv0BDdFg+LnhyFXlFvSSPssXKIH8pjHU11ew47sBAQGIj49H06ZNub9Tq9W4c+cONm/eDLlcDonk4w5+JiYmMDExEWpJDEaRx+u1FyZcnoDwxHAAQPtK7bG119YvlgEhhODGqxtY6bsSAbEBMJOafXLaLvf7v0zj/bcBdxZGFjCWGDMzVYCs674O1yOvIyIxAotvL4Zb1/xlvL8kRkbaQYbZ2dkwMzMr4NUUXbKztbOgdF9vvgh2aiYjIwNv37796O+GDx+OOnXqYM6cOahf/7/fGNmpGQYjfyRkJWDG9Rk48PQAAO2e/urvVuO3hr99kZu2hmhwOvw0lvksw+O4x4LG+rf25n///XPm5t+0zOTkj3MR59D/WH9IRBL4jfJD83L69a4QgtjYWKSmpqJUqVIwN6ebgMv4PIQQZGdnIz4+Hra2tihbtuw/Pofm/i1YRsTKyuofZsPCwgLFixfPlwlhMBj/DSEE+57sw8zrM5GUkwQRRBjffDyWdl5q8Nbln0KtUeNk2Em43HFBaEIoAO1sjTFNx2Bo46EghHxyFsvff8/b2vzvv/99SJ2Q7c11Jue
2022-10-02 15:50:49 +00:00
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2022-10-02 19:15:44 +00:00
"points_f = [(0,0)] + get_points(template, TURNS, SPACING, Layer.FRONT, cache) \n",
"points_b = [(0,0)] + get_points(template, TURNS, SPACING, 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-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-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",
"\n",
"# coil_B_f = translate(rotate(points, angle_B), COIL_CENTER_RADIUS, angle_B)\n",
"# coil_B_b = translate(rotate(points, angle_B), COIL_CENTER_RADIUS, angle_B)\n",
"\n",
"# coil_C_f = translate(rotate(points, angle_C), COIL_CENTER_RADIUS, angle_C)\n",
"# coil_C_b = 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",
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
}