├── .gitignore ├── repoData ├── SS1.png ├── SS2.png ├── SS3.png ├── SS4.png └── logo.png ├── unreleased ├── fJoin1-_-0.FCStd └── fLocator1-_-0.FCStd ├── requirements.txt ├── README.md ├── LICENSE.txt └── analysis ├── archive └── tinyFrame.ipynb ├── tinyFrameProrotypingCalcs.ipynb ├── .ipynb_checkpoints └── tinyFrameProrotypingCalcs-checkpoint.ipynb └── tinyFrame.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | *.FCBak 2 | *.DS_Store 3 | /archive/ 4 | /.venv/ 5 | /venv/ 6 | -------------------------------------------------------------------------------- /repoData/SS1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/em0sh/tinyframe/HEAD/repoData/SS1.png -------------------------------------------------------------------------------- /repoData/SS2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/em0sh/tinyframe/HEAD/repoData/SS2.png -------------------------------------------------------------------------------- /repoData/SS3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/em0sh/tinyframe/HEAD/repoData/SS3.png -------------------------------------------------------------------------------- /repoData/SS4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/em0sh/tinyframe/HEAD/repoData/SS4.png -------------------------------------------------------------------------------- /repoData/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/em0sh/tinyframe/HEAD/repoData/logo.png -------------------------------------------------------------------------------- /unreleased/fJoin1-_-0.FCStd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/em0sh/tinyframe/HEAD/unreleased/fJoin1-_-0.FCStd -------------------------------------------------------------------------------- /unreleased/fLocator1-_-0.FCStd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/em0sh/tinyframe/HEAD/unreleased/fLocator1-_-0.FCStd -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | anyio==4.9.0 2 | appnope==0.1.4 3 | argon2-cffi==25.1.0 4 | argon2-cffi-bindings==21.2.0 5 | arrow==1.3.0 6 | asttokens==3.0.0 7 | async-lru==2.0.5 8 | attrs==25.3.0 9 | babel==2.17.0 10 | beautifulsoup4==4.13.4 11 | bleach==6.2.0 12 | certifi==2025.6.15 13 | cffi==1.17.1 14 | charset-normalizer==3.4.2 15 | comm==0.2.2 16 | contourpy==1.3.2 17 | cycler==0.12.1 18 | debugpy==1.8.14 19 | decorator==5.2.1 20 | defusedxml==0.7.1 21 | executing==2.2.0 22 | fastjsonschema==2.21.1 23 | flexcache==0.3 24 | flexparser==0.4 25 | fonttools==4.58.4 26 | fqdn==1.5.1 27 | h11==0.16.0 28 | httpcore==1.0.9 29 | httpx==0.28.1 30 | idna==3.10 31 | ipykernel==6.29.5 32 | ipython==9.3.0 33 | ipython-pygments-lexers==1.1.1 34 | isoduration==20.11.0 35 | jedi==0.19.2 36 | jinja2==3.1.6 37 | json5==0.12.0 38 | jsonpointer==3.0.0 39 | jsonschema==4.24.0 40 | jsonschema-specifications==2025.4.1 41 | jupyter-client==8.6.3 42 | jupyter-core==5.8.1 43 | jupyter-events==0.12.0 44 | jupyter-lsp==2.2.5 45 | jupyter-server==2.16.0 46 | jupyter-server-terminals==0.5.3 47 | jupyterlab==4.4.3 48 | jupyterlab-pygments==0.3.0 49 | jupyterlab-server==2.27.3 50 | jupyterlab-vim==4.1.4 51 | kiwisolver==1.4.8 52 | markupsafe==3.0.2 53 | matplotlib==3.10.3 54 | matplotlib-inline==0.1.7 55 | mistune==3.1.3 56 | nbclient==0.10.2 57 | nbconvert==7.16.6 58 | nbformat==5.10.4 59 | nest-asyncio==1.6.0 60 | notebook-shim==0.2.4 61 | numpy==2.3.0 62 | overrides==7.7.0 63 | packaging==25.0 64 | pandocfilters==1.5.1 65 | parso==0.8.4 66 | pexpect==4.9.0 67 | pillow==11.2.1 68 | pint==0.24.4 69 | pip==25.1.1 70 | platformdirs==4.3.8 71 | prometheus-client==0.22.1 72 | prompt-toolkit==3.0.51 73 | psutil==7.0.0 74 | ptyprocess==0.7.0 75 | pure-eval==0.2.3 76 | pycparser==2.22 77 | pygments==2.19.1 78 | pyparsing==3.2.3 79 | python-dateutil==2.9.0.post0 80 | python-json-logger==3.3.0 81 | pyyaml==6.0.2 82 | pyzmq==27.0.0 83 | referencing==0.36.2 84 | requests==2.32.4 85 | rfc3339-validator==0.1.4 86 | rfc3986-validator==0.1.1 87 | rpds-py==0.25.1 88 | send2trash==1.8.3 89 | setuptools==80.9.0 90 | six==1.17.0 91 | sniffio==1.3.1 92 | soupsieve==2.7 93 | stack-data==0.6.3 94 | terminado==0.18.1 95 | tinycss2==1.4.0 96 | tornado==6.5.1 97 | traitlets==5.14.3 98 | types-python-dateutil==2.9.0.20250516 99 | typing-extensions==4.14.0 100 | uri-template==1.3.0 101 | urllib3==2.5.0 102 | wcwidth==0.2.13 103 | webcolors==24.11.1 104 | webencodings==0.5.1 105 | websocket-client==1.8.0 106 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tinyFrame 2 | 3 |
4 | 5 | ![logo](/repoData/logo.png) 6 | 7 | tinyFrame is a 3D printed modular tooling framing system focused on ease of manufacture, reusability and accuracy 8 |
9 | 10 | # Modular, Customizable and Open Source Tooling 11 | ## Customizable 12 | CAD is provided and users can model and customize their designs before manufacture. 13 | ## Open Source 14 | Free to use. Improves over time with contribution. 15 | 16 | # Example 17 | Frame members (T230-X-X) are joined together by connectors (CX-X-X) and adapters (M1-X-X). Below is 2 x 1 x 1 frame used for storage. The storage containers are also made available. 18 | | CAD | Reality | 19 | | :------------------------------: | :---------------------------: | 20 | | ![4](/repoData/SS4.png) | ![1](/repoData/SS1.png) | 21 | 22 | 23 | Slice and print individual parts in the right quantities to make the frame on a 3D printer. 24 | 25 | ![sample frame](/repoData/SS2.png) 26 | 27 | Break apart and use these parts to create the frame you designed. Save your parts for later - they're interchangeable and can be easily reused. In the below example, roughly 22 feet was printed in a single Bambu P1P print bed with one 1 kg spool of filament. 28 | 29 | ![printed parts](/repoData/SS3.png) 30 | 31 | # Getting Started 32 | Download the repository and use your CAD platform of choice to import the STP files for use. 33 | Contributions must be made using FreeCAD or Ondsel. 34 | More information TBD. 35 | 36 | # Use 37 | All prints designed for Polymaker PLA on a Bambu P1P 3D printer. 38 | More information TBD. 39 | 40 | # FAQs 41 | ## Why isn't tinyFrame ratable for structural use? 42 | FDM 3D printed parts are anisotropic which makes them difficult to analyze. Additionally, they are not controllable for key mechanical properties because the process is heavily dependent on several factors (humidty, slicing configuration, temperatures, etc.) 43 | 44 | ## Why Ondsel and not FreeCAD? 45 | FreeCAD does not natively support assemblies yet, but does support Workbenches that do. Ondsel, an interoperable FreeCAD derivative which is actively supported, supports and is building on assembly support. With that said - Ondsel is backwards compatible at the part level. Contributions or changes can be made using FreeCAD or Ondsel, and users looking to build or contribute to assemblies can use Ondsel. 46 | 47 | ## I've built a frame and it feels sloppy - why? 48 | Adapters purposely gap joined parts to account for assembly misalignment and profile tolerance at the part level. These gaps are to allow accuracy defining parts in the future without overconstraining the system. 49 | 50 | # TODO 51 | - Finish 'Getting Started' 52 | - Finish 'Use' 53 | - Break MX into assembly 54 | - Create assembly drawings 55 | - Fix current platform design (see unreleased directory) 56 | - Calculations on T230 57 | - Need to find worst case combined loading 58 | - Optimize wall thickness so that maximum bending stress at tube wall equals maximum shear stress at thread / .62 59 | - System anisotropic: develop failure theory that approximates to a worst case allowable yield stress 60 | - Need to test at: 61 | - Different humidites 62 | - Water content of PLA 63 | - Different loadings 64 | - Shear 65 | - Tensile 66 | - sContainer1 walls too thin. Need to find better thickness 67 | - Need to add draft angle to walls to make container stackable 68 | - sContainer2 walls too thin. Same need as above 69 | - Draft angle requires testing to see if stacking working as designed 70 | - Part Naming schema needs to be explained 71 | - Need to redefine mate-points on assemblies and verify 72 | - Develop documentation at tinyframe.dev 73 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | CERN Open Hardware Licence Version 2 – Strongly Reciprocal 2 | Version 2 3 | Submitted: June 29, 2020 4 | https://opensource.org/license/cern-ohl-s/ 5 | ============================================ 6 | Peamble 7 | 8 | CERN has developed this licence to promote collaboration among hardware designers and to provide a legal tool which supports the freedom to use, study, modify, share and distribute hardware designs and products based on those designs. Version 2 of the CERN Open Hardware Licence comes in three variants: CERN-OHL-P (permissive); and two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this licence, CERN-OHL-S (strongly reciprocal). 9 | 10 | The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in unmodified form only. 11 | 12 | Use of this Licence does not imply any endorsement by CERN of any Licensor or their designs nor does it imply any involvement by CERN in their development. 13 | 14 | 1 Definitions 15 | 16 | 1.1 ‘Licence’ means this CERN-OHL-S. 17 | 18 | 1.2 ‘Compatible Licence’ means a) any earlier version of the CERN Open Hardware licence, or b) any version of the CERN-OHL-S, or c) any licence which permits You to treat the Source to which it applies as licensed under CERN-OHL-S provided that on Conveyance of any such Source, or any associated Product You treat the Source in question as being licensed under CERN-OHL-S. 19 | 20 | 1.3 ‘Source’ means information such as design materials or digital code which can be applied to Make or test a Product or to prepare a Product for use, Conveyance or sale, regardless of its medium or how it is expressed. It may include Notices. 21 | 22 | 1.4 ‘Covered Source’ means Source that is explicitly made available under this Licence. 23 | 24 | 1.5 ‘Product’ means any device, component, work or physical object, whether in finished or intermediate form, arising from the use, application or processing of Covered Source. 25 | 26 | 1.6 ‘Make’ means to create or configure something, whether by manufacture, assembly, compiling, loading or applying Covered Source or another Product or otherwise. 27 | 28 | 1.7 ‘Available Component’ means any part, sub-assembly, library or code which: a) is licensed to You as Complete Source under a Compatible Licence; or b) is available, at the time a Product or the Source containing it is first Conveyed, to You and any other prospective licensees i) as a physical part with sufficient rights and information (including any configuration and programming files and information about its characteristics and interfaces) to enable it either to be Made itself, or to be sourced and used to Make the Product; or ii) as part of the normal distribution of a tool used to design or Make the Product. 29 | 30 | 1.8 ‘Complete Source’ means the set of all Source necessary to Make a Product, in the preferred form for making modifications, including necessary installation and interfacing information both for the Product, and for any included Available Components. If the format is proprietary, it must also be made available in a format (if the proprietary tool can create it) which is viewable with a tool available to potential licensees and licensed under a licence approved by the Free Software Foundation or the Open Source Initiative. Complete Source need not include the Source of any Available Component, provided that You include in the Complete Source sufficient information to enable a recipient to Make or source and use the Available Component to Make the Product. 31 | 32 | 1.9 ‘Source Location’ means a location where a Licensor has placed Covered Source, and which that Licensor reasonably believes will remain easily accessible for at least three years for anyone to obtain a digital copy. 33 | 34 | 1.10 ‘Notice’ means copyright, acknowledgement and trademark notices, Source Location references, modification notices (subsection 3.3(b)) and all notices that refer to this Licence and to the disclaimer of warranties that are included in the Covered Source. 35 | 36 | 1.11 ‘Licensee’ or ‘You’ means any person exercising rights under this Licence. 37 | 38 | 1.12 ‘Licensor’ means a natural or legal person who creates or modifies Covered Source. A person may be a Licensee and a Licensor at the same time. 39 | 40 | 1.13 ‘Convey’ means to communicate to the public or distribute. 41 | 42 | 2 Applicability 43 | 44 | 2.1 This Licence governs the use, copying, modification, Conveying of Covered Source and Products, and the Making of Products. By exercising any right granted under this Licence, You irrevocably accept these terms and conditions. 45 | 46 | 2.2 This Licence is granted by the Licensor directly to You, and shall apply worldwide and without limitation in time. 47 | 48 | 2.3 You shall not attempt to restrict by contract or otherwise the rights granted under this Licence to other Licensees. 49 | 50 | 2.4 This Licence is not intended to restrict fair use, fair dealing, or any other similar right. 51 | 52 | 3 Copying, Modifying and Conveying Covered Source 53 | 54 | 3.1 You may copy and Convey verbatim copies of Covered Source, in any medium, provided You retain all Notices. 55 | 56 | 3.2 You may modify Covered Source, other than Notices, provided that You irrevocably undertake to make that modified Covered Source available from a Source Location should You Convey a Product in circumstances where the recipient does not otherwise receive a copy of the modified Covered Source. In each case subsection 3.3 shall apply. You may only delete Notices if they are no longer applicable to the corresponding Covered Source as modified by You and You may add additional Notices applicable to Your modifications. Including Covered Source in a larger work is modifying the Covered Source, and the larger work becomes modified Covered Source. 57 | 58 | 3.3 You may Convey modified Covered Source (with the effect that You shall also become a Licensor) provided that You: a) retain Notices as required in subsection 3.2; b) add a Notice to the modified Covered Source stating that You have modified it, with the date and brief description of how You have modified it; c) add a Source Location Notice for the modified Covered Source if You Convey in circumstances where the recipient does not otherwise receive a copy of the modified Covered Source; and d) license the modified Covered Source under the terms and conditions of this Licence (or, as set out in subsection 8.3, a later version, if permitted by the licence of the original Covered Source). Such modified Covered Source must be licensed as a whole, but excluding Available Components contained in it, which remain licensed under their own applicable licences. 59 | 60 | 4 Making and Conveying Products 61 | 62 | You may Make Products, and/or Convey them, provided that You either provide each recipient with a copy of the Complete Source or ensure that each recipient is notified of the Source Location of the Complete Source. That Complete Source is Covered Source, and You must accordingly satisfy Your obligations set out in subsection 3.3. If specified in a Notice, the Product must visibly and securely display the Source Location on it or its packaging or documentation in the manner specified in that Notice. 63 | 64 | 5 Research and Development 65 | 66 | You may Convey Covered Source, modified Covered Source or Products to a legal entity carrying out development, testing or quality assurance work on Your behalf provided that the work is performed on terms which prevent the entity from both using the Source or Products for its own internal purposes and Conveying the Source or Products or any modifications to them to any person other than You. Any modifications made by the entity shall be deemed to be made by You pursuant to subsection 3.2. 67 | 68 | 6 DISCLAIMER AND LIABILITY 69 | 70 | 6.1 DISCLAIMER OF WARRANTY — The Covered Source and any Products are provided ‘as is’ and any express or implied warranties, including, but not limited to, implied warranties of merchantability, of satisfactory quality, non-infringement of third party rights, and fitness for a particular purpose or use are disclaimed in respect of any Source or Product to the maximum extent permitted by law. The Licensor makes no representation that any Source or Product does not or will not infringe any patent, copyright, trade secret or other proprietary right. The entire risk as to the use, quality, and performance of any Source or Product shall be with You and not the Licensor. This disclaimer of warranty is an essential part of this Licence and a condition for the grant of any rights granted under this Licence. 71 | 72 | 6.2 EXCLUSION AND LIMITATION OF LIABILITY — The Licensor shall, to the maximum extent permitted by law, have no liability for direct, indirect, special, incidental, consequential, exemplary, punitive or other damages of any character including, without limitation, procurement of substitute goods or services, loss of use, data or profits, or business interruption, however caused and on any theory of contract, warranty, tort (including negligence), product liability or otherwise, arising in any way in relation to the Covered Source, modified Covered Source and/or the Making or Conveyance of a Product, even if advised of the possibility of such damages, and You shall hold the Licensor(s) free and harmless from any liability, costs, damages, fees and expenses, including claims by third parties, in relation to such use. 73 | 74 | 7 Patents 75 | 76 | 7.1 Subject to the terms and conditions of this Licence, each Licensor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in subsections 7.2 and 8.4) patent licence to Make, have Made, use, offer to sell, sell, import, and otherwise transfer the Covered Source and Products, where such licence applies only to those patent claims licensable by such Licensor that are necessarily infringed by exercising rights under the Covered Source as Conveyed by that Licensor. 77 | 78 | 7.2 If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Covered Source or a Product constitutes direct or contributory patent infringement, or You seek any declaration that a patent licensed to You under this Licence is invalid or unenforceable then any rights granted to You under this Licence shall terminate as of the date such process is initiated. 79 | 80 | 8 General 81 | 82 | 8.1 If any provisions of this Licence are or subsequently become invalid or unenforceable for any reason, the remaining provisions shall remain effective. 83 | 84 | 8.2 You shall not use any of the name (including acronyms and abbreviations), image, or logo by which the Licensor or CERN is known, except where needed to comply with section 3, or where the use is otherwise allowed by law. Any such permitted use shall be factual and shall not be made so as to suggest any kind of endorsement or implication of involvement by the Licensor or its personnel. 85 | 86 | 8.3 CERN may publish updated versions and variants of this Licence which it considers to be in the spirit of this version, but may differ in detail to address new problems or concerns. New versions will be published with a unique version number and a variant identifier specifying the variant. If the Licensor has specified that a given variant applies to the Covered Source without specifying a version, You may treat that Covered Source as being released under any version of the CERN-OHL with that variant. If no variant is specified, the Covered Source shall be treated as being released under CERN-OHL-S. The Licensor may also specify that the Covered Source is subject to a specific version of the CERN-OHL or any later version in which case You may apply this or any later version of CERN-OHL with the same variant identifier published by CERN. 87 | 88 | 8.4 This Licence shall terminate with immediate effect if You fail to comply with any of its terms and conditions. 89 | 90 | 8.5 However, if You cease all breaches of this Licence, then Your Licence from any Licensor is reinstated unless such Licensor has terminated this Licence by giving You, while You remain in breach, a notice specifying the breach and requiring You to cure it within 30 days, and You have failed to come into compliance in all material respects by the end of the 30 day period. Should You repeat the breach after receipt of a cure notice and subsequent reinstatement, this Licence will terminate immediately and permanently. Section 6 shall continue to apply after any termination. 91 | 92 | 8.6 This Licence shall not be enforceable except by a Licensor acting as such, and third party beneficiary rights are specifically excluded. 93 | 94 | =================================================== 95 | 96 | Addendum 97 | 1. Any commercial distribution outlined here must receive authorization from the licensor (Emanuel Moshouris). 98 | 2. Any distribution must make clear that the product is not structurally rated. 99 | -------------------------------------------------------------------------------- /analysis/archive/tinyFrame.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "7491e1c4", 6 | "metadata": {}, 7 | "source": [ 8 | "## tinyFrame Analysis - General Calculations\n", 9 | "\n", 10 | "## Purpose\n", 11 | "This document serve as the repository for all analysis for the tinyFrame project." 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "id": "4beb8d1e", 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "import numpy, yaml, pint\n", 22 | "import numpy as np\n", 23 | "import matplotlib.pyplot as plt\n", 24 | "\n", 25 | "# Boilerplate\n", 26 | "## Initialize Pint Registry for Unit Manipulation\n", 27 | "## See documentation on Registries and Units in Pint here:\n", 28 | "## https://pint.readthedocs.io/en/stable/getting/tutorial.html\n", 29 | "from pint import UnitRegistry\n", 30 | "ureg = UnitRegistry(auto_reduce_dimensions=True)" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 2, 36 | "id": "562a9d0c-98ea-4b5c-9315-c290d3bfc36a", 37 | "metadata": {}, 38 | "outputs": [], 39 | "source": [ 40 | "preferred_units = [\n", 41 | " ureg.m, # distance L\n", 42 | " ureg.kilogram, # mass M\n", 43 | " ureg.s, # duration T\n", 44 | " ureg.c, # temperature Θ\n", 45 | " ureg.newton, # force L M T^-2\n", 46 | " ureg.W, # power L^2 M T^-3\n", 47 | "]" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 3, 53 | "id": "c8f6e174-a647-4d01-bc6d-8843a9d07ca0", 54 | "metadata": {}, 55 | "outputs": [ 56 | { 57 | "name": "stdout", 58 | "output_type": "stream", 59 | "text": [ 60 | "Motor Torque Value in Nm: 18.83 meter * newton\n", 61 | "18.828768 meter * newton\n", 62 | "weight of WC media\n", 63 | "13.622597373147508 force_pound\n", 64 | "Torque generated by WC media + parts\n", 65 | "6.426902916006658 meter * newton\n", 66 | "Power required of System\n", 67 | "6.730236995420445 watt\n", 68 | "FOS against Motor Torque\n", 69 | "2.93\n" 70 | ] 71 | } 72 | ], 73 | "source": [ 74 | "# Maximum Weight of Parts\n", 75 | "W_p = 15 * ureg.lbf\n", 76 | "\n", 77 | "# Densities\n", 78 | "\n", 79 | "# Density of Media\n", 80 | "rho_m = 90 * ureg.lbf / (ureg.ft*ureg.ft*ureg.ft)\n", 81 | "# Density of Aluminum\n", 82 | "rho_al = 2.7 * ureg.g / (ureg.cm*ureg.cm*ureg.cm)\n", 83 | "# Density of Stainless Steel\n", 84 | "rho_as = 7.85 * ureg.g / (ureg.cm*ureg.cm*ureg.cm)\n", 85 | "\n", 86 | "# Length of Barrel, L_b, that can contain Media\n", 87 | "L_b = 273 * ureg.mm\n", 88 | "\n", 89 | "# Tw = Torque Generated by Weight\n", 90 | "# Ta = Torque Remaining for Acceleration\n", 91 | "# e = weight eccentricity\n", 92 | "# D = diameter of the Barrel\n", 93 | "D = 200 * ureg.mm\n", 94 | "e = D/4\n", 95 | "\n", 96 | "# Motor Variable Declarations\n", 97 | "# Rated Motor Speed - No Load\n", 98 | "w_m = 10 * ureg.rpm\n", 99 | "# Rated Motor Torque\n", 100 | "T_m = 192 * ureg.kgf * ureg.cm\n", 101 | "print(f\"Motor Torque Value in Nm: {T_m.to(ureg.newton * ureg.meter):.2f}\")\n", 102 | "print(T_m.to(ureg.newton*ureg.m))\n", 103 | "\n", 104 | "# Gear Declarations\n", 105 | "\n", 106 | "# Number of Teeth on Bull Gear\n", 107 | "N_b = 1\n", 108 | "# Number of Teeth on Pinion\n", 109 | "N_p = 1\n", 110 | "\n", 111 | "# Volume of Assembly (Aluminum parts that are rotating)\n", 112 | "V_aa = 46000 * ureg.mm**3\n", 113 | "# Volume of Assembly (Steel parts that are rotating)\n", 114 | "V_as = 0 * ureg.mm**3\n", 115 | "\n", 116 | "# Weight of the Assembly\n", 117 | "W_a = (V_as * rho_as + V_aa * rho_al )* 9.81 * (ureg.m / ureg.s**2)\n", 118 | "\n", 119 | "# Mass of the media in worst case\n", 120 | "Vm_wc = 3.14 * (D/2)**2 * L_b / 2\n", 121 | "\n", 122 | "# Weight of the media\n", 123 | "W_m = Vm_wc * rho_m\n", 124 | "\n", 125 | "# Speed of Assembly (reduced through gears)\n", 126 | "speedAssembly = (N_p/N_b) * w_m\n", 127 | "\n", 128 | "# Torque Generated by the Media, Parts & Assembly\n", 129 | "T_w = e * (W_m + W_p + W_a)\n", 130 | "\n", 131 | "# WC power required for system\n", 132 | "# Torque (N.m) x Speed (RPM)\n", 133 | "P_sys = T_w * speedAssembly\n", 134 | "\n", 135 | "# Factor of Safety against Torque\n", 136 | "FOSTorqueMotor = T_m / T_w\n", 137 | "\n", 138 | "print(\"weight of WC media\")\n", 139 | "print(W_m.to(ureg.lbf))\n", 140 | "\n", 141 | "print(\"Torque generated by WC media + parts\")\n", 142 | "print(T_w.to(ureg.newton * ureg.m))\n", 143 | "\n", 144 | "print(\"Power required of System\")\n", 145 | "print(P_sys.to(ureg.watt))\n", 146 | "\n", 147 | "print(\"FOS against Motor Torque\")\n", 148 | "#print(FOSTorqueMotor)\n", 149 | "print(f\"{FOSTorqueMotor.magnitude:.2f}\")\n" 150 | ] 151 | }, 152 | { 153 | "cell_type": "markdown", 154 | "id": "5301c86c-29a7-4f2f-aa67-bf4d289ba7fe", 155 | "metadata": {}, 156 | "source": [ 157 | "# Plotting of Torque over rotation for Drum" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": 4, 163 | "id": "26dabb14-9f63-48a1-b4cc-db59f1d0f9d1", 164 | "metadata": {}, 165 | "outputs": [ 166 | { 167 | "data": { 168 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAHHCAYAAABHp6kXAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVeRJREFUeJzt3Qd0VNXWwPEdWiBA6J3QQUQQEBVBFBUQQUVEfSroE1RsYEWl+BR4ooAgKraHoOD7nggWsFKlSFNURIoCgtKkIxB6v9/aBydmMneSTDLt3vv/rTWE3JlM7pmZZHbOOXvvBMuyLAEAAHC4PLE+AQAAgHAgqAEAAK5AUAMAAFyBoAYAALgCQQ0AAHAFghoAAOAKBDUAAMAVCGoAAIArENQAAABXIKgBAAcYMGCAJCQkxPo0gLhGUAPEEX3Tys5l7ty5sT5Vx+vatavfY5qYmCh16tSRZ555Ro4ePZqj+xw/fry8/PLLOT6nw4cPm+CF5xfImXw5/DoAEfB///d/fp//97//lZkzZwYcP/vss6N8Zu6kgcyYMWPM/1NTU+XTTz+VZ599Vn777Td57733chTUrFy5Uh555JEcBzUDBw40/7/sssv8rvvXv/4lffr0ydH9Al5BUAPEkdtuu83v82+//dYENRmP58Tp06fl+PHjUrBgwVzfl1vky5fP77F94IEHpHnz5vL+++/LiBEjpFy5chJP56oXAMGx/AQ4zKFDh6RXr16SkpJiZhrOOussGT58uFiW5Xc7XVLp2bOnmXE455xzzG2nTZtmrvv555/liiuukEKFCknlypVl0KBB8s4775iv2bBhg9996HJIRtWqVTPLN+nt27fPzFD4zqtWrVoydOhQE0xl5pprrpEaNWrYXtesWTM5//zz0z7XAK9FixZSvHhxKVKkiBl7v379JFx0vHr/+lj+/vvvfte98cYbaY9jxYoVpUePHmbMPjqz8uWXX8rGjRvTlrT0cVIaTOqyVpMmTaRYsWJSuHBhueSSS2TOnDlpX6+Pe5kyZcz/dbbGdx++x99uT83JkyfNzFLNmjXNeen308fj2LFjfrfT4/o4L1iwQC688EIT2OpjrjOBgJsQ9gMOom+2HTp0MG+Gd911lzRq1EimT58uTzzxhGzZskVeeuklv9vPnj1bPvjgAxPclC5d2ry5bd++XS6//HLzhqjLGfoG+9Zbb5kAJ6d02aRly5bmHO69916pUqWKLFq0SPr27Svbtm3LdJ/JzTffLP/85z/l+++/lwsuuCDtuAYHOlM1bNiwtEBM35jPPfdc+fe//23exNetWycLFy6UcPIFdSVKlEg7pgGFBhqtW7eW+++/X9asWSNvvvmmOWf9/vnz55ennnrKLGH98ccfac+DBl5q//79Zpnr1ltvle7du8uBAwfk7bfflrZt28p3331nnkcNaPQ+9f6vv/566dSpk/laHW8wd999t7z77rty4403mkB38eLFMnjwYFm1apVMnjzZ77b6WOnt9HVzxx13mCBWA1MNtDRYA1zBAhC3evToodMvaZ9/8skn5vNBgwb53e7GG2+0EhISrHXr1qUd09vlyZPH+vnnn/1u+8gjj5jrFi9enHZs586dVrFixczx9evX+91H//79A86ratWq1h133JH2+bPPPmsVLlzY+vXXX/1u16dPHytv3rzWpk2bgo4xNTXVSkxMtHr16uV3/IUXXjBj2rhxo/n8pZdeMueza9cuKxz0/PWc9f70oo/d8OHDzfesX7++dfr06bTHpkCBAtaVV15pnTp1Ku3rX3vtNXM+77zzTtqxq6++2jw2GZ08edI6duyY37G9e/da5cqVs+688860Y3oewR5zPZb+tfDTTz+Zz++++26/2z3++OPm+OzZs9OO6TnpsXnz5qUd03HZPe6Ak7H8BDjIlClTJG/evPLQQw/5Hde/0jUGmTp1qt9xnT2pV69ewH1cdNFFZhnCR2cJunTpkuPz+vDDD81yis5u7N69O+2iMxunTp2SefPmBf3a5ORkadeunZlRSr+ENnHiRHOeOuujdMlJ6WberJa0QlnK07HrRZfLHn/8cbn44ovN9/At9Xz11Vdm+UiX1vLk+ftXps646LnrklNW9DkrUKCA+b+e+549e8xMmS6t/fjjjzk6d30e1WOPPRbwWlAZz0tfB/oc+eiYdfku4zIb4GQENYCD6JKM7ucoWrSobTaUXp9e9erVbe+jdu3aAcf1DS6n1q5da/br+AIE30WDGrVz585Mv16XoDZv3izffPON+Vyzj5YsWWKOp7+NBhy65KIbeG+55RYTCOUmwNG9JbpPRy9jx441j6Oea/qlON9jmvHx0SBF96VkfMyD0WUiXUrS71mqVCnz+GjgoUtWOaHfV4MsDcbSK1++vAkAM56X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tVLH+cknn/hdr/vqn3nmGalQoYIUKlRIWrduLWvXrvW7zZ49e6RLly6mUFXx4sXlrrvukoMHD4rTx961a9eA18FVV13l+LEPHjxYLrjgAlNpvGzZstKxY0dZs2aN322y8xrftGmTXH311ZKUlGTu54knnpCTJ0+K08d+2WWXBTzv9913n+PH/uabb8q5556bVlSuWbNmMnXqVNc/59kZu6Ofc81+Qs5NmDDBKlCggPXOO+9YP//8s9W9e3erePHi1o4dOyy36N+/v3XOOedY27ZtS7vs2rUr7fr77rvPSklJsWbNmmX98MMP1kUXXWQ1b97ccqIpU6ZYTz31lDVp0iTNCrQmT57sd/2QIUOsYsWKWZ988om1bNkyq0OHDlb16tWtI0eOpN3mqquusho2bGh9++231vz5861atWpZt956q+X0sd9xxx1mbOlfB3v27PG7jRPH3rZtW2vs2LHWypUrrZ9++slq3769VaVKFevgwYPZfo2fPHnSql+/vtW6dWtr6dKl5rEsXbq01bdvX8vpY2/ZsqX5vZb+eU9NTXX82D/77DPryy+/tH799VdrzZo1Vr9+/az8+fObx8LNz3l2xu7k55ygJpcuvPBCq0ePHmmfnzp1yqpYsaI1ePBgy01Bjb5R2dm3b5/5Yfjwww/Tjq1atcq8KX7zzTeWk2V8Yz99+rRVvnx5a9iwYX7jT0xMtN5//33z+S+//GK+7vvvv0+7zdSpU62EhARry5YtllMEC2quu+66oF/jlrHv3LnTjOPrr7/O9mtcf6nnyZPH2r59e9pt3nzzTSs5Odk6duyY5dSx+97gHn744aBf45axqxIlSlhjxozx1HOecexOf85ZfsqF48ePy5IlS8wSRPr+Uvr5N998I26iSyy6LFGjRg2zvKBTj0rHr63p0z8GujRVpUoV1z0G69evl+3bt/uNVXuR6JKjb6z6UZddzj///LTb6O31dbF48WJxurlz55qp5rPOOkvuv/9++fPPP9Ouc8vYU1NTzceSJUtm+zWuHxs0aCDlypVLu03btm1NM8Cff/5ZnDp2n/fee09Kly4t9evXl759+8rhw4fTrnPD2E+dOiUTJkyQQ4cOmaUYLz3npzKM3enPuacaWobb7t27zQsi/ROr9PPVq1eLW+ib9rhx48wb2bZt22TgwIFyySWXyMqVK82bfIECBcybWcbHQK9zE9947J5v33X6Ud/008uXL595k3D646H7Zzp16iTVq1eX3377Tfr16yft2rUzv+Dy5s3rirGfPn1aHnnkEbn44ovNL3OVnde4frR7Xfiuc+rYVefOnaVq1armj5rly5dL7969zb6bSZMmOX7sK1asMG/kun9G981MnjxZ6tWrJz/99JPrn/MVQcbu9OecoAZZ0jcuH91cpkGOvuA/+OADs1kW3nDLLbek/V//StPXQs2aNc3sTatWrcQNdGOoBusLFiwQrwk29nvuucfveddN8vp8a2Crz7+T6R9qGsDoDNVHH30kd9xxh3z99dfiBWcFGbsGNk5+zll+ygWdmtO/UDPuiNfPy5cvL26lf73UqVNH1q1bZ8apy3D79u1z/WPgG09mz7d+3Llzp9/1mhGgWUFuezx0KVJ/BvR14Iax9+zZU7744guZM2eOVK5cOe14dl7j+tHudeG7zqljt6N/1Kj0z7tTx66zMbVq1ZImTZqYTLCGDRvKK6+84onnvECQsTv9OSeoyeWLQl8Qs2bN8pvC1c/Tr026jaboasSu0buOP3/+/H6PgU5T6p4btz0GuuyiP7Dpx6pryLpfxDdW/ai/CHVN3mf27NnmdeH7xeAWf/zxh9lTo68DJ49d90Xrm7pOv+v56vOcXnZe4/pRp/PTB3UzZ8406bK+KX0njt2O/nWv0j/vThy7HX2tHjt2zNXPeVZjd/xzHtNtyi5J6dbsl3Hjxpnsj3vuucekdKffFe50vXr1subOnWutX7/eWrhwoUnj0/Q9zZTwpT5qGujs2bNN6mOzZs3MxYkOHDhgUhT1oj8eI0aMMP/fuHFjWkq3Pr+ffvqptXz5cpMNZJfS3bhxY2vx4sXWggULrNq1a8d9WnNWY9frHn/8cZP5oa+Dr776yjrvvPPM2I4ePerosd9///0mTV9f4+lTWA8fPpx2m6xe474U1yuvvNKkRk+bNs0qU6ZMXKS45mbs69ats/7973+bMevzrq/7GjVqWJdeeqnjx96nTx+T5aXj0p9l/Vwz9WbMmOHq5zyrsTv9OSeoCYNXX33VvPi1Xo2meGuNDje5+eabrQoVKpjxVapUyXyuL3wffUN/4IEHTEpgUlKSdf3115tfjE40Z84c84ae8aLpzL607qefftoqV66cCWZbtWpl6jyk9+eff5o38iJFipgUx27dupmgwMlj1zc5/QWmv7g01bVq1aqmjkXG4N2JY7cbs160fksor/ENGzZY7dq1swoVKmSCfv1j4MSJE5aTx75p0ybzZlayZEnzete6Q0888YRfzRKnjv3OO+80r2P9vaava/1Z9gU0bn7Osxq705/zBP0ntnNFAAAAuceeGgAA4AoENQAAwBUIagAAgCsQ1AAAAFcgqAEAAK5AUAMAAFyBoAYAALgCQQ2AmLjssstMV2gACBeCGgAA4AoENQBcSbssA/AWghoAEXfo0CH55z//KUWKFDGdfl988UW/67U78OOPPy6VKlWSwoULm67ec+fO9bvN6NGjJSUlRZKSkuT666+XESNGSPHixdOuHzBggDRq1EjGjBljuk0XLFjQHNfO4XfffbeUKVPGdBG+4oorZNmyZX73/emnn8p5551nvqZGjRoycOBAOXnypLlOO8nofVepUkUSExOlYsWK8tBDD0Xw0QKQU/ly/JUAkE1PPPGEfP311yZ4KFu2rPTr109+/PFHE4Sonj17yi+//CITJkwwQcPkyZPlqquukhUrVkjt2rVl4cKFct9998nQoUOlQ4cO8tVXX8nTTz8d8H3WrVsnH3/8sUyaNEny5s1rjt10001SqFAhmTp1qhQrVkxGjRolrVq1kl9//VVKliwp8+fPNwHXyJEj5ZJLLpHffvtN7rnnHvO1/fv3N/f30ksvmXM755xzZPv27QFBEYA4EeuOmgDcTbt0azfgDz74wK+bt3b3ffjhh62NGzdaefPmtbZs2eL3ddo5uG/fvub/2hn+6quv9ru+S5cuVrFixdI+79+/v+kgvnPnzrRj8+fPN93Cjx496ve1NWvWtEaNGpX2fZ5//nm/6//v//7PdKZXL774olWnTh3r+PHjYXg0AEQSMzUAIkpnPnR/iy4p+egMyVlnnWX+r7Mxp06dkjp16gQsSZUqVcr8f82aNWbJKb0LL7xQvvjiC79jVatWNctMPjqjcvDgwbT78Tly5Ig5L99tdCboueeeS7tez+fo0aNy+PBhM9Pz8ssvm2UpnT1q3769XHvttZIvH78+gXjDTyWAmNKgQ5eKlixZkrZk5KN7cEKh+3Ey3rfu4cm4P0f59uPobXQPTadOnQJuo3tsdB+PBlW65DVz5kx54IEHZNiwYWY5LX/+/CGdH4DIIqgBEFE1a9Y0b/6LFy82m23V3r17zZ6Wli1bSuPGjc3MyM6dO82eFjs6q/P999/7Hcv4uR3d/Kt7YHRWpVq1akFvo0FLrVq1gt6P7snR2Rm99OjRQ+rWrWtmmPRrAcQPghoAEaWzLXfddZfZLKzLQLpR+KmnnpI8ec4kX+qyU5cuXcxmXc2K0iBn165dMmvWLDn33HPl6quvlgcffFAuvfRSk/GkgcXs2bPNxt+EhIRMv3fr1q2lWbNm0rFjR3nhhRfM99q6dat8+eWXZjnr/PPPl2eeeUauueYaE3DdeOON5rx0SWrlypUyaNAgGTdunAm6dPlMM6/+97//mSBHl7oAxBdSugFEnC7X6CyMBiQaaLRo0UKaNGmSdv3YsWNNUNOrVy8zK6NBiM7E+GZ2Lr74YvnPf/5jgpqGDRvKtGnT5NFHH01L2w5Gg54pU6aYgKhbt24mqLnllltk48aNUq5cOXObtm3bmr05M2bMkAsuuEAuuugik+3kC1p0mUrTyfUcNMjSZajPP/88YJ8OgNhL0N3CsT4JAAhV9+7dZfXq1SYlGwAUy08AHGH48OHSpk0bsxlYl57effddeeONN2J9WgDiCDM1ABzhH//4h8liOnDggEmv1n02WpAPAHwIagAAgCuwURgAALgCQQ0AAHAFghoAAOAKBDUAAMAVCGoAAIArENQAAABXIKgBAACuQFADAABcgaAGAACIG/w/NHqb17k9vj8AAAAASUVORK5CYII=", 169 | "text/plain": [ 170 | "
" 171 | ] 172 | }, 173 | "metadata": {}, 174 | "output_type": "display_data" 175 | } 176 | ], 177 | "source": [ 178 | "# Step 1: Define your X and Y values in lists\n", 179 | "# For this example, let's use some sample data\n", 180 | "\n", 181 | "# Initialize empty lists to store X (rotation) and Y (torque) values\n", 182 | "x_values = [] # Rotation (X)\n", 183 | "y_values = [] # Torque (Y)\n", 184 | "\n", 185 | "for x in range(0, 360): # This gives X values: 0, 1, 2, ..., 10\n", 186 | " e_fn = np.sin(np.radians(x))*e\n", 187 | " \n", 188 | " y = e_fn * (W_m + W_p)\n", 189 | " x_values.append(x) # Append X value to the list\n", 190 | " x_label = 'degrees'\n", 191 | " \n", 192 | " y_values.append(y.to(ureg.newton * ureg.meter).magnitude) \n", 193 | " y_label = str(y.to(ureg.newton * ureg.meter).units)\n", 194 | "\n", 195 | "\n", 196 | "\n", 197 | "# Step 2: Create the plot\n", 198 | "plt.plot(x_values, y_values, marker='.', linestyle='-', label='Torque')\n", 199 | "\n", 200 | "# Step 3: Add labels and title\n", 201 | "plt.xlabel(x_label)\n", 202 | "plt.ylabel(y_label)\n", 203 | "plt.title('Torque vs. Rotation')\n", 204 | "plt.legend() # Show the label for the data\n", 205 | "\n", 206 | "# Step 4: Add a grid for better readability\n", 207 | "plt.grid(True)\n", 208 | "\n", 209 | "# Step 5: Display the plot\n", 210 | "plt.show()" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 5, 216 | "id": "bc3f82a0-4cf9-4fb7-9488-7cb7b6b1c318", 217 | "metadata": {}, 218 | "outputs": [ 219 | { 220 | "name": "stdout", 221 | "output_type": "stream", 222 | "text": [ 223 | "80.7303272800411 force_pound\n" 224 | ] 225 | } 226 | ], 227 | "source": [ 228 | "# Declare the weight of the Frame\n", 229 | "# Volume of the Barrel is from CAD as of 04/02/25\n", 230 | "volumeBarrel = 8750962 * ureg.mm*ureg.mm*ureg.mm\n", 231 | "W_b = volumeBarrel * rho_al * 9.81 * ureg.m / (ureg.s * ureg.s)\n", 232 | "# Weight of Media, Parts & Frame\n", 233 | "W_t = W_b + W_m + W_p\n", 234 | "\n", 235 | "print(W_t.to(ureg.lbf))\n" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "id": "98159745-7007-4742-8e81-85202102fe43", 241 | "metadata": {}, 242 | "source": [ 243 | "Equation that describes deflection as a function of loading for wrap:\n", 244 | "$$\\delta = \\frac{Pl^3}{3EI}$$\n", 245 | "\n", 246 | "Re-writing the equation to represent this as a function to describe loading:\n", 247 | "$$P = \\frac{3\\delta EI}{l^3}$$\n", 248 | "\n", 249 | "\n", 250 | "\n", 251 | "Equation for Second Moment of Area of a Rectangular beam:\n", 252 | "$$I = \\frac{bh^3}{12}$$" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": 6, 258 | "id": "aebb7ca9-ddcb-452a-9bfd-b5606d5dec0d", 259 | "metadata": {}, 260 | "outputs": [], 261 | "source": [ 262 | "E_steel = 2e11 * ureg.Pa # Pa - young's modulus\n", 263 | "l_tab = 50 * ureg.mm # diameter of barrel\n", 264 | "del_barrel = 20 * ureg.mm # gross approximation - need to rework this\n", 265 | "\n", 266 | "# Second moment of Area for Beam\n", 267 | "b = 30 * ureg.mm\n", 268 | "h = 0.030 * ureg.inch\n", 269 | "I_wrap = (b * h**3) / 12" 270 | ] 271 | }, 272 | { 273 | "cell_type": "code", 274 | "execution_count": 7, 275 | "id": "979d931b-7857-4293-a5ce-5988fdc0d660", 276 | "metadata": {}, 277 | "outputs": [ 278 | { 279 | "name": "stdout", 280 | "output_type": "stream", 281 | "text": [ 282 | "23.872051328490596 force_pound\n" 283 | ] 284 | } 285 | ], 286 | "source": [ 287 | "# Figure out load it takes to wrap cladding to create barrel\n", 288 | "P = (3 * del_barrel * E_steel * I_wrap ) / (l_tab**3)\n", 289 | "print(P.to(ureg.lbf))" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 8, 295 | "id": "4651e611-d2e5-45b2-b595-e92fc6826a86", 296 | "metadata": {}, 297 | "outputs": [ 298 | { 299 | "name": "stdout", 300 | "output_type": "stream", 301 | "text": [ 302 | "270.8333333333333 newton\n", 303 | "60.885755422838265 force_pound\n" 304 | ] 305 | } 306 | ], 307 | "source": [ 308 | "# Load to apply to flexure, P\n", 309 | "P = (6.5 * ureg.newton * ureg.meter) / (3 * 8 * ureg.mm)\n", 310 | "\n", 311 | "print(P)\n", 312 | "print(P.to(ureg.lbf))\n" 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": 9, 318 | "id": "882800f6-d019-48a8-b0e5-bc268038568b", 319 | "metadata": {}, 320 | "outputs": [ 321 | { 322 | "name": "stdout", 323 | "output_type": "stream", 324 | "text": [ 325 | "0.49999999999999994\n", 326 | "0.8660254037844387\n" 327 | ] 328 | } 329 | ], 330 | "source": [ 331 | "\n", 332 | "# Unit Vector Generation for Flexure Loading FEA\n", 333 | "F_y = 1 * np.sin(np.deg2rad(30)) # X\n", 334 | "F_x = 1 * np.cos(np.deg2rad(30)) # Y, Z in Simulation\n", 335 | "\n", 336 | "print(F_y)\n", 337 | "print(F_x)" 338 | ] 339 | }, 340 | { 341 | "cell_type": "code", 342 | "execution_count": 10, 343 | "id": "c1ed6d81-52ff-4726-95f1-fb9057629969", 344 | "metadata": {}, 345 | "outputs": [ 346 | { 347 | "name": "stdout", 348 | "output_type": "stream", 349 | "text": [ 350 | "30.442877711419126 force_pound\n", 351 | "52.728610924784086 force_pound\n" 352 | ] 353 | } 354 | ], 355 | "source": [ 356 | "# Find the actual load components regression based on the\n", 357 | "# unit vectors that are used in FEA\n", 358 | "P_y = P * F_y\n", 359 | "P_x = P * F_x\n", 360 | "\n", 361 | "print(P_y.to(ureg.lbf))\n", 362 | "print(P_x.to(ureg.lbf))" 363 | ] 364 | }, 365 | { 366 | "cell_type": "markdown", 367 | "id": "12f5e2fb-4cd1-48f2-8340-a4441a518b46", 368 | "metadata": {}, 369 | "source": [ 370 | "# Position of Flexure Location Detail Along Barrel Calculation\n", 371 | "Derived from:\n", 372 | "$$s = r \\cdot \\theta$$\n", 373 | "$$ \\frac{s}{r} = \\theta$$\n", 374 | "\n", 375 | "in radians.\n" 376 | ] 377 | }, 378 | { 379 | "cell_type": "code", 380 | "execution_count": 11, 381 | "id": "30197302-857e-4614-bf7a-bb1dc928d51e", 382 | "metadata": {}, 383 | "outputs": [ 384 | { 385 | "name": "stdout", 386 | "output_type": "stream", 387 | "text": [ 388 | "angle in radians is: {}\n", 389 | "angle in degrees is: {}\n" 390 | ] 391 | } 392 | ], 393 | "source": [ 394 | "# Test\n", 395 | "s = 92 * ureg.mm\n", 396 | "r = 100 * ureg.mm\n", 397 | "theta_flexure = s/r * ureg.rad\n", 398 | "\n", 399 | "print(f\"angle in radians is:\", {theta_flexure})\n", 400 | "print(f\"angle in degrees is:\", {theta_flexure.to(ureg.deg)})" 401 | ] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "execution_count": 12, 406 | "id": "e82e6798-a5f0-47d2-8e90-606d03ab3dc4", 407 | "metadata": {}, 408 | "outputs": [ 409 | { 410 | "name": "stdout", 411 | "output_type": "stream", 412 | "text": [ 413 | "2.688166666666668 kip_per_square_inch\n" 414 | ] 415 | } 416 | ], 417 | "source": [ 418 | "# Scratch for Stress Calculation\n", 419 | "\n", 420 | "a_1 = 6 * ureg.mm * ureg.mm\n", 421 | "P_1 = 50 * ureg.lbf\n", 422 | "N_1 = 2\n", 423 | "\n", 424 | "# Shear Stress in a member\n", 425 | "tau_1 = P_1 / (N_1 * a_1)\n", 426 | "\n", 427 | "print(tau_1.to(ureg.ksi))\n", 428 | "\n" 429 | ] 430 | }, 431 | { 432 | "cell_type": "markdown", 433 | "id": "5abf87ae-e705-46d8-9bcd-0840c84a1f44", 434 | "metadata": {}, 435 | "source": [ 436 | "# Is Switching to Aluminum Worth it?\n", 437 | "Aluminum has a lower modulus of elasticity, but is thicker - let's find out:\n", 438 | "$$\\delta_{factor} = \\frac{E_s \\cdot h_s^3}{E_A \\cdot h_A^3}$$" 439 | ] 440 | }, 441 | { 442 | "cell_type": "code", 443 | "execution_count": 13, 444 | "id": "f12c58b8-68d4-4aaa-bcfa-24b63ccf7b00", 445 | "metadata": {}, 446 | "outputs": [ 447 | { 448 | "name": "stdout", 449 | "output_type": "stream", 450 | "text": [ 451 | "1.1390624999999994\n" 452 | ] 453 | } 454 | ], 455 | "source": [ 456 | "E_s = 27\n", 457 | "E_a = 10\n", 458 | "\n", 459 | "h_s = 0.03\n", 460 | "h_a = 0.04\n", 461 | "\n", 462 | "del_factor = E_s * h_s**3 / (E_a * h_a**3)\n", 463 | "\n", 464 | "print(del_factor)" 465 | ] 466 | }, 467 | { 468 | "cell_type": "markdown", 469 | "id": "2c1ec066-cad2-464f-9d15-032baddafacd", 470 | "metadata": {}, 471 | "source": [ 472 | "# What's the Critical Speed?\n", 473 | "This equation describes the maximum speed the tumbler can spin before the media and parts adhere to the wall of the barrel.\n", 474 | "\n", 475 | "To tumble the parts as quickly as possible, we impart as much energy as possible without passing the critical speed of the tumbler.\n", 476 | "\n", 477 | "$$\\omega = \\sqrt{\\frac{g}{r}}$$" 478 | ] 479 | }, 480 | { 481 | "cell_type": "code", 482 | "execution_count": 14, 483 | "id": "6fe0a972-4f58-411f-af75-5db0cea5638e", 484 | "metadata": {}, 485 | "outputs": [ 486 | { 487 | "name": "stdout", 488 | "output_type": "stream", 489 | "text": [ 490 | "Angular speed = 9.905 rad/s or 94.58 RPM\n" 491 | ] 492 | } 493 | ], 494 | "source": [ 495 | "# Define variables\n", 496 | "g = 9.81 # acceleration due to gravity (m/s^2)\n", 497 | "r = .10 # radius (m)\n", 498 | "\n", 499 | "# Calculate angular speed\n", 500 | "omega = np.sqrt(g / r)\n", 501 | "\n", 502 | "# Convert to RPM\n", 503 | "rpm = omega * 60 / (2 * np.pi)\n", 504 | "\n", 505 | "print(f\"Angular speed = {omega:.3f} rad/s or {rpm:.2f} RPM\")" 506 | ] 507 | }, 508 | { 509 | "cell_type": "code", 510 | "execution_count": null, 511 | "id": "136bdf9d-46c4-432c-8ee5-2bd987b7b494", 512 | "metadata": {}, 513 | "outputs": [], 514 | "source": [] 515 | } 516 | ], 517 | "metadata": { 518 | "kernelspec": { 519 | "display_name": "Python 3 (ipykernel)", 520 | "language": "python", 521 | "name": "python3" 522 | }, 523 | "language_info": { 524 | "codemirror_mode": { 525 | "name": "ipython", 526 | "version": 3 527 | }, 528 | "file_extension": ".py", 529 | "mimetype": "text/x-python", 530 | "name": "python", 531 | "nbconvert_exporter": "python", 532 | "pygments_lexer": "ipython3", 533 | "version": "3.13.5" 534 | } 535 | }, 536 | "nbformat": 4, 537 | "nbformat_minor": 5 538 | } 539 | -------------------------------------------------------------------------------- /analysis/tinyFrameProrotypingCalcs.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "7491e1c4", 6 | "metadata": {}, 7 | "source": [ 8 | "## tinyFrame Analysis - General Calculations\n", 9 | "\n", 10 | "## Purpose\n", 11 | "This document serve as the repository for all analysis for the tinyFrame project.\n", 12 | "\n", 13 | "## NOTE:\n", 14 | "This analysis is for Ductile materials only - it does not calculate principal stresses and is unsuitable for brittle materials.\n" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "id": "4beb8d1e", 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "import numpy, yaml, pint\n", 25 | "import numpy as np\n", 26 | "import matplotlib.pyplot as plt\n", 27 | "\n", 28 | "# Boilerplate\n", 29 | "## Initialize Pint Registry for Unit Manipulation\n", 30 | "## See documentation on Registries and Units in Pint here:\n", 31 | "## https://pint.readthedocs.io/en/stable/getting/tutorial.html\n", 32 | "from pint import UnitRegistry\n", 33 | "ureg = UnitRegistry(auto_reduce_dimensions=True)" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 4, 39 | "id": "562a9d0c-98ea-4b5c-9315-c290d3bfc36a", 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "preferred_units = [\n", 44 | " ureg.m, # distance L\n", 45 | " ureg.kilogram, # mass M\n", 46 | " ureg.s, # duration T\n", 47 | " ureg.c, # temperature Θ\n", 48 | " ureg.newton, # force L M T^-2\n", 49 | " ureg.W, # power L^2 M T^-3\n", 50 | "]" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "id": "98159745-7007-4742-8e81-85202102fe43", 56 | "metadata": {}, 57 | "source": [ 58 | "The equation that describes insert force for the locking tab is from the cantilever beam for a fixed support equation:\n", 59 | "\n", 60 | "$$\\delta = \\frac{Pl^3}{3EI}$$\n", 61 | "\n", 62 | "Equation for Second Moment of Area of a Rectangular beam:\n", 63 | "$$I = \\frac{bh^3}{12}$$\n", 64 | "\n", 65 | "Solving the equation above and replacing the second moment of area, I with the locking tab dimensions, we get:\n", 66 | "\n", 67 | "$$\\delta = \\frac{4 P L^3}{E b h^3}$$\n", 68 | "\n", 69 | "We normalize to the number of tabs in the system (four) and end up with:\n", 70 | "\n", 71 | "\n", 72 | "$$\\delta = \\frac{P L_{protoyped}^3}{E b h^3}$$\n", 73 | "\n", 74 | "## First, we declare inputs from the user - tubing size, material, ecetera:\n" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 33, 80 | "id": "b5b60ea7-965c-4176-a1eb-de43eef4af08", 81 | "metadata": {}, 82 | "outputs": [], 83 | "source": [ 84 | "# First, declare inputs\n", 85 | "# Tube Width, width\n", 86 | "tWidth = 50.8 * ureg.mm\n", 87 | "# Thickness (gauge) of tube\n", 88 | "h = 1.651 * ureg.mm\n", 89 | "\n", 90 | "# Material Properties\n", 91 | "# Yield Stress of the Material\n", 92 | "# Currently: Aluminum 6061-T6\n", 93 | "sigma_yield = 42 * ureg.ksi\n", 94 | "sigma_yield_welded = 27 * ureg.ksi\n", 95 | "tau_yield_welded = 0.577 * sigma_yield_welded\n", 96 | "\n", 97 | "# E in Pa - young's modulus\n", 98 | "E = 69e9 * ureg.newton / (ureg.meter * ureg.meter)\n" 99 | ] 100 | }, 101 | { 102 | "cell_type": "markdown", 103 | "id": "aa6cd1c3-ce42-4713-b3df-d244055abba5", 104 | "metadata": {}, 105 | "source": [ 106 | "## The following declarations are from prototyping" 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "execution_count": 34, 112 | "id": "aebb7ca9-ddcb-452a-9bfd-b5606d5dec0d", 113 | "metadata": {}, 114 | "outputs": [], 115 | "source": [ 116 | "# Values determined from Prototyping (Thanks Jonathan & Bryce!)\n", 117 | "P = 10 * ureg.lbf # From Prototyping\n", 118 | "\n", 119 | "# From testing done at FabWorks, the ratio of the tab is:\n", 120 | "# NOTE: If the geometry of the design changes, this needs to as well\n", 121 | "bRatio = 3.19/50.8\n", 122 | "\n", 123 | "# This is the distance required to travel to account for the depth\n", 124 | " # the depth of the tab\n", 125 | "del_tab = 6.35 * ureg.mm # From CAD\n", 126 | "\n", 127 | "# Calculate b (locking tab width required)\n", 128 | "b = bRatio * tWidth \n" 129 | ] 130 | }, 131 | { 132 | "cell_type": "markdown", 133 | "id": "e38570cf-2d91-4068-9cf6-700c3e497e70", 134 | "metadata": {}, 135 | "source": [ 136 | "We need to calculate the length of the flexure (locking tabs) required - solve the above equation for L:\n", 137 | "\n", 138 | "$$L = \\sqrt[3]{\\frac{3 \\delta \\, E \\, b \\, h^3}{12P}}$$\n", 139 | "\n", 140 | "P represents the global press force, but we assume there are always four tabs, so we divide P by 4 and are left with:\n", 141 | "\n", 142 | "$$L = \\sqrt[3]{\\frac{\\delta \\, E \\, b \\, h^3}{P}}$$" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": 35, 148 | "id": "979d931b-7857-4293-a5ce-5988fdc0d660", 149 | "metadata": {}, 150 | "outputs": [ 151 | { 152 | "name": "stdout", 153 | "output_type": "stream", 154 | "text": [ 155 | "Length of locking tab flexure is: 52.10 millimeter\n", 156 | "Locking tab flexure width is: 3.19 millimeter\n" 157 | ] 158 | } 159 | ], 160 | "source": [ 161 | "# Determine the length of the locking tabs\n", 162 | "L = ((del_tab * E * b * h**3) / (P)) ** (1/3)\n", 163 | "\n", 164 | "print(f\"Length of locking tab flexure is: {L:.2f}\")\n", 165 | "print(f\"Locking tab flexure width is: {b:.2f}\")\n" 166 | ] 167 | }, 168 | { 169 | "cell_type": "markdown", 170 | "id": "3c7ae92b-e7db-44ca-8b47-ca51f6a88fe7", 171 | "metadata": {}, 172 | "source": [ 173 | "Now, we check for bending stress:\n", 174 | "\n", 175 | "$$\\sigma_b = \\frac{M \\cdot c}{I}$$\n", 176 | "$$\\sigma_b = \\frac{M \\cdot c}{\\frac{bh**3}{12}}$$\n", 177 | "$$\\sigma_b = \\frac{12M \\cdot h/2}{bh^3}$$\n", 178 | "$$\\sigma_b = \\frac{6M \\cdot h}{bh^3}$$\n", 179 | "$$\\sigma_b = \\frac{6M}{bh^2}$$" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 37, 185 | "id": "2ae9a528-73dd-41c3-9a23-9551cc02a54c", 186 | "metadata": {}, 187 | "outputs": [ 188 | { 189 | "name": "stdout", 190 | "output_type": "stream", 191 | "text": [ 192 | "Bending stress seen by the locking tab: \n", 193 | "57.98245909656805 kip_per_square_inch\n", 194 | "Factor of safety against yield: \n", 195 | "0.7243569978646524 dimensionless\n" 196 | ] 197 | } 198 | ], 199 | "source": [ 200 | "# Calculations for geometry of Bending Region\n", 201 | "c = h/2\n", 202 | "I = b*h**3 / 12\n", 203 | "\n", 204 | "# Calculate requisite components\n", 205 | "# Moment for a cantilever - normalized by N (number of tabs, 4) is:\n", 206 | "M = P/4 * L\n", 207 | "\n", 208 | "# Calculate the bending stress\n", 209 | "sigma_bending = M * c / I\n", 210 | "\n", 211 | "# What's the factor of safety against the material yield stress?\n", 212 | "FOS_install = sigma_yield / sigma_bending\n", 213 | "\n", 214 | "print(\"Bending stress seen by the locking tab: \")\n", 215 | "print(sigma_bending.to(ureg.ksi))\n", 216 | "\n", 217 | "print(\"Factor of safety against yield: \")\n", 218 | "print(FOS_install)" 219 | ] 220 | }, 221 | { 222 | "cell_type": "markdown", 223 | "id": "c8cfceee-60e3-48a3-be0b-fcae04642542", 224 | "metadata": {}, 225 | "source": [ 226 | "# Checking for Combined Loading of Torsional and Bending Stresses\n", 227 | "## We first calculate the torsional stress in the beam caused by off axis loading\n", 228 | "Torsional stress in a beam is:\n", 229 | "$$ \\tau = \\frac{TR}{J}$$\n", 230 | "\n", 231 | "For a non-uniform (circular) about the Z axis shape, beams have a constant applied. We calculate the constant below.\n", 232 | "\n", 233 | "The second polar moment of area for a rectangular beam is:\n", 234 | "$$J \\approx \\beta a b^3$$\n", 235 | "\n", 236 | "Where:\n", 237 | "\n", 238 | "a is the length of the long side\n", 239 | "\n", 240 | "b is the length of the short side\n", 241 | "\n", 242 | "β is the torsional constant\n", 243 | "\n", 244 | "\n", 245 | "First, calculate ratio a/b and declare it as W to pass to a function to return torsional constant $\\beta$." 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": 47, 251 | "id": "2774071f-6b82-4986-ac02-eece24d3ea91", 252 | "metadata": {}, 253 | "outputs": [ 254 | { 255 | "name": "stdout", 256 | "output_type": "stream", 257 | "text": [ 258 | "0.46 kip_per_square_inch\n" 259 | ] 260 | } 261 | ], 262 | "source": [ 263 | "# Variables for Torsional Stress Calculations\n", 264 | "# Note: Normalizing P (load) to P_ to delinate load distributed over four locking tabs\n", 265 | "# e is the hypotenuse of the b/h triangle: \n", 266 | "e = 3.7 *(tWidth / 50.8) \n", 267 | "r = (b**2 / 4 + h**2 / 4)**(1/2)\n", 268 | "P_ = P / 4\n", 269 | "\n", 270 | "# Calculations\n", 271 | "T = P_ * e\n", 272 | "\n", 273 | "#Known data points\n", 274 | "W_values = np.array([1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 10.0])\n", 275 | "beta_values = np.array([0.141, 0.196, 0.229, 0.249, 0.263, 0.281, 0.291, 0.299, 0.312])\n", 276 | "\n", 277 | "# Equations for second polar moment of area have an underscore suffix\n", 278 | "a_ = b\n", 279 | "b_ = h\n", 280 | "W = a_/b_\n", 281 | "\n", 282 | "# Calculate Torsional Constant\n", 283 | "beta = float(np.interp(W, W_values, beta_values))\n", 284 | "\n", 285 | "# Calculate Second Polar Moment of Area\n", 286 | "J = beta * a_ * b**3\n", 287 | "\n", 288 | "# Torsional Stress is Tr/J\n", 289 | "tau_max = T * r / J\n", 290 | "print(f\"{tau_max.to(ureg.ksi):.2f}\")" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "id": "bb4b3063-1ffe-4058-9b2a-04fde7ba1be7", 296 | "metadata": {}, 297 | "source": [ 298 | "# Finally, we calculate the combined stress\n", 299 | "Pulled from the equivalent von mises stress theory, reference here: https://www.continuummechanics.org/vonmisesstress.html\n", 300 | "$$\\sigma_v = \\sqrt{\\sigma_{b}^2 + 3\\tau^2}$$\n", 301 | "\n", 302 | "$$L^3 = \\frac{\\delta E\\,bh^3}{\\sqrt{\\left( \\frac{6PL}{bh^2} \\right)^2 + 3\\tau^2}}$$\n" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 49, 308 | "id": "cfe29019-0f11-41ef-ad8a-dc1419da54c7", 309 | "metadata": {}, 310 | "outputs": [ 311 | { 312 | "name": "stdout", 313 | "output_type": "stream", 314 | "text": [ 315 | "399.8128844626018 megapascal\n", 316 | "57.9879562778453 kip_per_square_inch\n" 317 | ] 318 | } 319 | ], 320 | "source": [ 321 | "# Equivalent Stress\n", 322 | "sigma_v = (sigma_bending**2 + 3*tau_max**2)**(1/2)\n", 323 | "\n", 324 | "print(sigma_v.to(ureg.MPa))\n", 325 | "print(sigma_v.to(ureg.ksi))" 326 | ] 327 | }, 328 | { 329 | "cell_type": "markdown", 330 | "id": "6cd9e460-00d0-49b9-a31c-cad308d83238", 331 | "metadata": {}, 332 | "source": [ 333 | "# Sizing Chart Calculations\n", 334 | "\n", 335 | "1. Find L\n", 336 | "2. Find the bending stress\n", 337 | "3. Combine with Torsional stress\n", 338 | "4. Apply factor of safety\n", 339 | "5. If\n", 340 | " sigma > sigma_yield -> reduce the length of the flexure\n", 341 | " else: return length\n", 342 | "\n", 343 | "## First, we calculate the requisite b and L values for the tab locking flexure" 344 | ] 345 | }, 346 | { 347 | "cell_type": "markdown", 348 | "id": "ac8e7ea9-4eac-41dd-85a9-76ec4bdf4ec0", 349 | "metadata": {}, 350 | "source": [ 351 | "## We calculate the required length and plot" 352 | ] 353 | }, 354 | { 355 | "cell_type": "code", 356 | "execution_count": 102, 357 | "id": "d1716490-460c-4954-babf-da9775b6ccaf", 358 | "metadata": {}, 359 | "outputs": [ 360 | { 361 | "data": { 362 | "image/png": "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", 363 | "text/plain": [ 364 | "
" 365 | ] 366 | }, 367 | "metadata": {}, 368 | "output_type": "display_data" 369 | } 370 | ], 371 | "source": [ 372 | "# Arguments: y -> yield stress\n", 373 | "def findLength(y, E, b, h, P, del_tab):\n", 374 | " # Determine the length of the locking tabs\n", 375 | " L = ((del_tab * E * b * h**3) / (P)) ** (1/3)\n", 376 | "\n", 377 | " # Check against Yield Stress with appropriate safety factor (1.25)\n", 378 | " stress_current = \n", 379 | " return L\n", 380 | "# Calcualte thickness values and store them in an array\n", 381 | "tValues = np.linspace(h.to('mm').magnitude - Z, h.to('mm').magnitude + Z, 10)\n", 382 | "\n", 383 | "def makeData(tValues):\n", 384 | " L_values = [findLength(sigma_yield, E, b, T, P, \n", 385 | " del_tab) for T in T_values]\n", 386 | " return {'T': T_values, 'L': L_values}\n", 387 | "\n", 388 | "def plot_1(X):\n", 389 | " L = X['L']\n", 390 | " T = X['T']\n", 391 | " plt.plot(T, L)\n", 392 | " plt.xlabel('Thickness')\n", 393 | " plt.ylabel('Flexure Length Required')\n", 394 | " plt.title('Length vs Thickness')\n", 395 | " plt.grid(True)\n", 396 | " plt.show()\n", 397 | "\n", 398 | "data = makeData(tValues)\n", 399 | "plot_1(data)" 400 | ] 401 | }, 402 | { 403 | "cell_type": "markdown", 404 | "id": "51088f03-eb8d-4382-8fb1-2e01928d59d4", 405 | "metadata": {}, 406 | "source": [ 407 | "# Weld Calculations\n", 408 | "\n", 409 | "The shear stress in a weld is: $$\\tau \\approx \\frac{F}{A} = \\frac{F}{0.707 \\cdot h \\cdot L_{weld}}$$\n", 410 | "\n", 411 | "The welds will counter-act the moment generated by loading the frame at the center of the member. These resultant forces are derived by drawing a free body diagram about the center of the weld pattern and derived from the equation below:\n", 412 | "$$M = \\frac{PL}{4} = \\left( \\frac{w}{2} \\cdot R \\right) \\cdot 2 \\quad \\Rightarrow \\quad \\frac{PL}{4} = R \\cdot \\omega$$\n", 413 | "\n", 414 | "Solving for P and denominating the reaction load as being the value for both welds but acting in opposing directions:\n", 415 | "$$ R_{1,2} = \\frac{PL}{4w}$$\n", 416 | "\n", 417 | "To find the maximum load the system is capable of, we substitute R into F for the fillet weld equations, and solve for P, simplifying to:\n", 418 | "$$P = \\frac{2 \\cdot \\left( \\tau_{yield} \\cdot 0.707 \\cdot h \\cdot L_{weld} \\right) \\cdot N \\cdot w}{L}$$\n", 419 | "\n", 420 | "Where: \n", 421 | "N is the number of welds \n", 422 | "h is the size of the welds \n", 423 | "L is the length of the weld \n", 424 | "w is the width of the tube \n" 425 | ] 426 | }, 427 | { 428 | "cell_type": "code", 429 | "execution_count": 52, 430 | "id": "76152a34-75e6-4825-bee9-7e2961ffc1d9", 431 | "metadata": {}, 432 | "outputs": [ 433 | { 434 | "name": "stdout", 435 | "output_type": "stream", 436 | "text": [ 437 | "The maximum load the frame can withstand with welds is: 647.72 force_pound\n" 438 | ] 439 | } 440 | ], 441 | "source": [ 442 | "# The width of the fillet weld is in this case is roughly 3/16\"\n", 443 | "L_beam = 898.4 * ureg.mm\n", 444 | "h_weld = 3/16 * ureg.inch\n", 445 | "L_weld = tWidth # The length of the fillet weld is the length of the tube width \n", 446 | "w = tWidth # Re-declaring the variable tWidth (width of the tube) as w for legibility with the equations\n", 447 | "nWelds = 2\n", 448 | "\n", 449 | "# Solve the equation:\n", 450 | "# Note: We use tau_yield_welded because of the HAZ knockdown effect. Source:\n", 451 | "# https://esab.com/us/nam_en/esab-university/articles/the-haz-in-aluminum-welds/\n", 452 | "P_max = (4 * tau_yield_welded * 0.707 * h * L_weld * nWelds * w) / L_beam\n", 453 | "\n", 454 | "print(f\"The maximum load the frame can withstand with welds is: {P_max.to(ureg.lbf):.2f}\")" 455 | ] 456 | }, 457 | { 458 | "cell_type": "code", 459 | "execution_count": 55, 460 | "id": "2cbc821a-692c-46ac-8c36-13f9bb1a51cd", 461 | "metadata": {}, 462 | "outputs": [ 463 | { 464 | "name": "stdout", 465 | "output_type": "stream", 466 | "text": [ 467 | "766.3346456692916 force_pound\n" 468 | ] 469 | } 470 | ], 471 | "source": [ 472 | "# Strength of a singular tab (not yet system normalized)\n", 473 | "R_t = sigma_yield * h * 7.13 * ureg.mm\n", 474 | "\n", 475 | "print(R_t.to(ureg.lbf))" 476 | ] 477 | }, 478 | { 479 | "cell_type": "code", 480 | "execution_count": 56, 481 | "id": "a465b54c-19e9-407c-a2c4-f0d6638c98ce", 482 | "metadata": {}, 483 | "outputs": [ 484 | { 485 | "name": "stdout", 486 | "output_type": "stream", 487 | "text": [ 488 | "The maximum load the frame can withstand with tabs is: 75.61 force_pound\n" 489 | ] 490 | } 491 | ], 492 | "source": [ 493 | "# Find the maximum load capable of the tab details\n", 494 | "W_t = 22.16 * ureg.mm # From CAD\n", 495 | "P_max_tab = (4 * R_t * W_t) / (L_beam)\n", 496 | "\n", 497 | "print(f\"The maximum load the frame can withstand with tabs is: {P_max_tab.to(ureg.lbf):.2f}\")\n" 498 | ] 499 | }, 500 | { 501 | "cell_type": "code", 502 | "execution_count": 57, 503 | "id": "177f5fcc-f6d0-435b-90eb-9519864cc7f9", 504 | "metadata": {}, 505 | "outputs": [ 506 | { 507 | "name": "stdout", 508 | "output_type": "stream", 509 | "text": [ 510 | "8.56658710285011 dimensionless\n" 511 | ] 512 | } 513 | ], 514 | "source": [ 515 | "# What's the difference in loading capactiy (factor X) of the tab version versus the welded version?\n", 516 | "ratio_wt = P_max / P_max_tab\n", 517 | "print(ratio_wt)" 518 | ] 519 | } 520 | ], 521 | "metadata": { 522 | "kernelspec": { 523 | "display_name": "Python 3 (ipykernel)", 524 | "language": "python", 525 | "name": "python3" 526 | }, 527 | "language_info": { 528 | "codemirror_mode": { 529 | "name": "ipython", 530 | "version": 3 531 | }, 532 | "file_extension": ".py", 533 | "mimetype": "text/x-python", 534 | "name": "python", 535 | "nbconvert_exporter": "python", 536 | "pygments_lexer": "ipython3", 537 | "version": "3.13.5" 538 | } 539 | }, 540 | "nbformat": 4, 541 | "nbformat_minor": 5 542 | } 543 | -------------------------------------------------------------------------------- /analysis/.ipynb_checkpoints/tinyFrameProrotypingCalcs-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "7491e1c4", 6 | "metadata": {}, 7 | "source": [ 8 | "## tinyFrame Analysis - General Calculations\n", 9 | "\n", 10 | "## Purpose\n", 11 | "This document serve as the repository for all analysis for the tinyFrame project.\n", 12 | "\n", 13 | "## NOTE:\n", 14 | "This analysis is for Ductile materials only - it does not calculate principal stresses and is unsuitable for brittle materials.\n" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "id": "4beb8d1e", 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "import numpy, yaml, pint\n", 25 | "import numpy as np\n", 26 | "import matplotlib.pyplot as plt\n", 27 | "\n", 28 | "# Boilerplate\n", 29 | "## Initialize Pint Registry for Unit Manipulation\n", 30 | "## See documentation on Registries and Units in Pint here:\n", 31 | "## https://pint.readthedocs.io/en/stable/getting/tutorial.html\n", 32 | "from pint import UnitRegistry\n", 33 | "ureg = UnitRegistry(auto_reduce_dimensions=True)" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 4, 39 | "id": "562a9d0c-98ea-4b5c-9315-c290d3bfc36a", 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "preferred_units = [\n", 44 | " ureg.m, # distance L\n", 45 | " ureg.kilogram, # mass M\n", 46 | " ureg.s, # duration T\n", 47 | " ureg.c, # temperature Θ\n", 48 | " ureg.newton, # force L M T^-2\n", 49 | " ureg.W, # power L^2 M T^-3\n", 50 | "]" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "id": "98159745-7007-4742-8e81-85202102fe43", 56 | "metadata": {}, 57 | "source": [ 58 | "The equation that describes insert force for the locking tab is from the cantilever beam for a fixed support equation:\n", 59 | "\n", 60 | "$$\\delta = \\frac{Pl^3}{3EI}$$\n", 61 | "\n", 62 | "Equation for Second Moment of Area of a Rectangular beam:\n", 63 | "$$I = \\frac{bh^3}{12}$$\n", 64 | "\n", 65 | "Solving the equation above and replacing the second moment of area, I with the locking tab dimensions, we get:\n", 66 | "\n", 67 | "$$\\delta = \\frac{4 P L^3}{E b h^3}$$\n", 68 | "\n", 69 | "We normalize to the number of tabs in the system (four) and end up with:\n", 70 | "\n", 71 | "\n", 72 | "$$\\delta = \\frac{P L_{protoyped}^3}{E b h^3}$$\n", 73 | "\n", 74 | "## First, we declare inputs from the user - tubing size, material, ecetera:\n" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 33, 80 | "id": "b5b60ea7-965c-4176-a1eb-de43eef4af08", 81 | "metadata": {}, 82 | "outputs": [], 83 | "source": [ 84 | "# First, declare inputs\n", 85 | "# Tube Width, width\n", 86 | "tWidth = 50.8 * ureg.mm\n", 87 | "# Thickness (gauge) of tube\n", 88 | "h = 1.651 * ureg.mm\n", 89 | "\n", 90 | "# Material Properties\n", 91 | "# Yield Stress of the Material\n", 92 | "# Currently: Aluminum 6061-T6\n", 93 | "sigma_yield = 42 * ureg.ksi\n", 94 | "sigma_yield_welded = 27 * ureg.ksi\n", 95 | "tau_yield_welded = 0.577 * sigma_yield_welded\n", 96 | "\n", 97 | "# E in Pa - young's modulus\n", 98 | "E = 69e9 * ureg.newton / (ureg.meter * ureg.meter)\n" 99 | ] 100 | }, 101 | { 102 | "cell_type": "markdown", 103 | "id": "aa6cd1c3-ce42-4713-b3df-d244055abba5", 104 | "metadata": {}, 105 | "source": [ 106 | "## The following declarations are from prototyping" 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "execution_count": 34, 112 | "id": "aebb7ca9-ddcb-452a-9bfd-b5606d5dec0d", 113 | "metadata": {}, 114 | "outputs": [], 115 | "source": [ 116 | "# Values determined from Prototyping (Thanks Jonathan & Bryce!)\n", 117 | "P = 10 * ureg.lbf # From Prototyping\n", 118 | "\n", 119 | "# From testing done at FabWorks, the ratio of the tab is:\n", 120 | "# NOTE: If the geometry of the design changes, this needs to as well\n", 121 | "bRatio = 3.19/50.8\n", 122 | "\n", 123 | "# This is the distance required to travel to account for the depth\n", 124 | " # the depth of the tab\n", 125 | "del_tab = 6.35 * ureg.mm # From CAD\n", 126 | "\n", 127 | "# Calculate b (locking tab width required)\n", 128 | "b = bRatio * tWidth \n" 129 | ] 130 | }, 131 | { 132 | "cell_type": "markdown", 133 | "id": "e38570cf-2d91-4068-9cf6-700c3e497e70", 134 | "metadata": {}, 135 | "source": [ 136 | "We need to calculate the length of the flexure (locking tabs) required - solve the above equation for L:\n", 137 | "\n", 138 | "$$L = \\sqrt[3]{\\frac{3 \\delta \\, E \\, b \\, h^3}{12P}}$$\n", 139 | "\n", 140 | "P represents the global press force, but we assume there are always four tabs, so we divide P by 4 and are left with:\n", 141 | "\n", 142 | "$$L = \\sqrt[3]{\\frac{\\delta \\, E \\, b \\, h^3}{P}}$$" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": 35, 148 | "id": "979d931b-7857-4293-a5ce-5988fdc0d660", 149 | "metadata": {}, 150 | "outputs": [ 151 | { 152 | "name": "stdout", 153 | "output_type": "stream", 154 | "text": [ 155 | "Length of locking tab flexure is: 52.10 millimeter\n", 156 | "Locking tab flexure width is: 3.19 millimeter\n" 157 | ] 158 | } 159 | ], 160 | "source": [ 161 | "# Determine the length of the locking tabs\n", 162 | "L = ((del_tab * E * b * h**3) / (P)) ** (1/3)\n", 163 | "\n", 164 | "print(f\"Length of locking tab flexure is: {L:.2f}\")\n", 165 | "print(f\"Locking tab flexure width is: {b:.2f}\")\n" 166 | ] 167 | }, 168 | { 169 | "cell_type": "markdown", 170 | "id": "3c7ae92b-e7db-44ca-8b47-ca51f6a88fe7", 171 | "metadata": {}, 172 | "source": [ 173 | "Now, we check for bending stress:\n", 174 | "\n", 175 | "$$\\sigma_b = \\frac{M \\cdot c}{I}$$\n", 176 | "$$\\sigma_b = \\frac{M \\cdot c}{\\frac{bh**3}{12}}$$\n", 177 | "$$\\sigma_b = \\frac{12M \\cdot h/2}{bh^3}$$\n", 178 | "$$\\sigma_b = \\frac{6M \\cdot h}{bh^3}$$\n", 179 | "$$\\sigma_b = \\frac{6M}{bh^2}$$" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 37, 185 | "id": "2ae9a528-73dd-41c3-9a23-9551cc02a54c", 186 | "metadata": {}, 187 | "outputs": [ 188 | { 189 | "name": "stdout", 190 | "output_type": "stream", 191 | "text": [ 192 | "Bending stress seen by the locking tab: \n", 193 | "57.98245909656805 kip_per_square_inch\n", 194 | "Factor of safety against yield: \n", 195 | "0.7243569978646524 dimensionless\n" 196 | ] 197 | } 198 | ], 199 | "source": [ 200 | "# Calculations for geometry of Bending Region\n", 201 | "c = h/2\n", 202 | "I = b*h**3 / 12\n", 203 | "\n", 204 | "# Calculate requisite components\n", 205 | "# Moment for a cantilever - normalized by N (number of tabs, 4) is:\n", 206 | "M = P/4 * L\n", 207 | "\n", 208 | "# Calculate the bending stress\n", 209 | "sigma_bending = M * c / I\n", 210 | "\n", 211 | "# What's the factor of safety against the material yield stress?\n", 212 | "FOS_install = sigma_yield / sigma_bending\n", 213 | "\n", 214 | "print(\"Bending stress seen by the locking tab: \")\n", 215 | "print(sigma_bending.to(ureg.ksi))\n", 216 | "\n", 217 | "print(\"Factor of safety against yield: \")\n", 218 | "print(FOS_install)" 219 | ] 220 | }, 221 | { 222 | "cell_type": "markdown", 223 | "id": "c8cfceee-60e3-48a3-be0b-fcae04642542", 224 | "metadata": {}, 225 | "source": [ 226 | "# Checking for Combined Loading of Torsional and Bending Stresses\n", 227 | "## We first calculate the torsional stress in the beam caused by off axis loading\n", 228 | "Torsional stress in a beam is:\n", 229 | "$$ \\tau = \\frac{TR}{J}$$\n", 230 | "\n", 231 | "For a non-uniform (circular) about the Z axis shape, beams have a constant applied. We calculate the constant below.\n", 232 | "\n", 233 | "The second polar moment of area for a rectangular beam is:\n", 234 | "$$J \\approx \\beta a b^3$$\n", 235 | "\n", 236 | "Where:\n", 237 | "\n", 238 | "a is the length of the long side\n", 239 | "\n", 240 | "b is the length of the short side\n", 241 | "\n", 242 | "β is the torsional constant\n", 243 | "\n", 244 | "\n", 245 | "First, calculate ratio a/b and declare it as W to pass to a function to return torsional constant $\\beta$." 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": 47, 251 | "id": "2774071f-6b82-4986-ac02-eece24d3ea91", 252 | "metadata": {}, 253 | "outputs": [ 254 | { 255 | "name": "stdout", 256 | "output_type": "stream", 257 | "text": [ 258 | "0.46 kip_per_square_inch\n" 259 | ] 260 | } 261 | ], 262 | "source": [ 263 | "# Variables for Torsional Stress Calculations\n", 264 | "# Note: Normalizing P (load) to P_ to delinate load distributed over four locking tabs\n", 265 | "# e is the hypotenuse of the b/h triangle: \n", 266 | "e = 3.7 *(tWidth / 50.8) \n", 267 | "r = (b**2 / 4 + h**2 / 4)**(1/2)\n", 268 | "P_ = P / 4\n", 269 | "\n", 270 | "# Calculations\n", 271 | "T = P_ * e\n", 272 | "\n", 273 | "#Known data points\n", 274 | "W_values = np.array([1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 10.0])\n", 275 | "beta_values = np.array([0.141, 0.196, 0.229, 0.249, 0.263, 0.281, 0.291, 0.299, 0.312])\n", 276 | "\n", 277 | "# Equations for second polar moment of area have an underscore suffix\n", 278 | "a_ = b\n", 279 | "b_ = h\n", 280 | "W = a_/b_\n", 281 | "\n", 282 | "# Calculate Torsional Constant\n", 283 | "beta = float(np.interp(W, W_values, beta_values))\n", 284 | "\n", 285 | "# Calculate Second Polar Moment of Area\n", 286 | "J = beta * a_ * b**3\n", 287 | "\n", 288 | "# Torsional Stress is Tr/J\n", 289 | "tau_max = T * r / J\n", 290 | "print(f\"{tau_max.to(ureg.ksi):.2f}\")" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "id": "bb4b3063-1ffe-4058-9b2a-04fde7ba1be7", 296 | "metadata": {}, 297 | "source": [ 298 | "# Finally, we calculate the combined stress\n", 299 | "Pulled from the equivalent von mises stress theory, reference here: https://www.continuummechanics.org/vonmisesstress.html\n", 300 | "$$\\sigma_v = \\sqrt{\\sigma_{b}^2 + 3\\tau^2}$$\n", 301 | "\n", 302 | "$$L^3 = \\frac{\\delta E\\,bh^3}{\\sqrt{\\left( \\frac{6PL}{bh^2} \\right)^2 + 3\\tau^2}}$$\n" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 49, 308 | "id": "cfe29019-0f11-41ef-ad8a-dc1419da54c7", 309 | "metadata": {}, 310 | "outputs": [ 311 | { 312 | "name": "stdout", 313 | "output_type": "stream", 314 | "text": [ 315 | "399.8128844626018 megapascal\n", 316 | "57.9879562778453 kip_per_square_inch\n" 317 | ] 318 | } 319 | ], 320 | "source": [ 321 | "# Equivalent Stress\n", 322 | "sigma_v = (sigma_bending**2 + 3*tau_max**2)**(1/2)\n", 323 | "\n", 324 | "print(sigma_v.to(ureg.MPa))\n", 325 | "print(sigma_v.to(ureg.ksi))" 326 | ] 327 | }, 328 | { 329 | "cell_type": "markdown", 330 | "id": "6cd9e460-00d0-49b9-a31c-cad308d83238", 331 | "metadata": {}, 332 | "source": [ 333 | "# Sizing Chart Calculations\n", 334 | "\n", 335 | "1. Find L\n", 336 | "2. Find the bending stress\n", 337 | "3. Combine with Torsional stress\n", 338 | "4. Apply factor of safety\n", 339 | "5. If\n", 340 | " sigma > sigma_yield -> reduce the length of the flexure\n", 341 | " else: return length\n", 342 | "\n", 343 | "## First, we calculate the requisite b and L values for the tab locking flexure" 344 | ] 345 | }, 346 | { 347 | "cell_type": "markdown", 348 | "id": "ac8e7ea9-4eac-41dd-85a9-76ec4bdf4ec0", 349 | "metadata": {}, 350 | "source": [ 351 | "## We calculate the required length and plot" 352 | ] 353 | }, 354 | { 355 | "cell_type": "code", 356 | "execution_count": 102, 357 | "id": "d1716490-460c-4954-babf-da9775b6ccaf", 358 | "metadata": {}, 359 | "outputs": [ 360 | { 361 | "data": { 362 | "image/png": "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", 363 | "text/plain": [ 364 | "
" 365 | ] 366 | }, 367 | "metadata": {}, 368 | "output_type": "display_data" 369 | } 370 | ], 371 | "source": [ 372 | "# Arguments: y -> yield stress\n", 373 | "def findLength(y, E, b, h, P, del_tab):\n", 374 | " # Determine the length of the locking tabs\n", 375 | " L = ((del_tab * E * b * h**3) / (P)) ** (1/3)\n", 376 | "\n", 377 | " # Check against Yield Stress with appropriate safety factor (1.25)\n", 378 | " stress_current = \n", 379 | " return L\n", 380 | "# Calcualte thickness values and store them in an array\n", 381 | "tValues = np.linspace(h.to('mm').magnitude - Z, h.to('mm').magnitude + Z, 10)\n", 382 | "\n", 383 | "def makeData(tValues):\n", 384 | " L_values = [findLength(sigma_yield, E, b, T, P, \n", 385 | " del_tab) for T in T_values]\n", 386 | " return {'T': T_values, 'L': L_values}\n", 387 | "\n", 388 | "def plot_1(X):\n", 389 | " L = X['L']\n", 390 | " T = X['T']\n", 391 | " plt.plot(T, L)\n", 392 | " plt.xlabel('Thickness')\n", 393 | " plt.ylabel('Flexure Length Required')\n", 394 | " plt.title('Length vs Thickness')\n", 395 | " plt.grid(True)\n", 396 | " plt.show()\n", 397 | "\n", 398 | "data = makeData(tValues)\n", 399 | "plot_1(data)" 400 | ] 401 | }, 402 | { 403 | "cell_type": "markdown", 404 | "id": "51088f03-eb8d-4382-8fb1-2e01928d59d4", 405 | "metadata": {}, 406 | "source": [ 407 | "# Weld Calculations\n", 408 | "\n", 409 | "The shear stress in a weld is: $$\\tau \\approx \\frac{F}{A} = \\frac{F}{0.707 \\cdot h \\cdot L_{weld}}$$\n", 410 | "\n", 411 | "The welds will counter-act the moment generated by loading the frame at the center of the member. These resultant forces are derived by drawing a free body diagram about the center of the weld pattern and derived from the equation below:\n", 412 | "$$M = \\frac{PL}{4} = \\left( \\frac{w}{2} \\cdot R \\right) \\cdot 2 \\quad \\Rightarrow \\quad \\frac{PL}{4} = R \\cdot \\omega$$\n", 413 | "\n", 414 | "Solving for P and denominating the reaction load as being the value for both welds but acting in opposing directions:\n", 415 | "$$ R_{1,2} = \\frac{PL}{4w}$$\n", 416 | "\n", 417 | "To find the maximum load the system is capable of, we substitute R into F for the fillet weld equations, and solve for P, simplifying to:\n", 418 | "$$P = \\frac{2 \\cdot \\left( \\tau_{yield} \\cdot 0.707 \\cdot h \\cdot L_{weld} \\right) \\cdot N \\cdot w}{L}$$\n", 419 | "\n", 420 | "Where: \n", 421 | "N is the number of welds \n", 422 | "h is the size of the welds \n", 423 | "L is the length of the weld \n", 424 | "w is the width of the tube \n" 425 | ] 426 | }, 427 | { 428 | "cell_type": "code", 429 | "execution_count": 52, 430 | "id": "76152a34-75e6-4825-bee9-7e2961ffc1d9", 431 | "metadata": {}, 432 | "outputs": [ 433 | { 434 | "name": "stdout", 435 | "output_type": "stream", 436 | "text": [ 437 | "The maximum load the frame can withstand with welds is: 647.72 force_pound\n" 438 | ] 439 | } 440 | ], 441 | "source": [ 442 | "# The width of the fillet weld is in this case is roughly 3/16\"\n", 443 | "L_beam = 898.4 * ureg.mm\n", 444 | "h_weld = 3/16 * ureg.inch\n", 445 | "L_weld = tWidth # The length of the fillet weld is the length of the tube width \n", 446 | "w = tWidth # Re-declaring the variable tWidth (width of the tube) as w for legibility with the equations\n", 447 | "nWelds = 2\n", 448 | "\n", 449 | "# Solve the equation:\n", 450 | "# Note: We use tau_yield_welded because of the HAZ knockdown effect. Source:\n", 451 | "# https://esab.com/us/nam_en/esab-university/articles/the-haz-in-aluminum-welds/\n", 452 | "P_max = (4 * tau_yield_welded * 0.707 * h * L_weld * nWelds * w) / L_beam\n", 453 | "\n", 454 | "print(f\"The maximum load the frame can withstand with welds is: {P_max.to(ureg.lbf):.2f}\")" 455 | ] 456 | }, 457 | { 458 | "cell_type": "code", 459 | "execution_count": 55, 460 | "id": "2cbc821a-692c-46ac-8c36-13f9bb1a51cd", 461 | "metadata": {}, 462 | "outputs": [ 463 | { 464 | "name": "stdout", 465 | "output_type": "stream", 466 | "text": [ 467 | "766.3346456692916 force_pound\n" 468 | ] 469 | } 470 | ], 471 | "source": [ 472 | "# Strength of a singular tab (not yet system normalized)\n", 473 | "R_t = sigma_yield * h * 7.13 * ureg.mm\n", 474 | "\n", 475 | "print(R_t.to(ureg.lbf))" 476 | ] 477 | }, 478 | { 479 | "cell_type": "code", 480 | "execution_count": 56, 481 | "id": "a465b54c-19e9-407c-a2c4-f0d6638c98ce", 482 | "metadata": {}, 483 | "outputs": [ 484 | { 485 | "name": "stdout", 486 | "output_type": "stream", 487 | "text": [ 488 | "The maximum load the frame can withstand with tabs is: 75.61 force_pound\n" 489 | ] 490 | } 491 | ], 492 | "source": [ 493 | "# Find the maximum load capable of the tab details\n", 494 | "W_t = 22.16 * ureg.mm # From CAD\n", 495 | "P_max_tab = (4 * R_t * W_t) / (L_beam)\n", 496 | "\n", 497 | "print(f\"The maximum load the frame can withstand with tabs is: {P_max_tab.to(ureg.lbf):.2f}\")\n" 498 | ] 499 | }, 500 | { 501 | "cell_type": "code", 502 | "execution_count": 57, 503 | "id": "177f5fcc-f6d0-435b-90eb-9519864cc7f9", 504 | "metadata": {}, 505 | "outputs": [ 506 | { 507 | "name": "stdout", 508 | "output_type": "stream", 509 | "text": [ 510 | "8.56658710285011 dimensionless\n" 511 | ] 512 | } 513 | ], 514 | "source": [ 515 | "# What's the difference in loading capactiy (factor X) of the tab version versus the welded version?\n", 516 | "ratio_wt = P_max / P_max_tab\n", 517 | "print(ratio_wt)" 518 | ] 519 | } 520 | ], 521 | "metadata": { 522 | "kernelspec": { 523 | "display_name": "Python 3 (ipykernel)", 524 | "language": "python", 525 | "name": "python3" 526 | }, 527 | "language_info": { 528 | "codemirror_mode": { 529 | "name": "ipython", 530 | "version": 3 531 | }, 532 | "file_extension": ".py", 533 | "mimetype": "text/x-python", 534 | "name": "python", 535 | "nbconvert_exporter": "python", 536 | "pygments_lexer": "ipython3", 537 | "version": "3.13.5" 538 | } 539 | }, 540 | "nbformat": 4, 541 | "nbformat_minor": 5 542 | } 543 | -------------------------------------------------------------------------------- /analysis/tinyFrame.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "7491e1c4", 6 | "metadata": {}, 7 | "source": [ 8 | "## tinyFrame Analysis - General Calculations\n", 9 | "\n", 10 | "## Purpose\n", 11 | "This document serve as the repository for all analysis for the tinyFrame project.\n", 12 | "\n", 13 | "## NOTE:\n", 14 | "This analysis is for Ductile materials only - it does not calculate principal stresses and is unsuitable for brittle materials.\n", 15 | "\n", 16 | "## TODO:\n", 17 | "- ~~Calculate required deflection~~\n", 18 | "- ~~Build calculations around known press-force (7 lbf)~~\n", 19 | "- ~~stress checks for given thickness and the declarations above~~\n", 20 | "- ~~Calculate combined stress case due to additional torsion created by double-back feature (snake)~~\n", 21 | "- ~~Strength Checks~~\n", 22 | " - ~~Calculate Strength of Joint when Welded~~\n", 23 | " - ~~Calculate Strength of Joint as Snap Fit~~\n", 24 | "- Create a plot that shows:\n", 25 | " - Load\n", 26 | " - Length\n", 27 | " - Gauge" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 1, 33 | "id": "4beb8d1e", 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "import numpy, yaml, pint\n", 38 | "import numpy as np\n", 39 | "import matplotlib.pyplot as plt\n", 40 | "\n", 41 | "# Boilerplate\n", 42 | "## Initialize Pint Registry for Unit Manipulation\n", 43 | "## See documentation on Registries and Units in Pint here:\n", 44 | "## https://pint.readthedocs.io/en/stable/getting/tutorial.html\n", 45 | "from pint import UnitRegistry\n", 46 | "ureg = UnitRegistry(auto_reduce_dimensions=True)" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 2, 52 | "id": "562a9d0c-98ea-4b5c-9315-c290d3bfc36a", 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "preferred_units = [\n", 57 | " ureg.m, # distance L\n", 58 | " ureg.kilogram, # mass M\n", 59 | " ureg.s, # duration T\n", 60 | " ureg.c, # temperature Θ\n", 61 | " ureg.newton, # force L M T^-2\n", 62 | " ureg.W, # power L^2 M T^-3\n", 63 | "]" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "id": "98159745-7007-4742-8e81-85202102fe43", 69 | "metadata": {}, 70 | "source": [ 71 | "The equation that describes insert force for the locking tab is from the cantilever beam for a fixed support equation:\n", 72 | "\n", 73 | "$$\\delta = \\frac{Pl^3}{3EI}$$\n", 74 | "\n", 75 | "Equation for Second Moment of Area of a Rectangular beam:\n", 76 | "$$I = \\frac{bh^3}{12}$$\n", 77 | "\n", 78 | "Solving the equation above and replacing the second moment of area, I with the locking tab dimensions, we get:\n", 79 | "\n", 80 | "$$\\delta = \\frac{4 P L^3}{E b h^3}$$\n", 81 | "\n", 82 | "We normalize to the number of tabs in the system (four) and end up with:\n", 83 | "\n", 84 | "\n", 85 | "$$\\delta = \\frac{P L_{protoyped}^3}{E b h^3}$$\n", 86 | "\n", 87 | "## First, we declare inputs from the user - tubing size, material, ecetera:\n" 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": 3, 93 | "id": "b5b60ea7-965c-4176-a1eb-de43eef4af08", 94 | "metadata": {}, 95 | "outputs": [], 96 | "source": [ 97 | "# First, declare inputs\n", 98 | "# Tube Width, width\n", 99 | "tWidth = 50.8 * ureg.mm\n", 100 | "# Thickness (gauge) of tube\n", 101 | "h = 1.651 * ureg.mm\n", 102 | "\n", 103 | "# Material Properties\n", 104 | "# Yield Stress of the Material\n", 105 | "# Currently: Aluminum 6061-T6\n", 106 | "sigma_yield_aluminum = 28 * ureg.ksi\n", 107 | "sigma_yield_steel = 41 * ureg.ksi\n", 108 | "\n", 109 | "# E in Pa - young's modulus\n", 110 | "E_aluminum = 69e9 * ureg.newton / (ureg.meter * ureg.meter)\n", 111 | "E_steel = 3*69e9 * ureg.newton / (ureg.meter * ureg.meter)\n" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "id": "aa6cd1c3-ce42-4713-b3df-d244055abba5", 117 | "metadata": {}, 118 | "source": [ 119 | "## The following declarations are from prototyping" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 4, 125 | "id": "aebb7ca9-ddcb-452a-9bfd-b5606d5dec0d", 126 | "metadata": {}, 127 | "outputs": [], 128 | "source": [ 129 | "# Values determined from Prototyping (Thanks Jonathan & Bryce!)\n", 130 | "P = 10 * ureg.lbf # From Prototyping\n", 131 | "\n", 132 | "# From testing done at FabWorks, the ratio of the tab is:\n", 133 | "# NOTE: If the geometry of the design changes, this needs to as well\n", 134 | "bRatio = 3.19/50.8\n", 135 | "\n", 136 | "# This is the distance required to travel to account for the depth\n", 137 | " # the depth of the tab\n", 138 | "del_tab = 6.35 * ureg.mm # From CAD\n", 139 | "\n", 140 | "# Calculate b (locking tab width required)\n", 141 | "b = bRatio * tWidth \n" 142 | ] 143 | }, 144 | { 145 | "cell_type": "markdown", 146 | "id": "e38570cf-2d91-4068-9cf6-700c3e497e70", 147 | "metadata": {}, 148 | "source": [ 149 | "We need to calculate the length of the flexure (locking tabs) required - solve the above equation for L:\n", 150 | "\n", 151 | "$$L = \\sqrt[3]{\\frac{3 \\delta \\, E \\, b \\, h^3}{12P}}$$\n", 152 | "\n", 153 | "P represents the global press force, but we assume there are always four tabs, so we divide P by 4 and are left with:\n", 154 | "\n", 155 | "$$L = \\sqrt[3]{\\frac{\\delta \\, E \\, b \\, h^3}{P}}$$" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 5, 161 | "id": "2ae9a528-73dd-41c3-9a23-9551cc02a54c", 162 | "metadata": {}, 163 | "outputs": [], 164 | "source": [ 165 | "def calcBending(h, L):\n", 166 | " # Calculations for geometry of Bending Region\n", 167 | " h = h * ureg.mm\n", 168 | " L = L * ureg.mm\n", 169 | " c = h/2 \n", 170 | " I = b*h**3 / 12\n", 171 | " \n", 172 | " # Calculate requisite components\n", 173 | " # Moment for a cantilever - normalized by N (number of tabs, 4) is:\n", 174 | " # Applying a 25% overhead (1.25 FOS) by manipulating the load here\n", 175 | " M = 1.25*P/4 * L\n", 176 | " \n", 177 | " # Calculate the bending stress\n", 178 | " sigma_bending = M * c / I\n", 179 | "\n", 180 | " return sigma_bending\n" 181 | ] 182 | }, 183 | { 184 | "cell_type": "markdown", 185 | "id": "c8cfceee-60e3-48a3-be0b-fcae04642542", 186 | "metadata": {}, 187 | "source": [ 188 | "# Checking for Combined Loading of Torsional and Bending Stresses\n", 189 | "## We first calculate the torsional stress in the beam caused by off axis loading\n", 190 | "Torsional stress in a beam is:\n", 191 | "$$ \\tau = \\frac{TR}{J}$$\n", 192 | "\n", 193 | "For a non-uniform (circular) about the Z axis shape, beams have a constant applied. We calculate the constant below.\n", 194 | "\n", 195 | "The second polar moment of area for a rectangular beam is:\n", 196 | "$$J \\approx \\beta a b^3$$\n", 197 | "\n", 198 | "Where:\n", 199 | "\n", 200 | "a is the length of the long side\n", 201 | "\n", 202 | "b is the length of the short side\n", 203 | "\n", 204 | "β is the torsional constant\n", 205 | "\n", 206 | "\n", 207 | "First, calculate ratio a/b and declare it as W to pass to a function to return torsional constant $\\beta$." 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": 6, 213 | "id": "2774071f-6b82-4986-ac02-eece24d3ea91", 214 | "metadata": {}, 215 | "outputs": [], 216 | "source": [ 217 | "def calcTorsion(h):\n", 218 | " # Variables for Torsional Stress Calculations\n", 219 | " # Note: Normalizing P (load) to P_ to delinate load distributed over four locking tabs\n", 220 | " # e is the hypotenuse of the b/h triangle: \n", 221 | " h = h * ureg.mm\n", 222 | " e = 3.7 *(tWidth / 50.8) \n", 223 | " r = (b**2 / 4 + h**2 / 4)**(1/2)\n", 224 | " P_ = P / 4\n", 225 | " \n", 226 | " # Calculations\n", 227 | " T = P_ * e\n", 228 | " \n", 229 | " #Known data points\n", 230 | " W_values = np.array([1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 10.0])\n", 231 | " beta_values = np.array([0.141, 0.196, 0.229, 0.249, 0.263, 0.281, 0.291, 0.299, 0.312])\n", 232 | " \n", 233 | " # Equations for second polar moment of area have an underscore suffix\n", 234 | " a_ = b\n", 235 | " b_ = h\n", 236 | " W = a_/b_\n", 237 | " \n", 238 | " # Calculate Torsional Constant\n", 239 | " beta = float(np.interp(W, W_values, beta_values))\n", 240 | " \n", 241 | " # Calculate Second Polar Moment of Area\n", 242 | " J = beta * a_ * b**3\n", 243 | " \n", 244 | " # Torsional Stress is Tr/J\n", 245 | " tau_max = T * r / J\n", 246 | "\n", 247 | " return(tau_max)" 248 | ] 249 | }, 250 | { 251 | "cell_type": "markdown", 252 | "id": "bb4b3063-1ffe-4058-9b2a-04fde7ba1be7", 253 | "metadata": {}, 254 | "source": [ 255 | "# Finally, we calculate the combined stress\n", 256 | "Pulled from the equivalent von mises stress theory, reference here: https://www.continuummechanics.org/vonmisesstress.html\n", 257 | "$$\\sigma_v = \\sqrt{\\sigma_{b}^2 + 3\\tau^2}$$\n", 258 | "\n" 259 | ] 260 | }, 261 | { 262 | "cell_type": "code", 263 | "execution_count": 7, 264 | "id": "cfe29019-0f11-41ef-ad8a-dc1419da54c7", 265 | "metadata": {}, 266 | "outputs": [], 267 | "source": [ 268 | "def calcVM(sigma, tau):\n", 269 | " # Equivalent Stress\n", 270 | " sigma_v = (sigma**2 + 3*tau**2)**(1/2)\n", 271 | " \n", 272 | " return sigma_v" 273 | ] 274 | }, 275 | { 276 | "cell_type": "markdown", 277 | "id": "6cd9e460-00d0-49b9-a31c-cad308d83238", 278 | "metadata": {}, 279 | "source": [ 280 | "# Sizing Chart Calculations\n", 281 | "\n", 282 | "1. Find L\n", 283 | "2. Find the bending stress\n", 284 | "3. Combine with Torsional stress\n", 285 | "4. Apply factor of safety\n", 286 | "5. If\n", 287 | " sigma > sigma_yield -> reduce the length of the flexure\n", 288 | " else: return length\n", 289 | "\n", 290 | "## First, we calculate the requisite b and L values for the tab locking flexure" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "id": "ac8e7ea9-4eac-41dd-85a9-76ec4bdf4ec0", 296 | "metadata": {}, 297 | "source": [ 298 | "## We calculate the required length and plot" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 8, 304 | "id": "d1716490-460c-4954-babf-da9775b6ccaf", 305 | "metadata": {}, 306 | "outputs": [ 307 | { 308 | "data": { 309 | "image/png": "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", 310 | "text/plain": [ 311 | "
" 312 | ] 313 | }, 314 | "metadata": {}, 315 | "output_type": "display_data" 316 | } 317 | ], 318 | "source": [ 319 | "# Arguments: y -> yield stress\n", 320 | "\n", 321 | "def findLength(y, E, b, h, P, del_tab):\n", 322 | " # Determine the length of the locking tabs\n", 323 | " L = ((del_tab * E * b * h**3) / (P)) ** (1/3)\n", 324 | " \n", 325 | " # Check against Yield Stress with appropriate safety factor\n", 326 | " stress_current = calcVM(calcBending(h, L),\n", 327 | " calcTorsion(h))\n", 328 | " # Ensure current stress is less than the yield stress. If it is, reduce the stress by\n", 329 | " # reducing the length of the flexure until it no longer is yielding, then continue\n", 330 | "\n", 331 | " while stress_current.to('ksi').magnitude >= y.to('ksi').magnitude:\n", 332 | " L -= .025\n", 333 | " stress_current = calcVM(calcBending(h, L), calcTorsion(h))\n", 334 | " \n", 335 | " return L\n", 336 | " \n", 337 | "# Calculate thickness values and store them in an array\n", 338 | "# These minimum and maximum values are from the material selection page\n", 339 | "tValues = np.linspace(0.762, 12.7, 10)\n", 340 | "\n", 341 | "def makeData(tValues, E, y):\n", 342 | " L_values = [findLength(y, E, b, T, P, \n", 343 | " del_tab) for T in tValues]\n", 344 | " return {'T': tValues, 'L': L_values}\n", 345 | "\n", 346 | "def plot(X1, X2):\n", 347 | " L1 = X1['L']\n", 348 | " T1 = X1['T']\n", 349 | " L2 = X2['L']\n", 350 | " T2 = X2['T']\n", 351 | " \n", 352 | " plt.plot(T1, L1, label='Aluminum, Stress Limited')\n", 353 | " plt.plot(T2, L2, color='green', label='Steel, Stress Limited')\n", 354 | " \n", 355 | " plt.xlabel('Thickness (mm)')\n", 356 | " plt.ylabel('Flexure Length Required (mm)')\n", 357 | " plt.title('Flexure Length as a Function of Material and Thickness')\n", 358 | " plt.grid(True)\n", 359 | " plt.legend()\n", 360 | " plt.show()\n", 361 | "\n", 362 | "\n", 363 | "# Use tValues is the range of thicknesses, E_x)\n", 364 | "data1 = makeData(tValues, E_aluminum, sigma_yield_aluminum)\n", 365 | "data2 = makeData(tValues, E_steel, sigma_yield_steel)\n", 366 | "plot(data1, data2)" 367 | ] 368 | } 369 | ], 370 | "metadata": { 371 | "kernelspec": { 372 | "display_name": "Python 3 (ipykernel)", 373 | "language": "python", 374 | "name": "python3" 375 | }, 376 | "language_info": { 377 | "codemirror_mode": { 378 | "name": "ipython", 379 | "version": 3 380 | }, 381 | "file_extension": ".py", 382 | "mimetype": "text/x-python", 383 | "name": "python", 384 | "nbconvert_exporter": "python", 385 | "pygments_lexer": "ipython3", 386 | "version": "3.13.5" 387 | } 388 | }, 389 | "nbformat": 4, 390 | "nbformat_minor": 5 391 | } 392 | --------------------------------------------------------------------------------