Pythonで圧縮コイルバネの計算をしてみる

圧縮コイルバネを設計する機会があり、せっかくなのでPythonで計算するプログラムを作成してみました。

Springクラス

Springというクラスを作成して、そのクラス内でばねのパラメータ保持やばねに関する計算を行うようにしました。Springクラスのインスタンス時に計算に必要な値を渡します。渡す値の単位は下記のとおりです。

寸法 : mm
荷重 : N
応力 : N/mm^2
動作範囲 : %
横弾性係数 : N/mm^2



計算結果の判定

Springのインスタンスを作成するとばね関連の計算を実行します。計算結果をSpringクラスのプロパティから取得して、圧縮コイルバネとして適切な値であるかを下記の条件で判断しました。

・3≦有効巻き数
・20≦使用時動作範囲≦80
・4≦ばね指数≦22
・線径≦ピッチ
・ピッチ≦コイル平均径*0.5
・0.8≦縦横比≦4

計算結果は計算サイトなどを使って確認しました。

わざわざクラスを作る必要はないかもしれませんが、後々計算ツールなどを作るときにクラスがあれば便利かなと思ってクラスとして作成しました。幅広い条件で計算して、最もいい条件を探すといった用途に使えるかなと思います。



ソースコード

import math

class Spring(object):
    def __init__(self,
        wire_diameter = 0.0,
        transverse_elasticity_modulus = 0.0,
        inner_diameter = 0.0,
        effective_turns = 0.0,
        spring_seat_turns = 0.0,
        free_length = 0.0,
        minimum_load_length = 0.0,
        use_length = 0.0,
        no_grinding = 1.0
    ):
        self.wire_diameter = wire_diameter # 線径
        self.transverse_elasticity_modulus = transverse_elasticity_modulus # 横弾性係数
        self.inner_diameter = inner_diameter # 内径
        self.effective_turns = effective_turns # 有効巻数
        self.spring_seat_turns = spring_seat_turns # 座の巻き数
        self.free_length = free_length # 自由長さ
        self.minimum_load_length = minimum_load_length # 最小荷重時長さ
        self.use_length = use_length # 使用時長さ
        self.no_grinding = no_grinding # 研削

        self.calculate_all()

    def calculate_all(self):
        # 計算値
        self.outer_diameter = self.inner_diameter + self.wire_diameter*2.0 # 外形
        self.total_turns = self.effective_turns + self.spring_seat_turns*2.0 # 総巻数
        self.average_diameter = self.inner_diameter + self.wire_diameter # コイル平均径
        self.aspect_rasio = self.free_length / self.average_diameter # 縦横比
        self.spring_index = self.average_diameter / self.wire_diameter # ばね指数
        self.spring_constant = self.transverse_elasticity_modulus * (self.wire_diameter**4.0) / (8.0 * self.effective_turns * (self.average_diameter**3.0)) # ばね定数
        self.pitch = (self.free_length - (self.total_turns - self.effective_turns + self.no_grinding) * self.wire_diameter) / self.effective_turns # ピッチ
        self.stress_correction_factor = (4.0 * self.spring_index - 1.0) / (4.0 * self.spring_index - 4.0) + 0.615 / self.spring_index # 応力修正係数
        
        self.adhesion_length = (self.total_turns + 1.0) * self.wire_diameter # 密着長さ
        self.adhesion_load = self.load(self.adhesion_length) # 密着荷重[N]
        self.adhesion_load_range = self.load_range(self.adhesion_length) # 動作範囲4
        self.adhesion_torsion_stress = self.torsion_stress(self.adhesion_load) # ねじり応力
        self.adhesion_torsion_correction_stress = self.torsion_correction_stress(self.adhesion_torsion_stress) # 密着ねじり修正応力

        self.minimum_load = self.load(self.minimum_load_length) # 最小荷重[N]
        self.minimum_load_range = self.load_range(self.minimum_load_length) # 動作範囲1
        self.minimum_torsion_stress = self.torsion_stress(self.minimum_load) # ねじり応力
        self.minimum_torsion_correction_stress = self.torsion_correction_stress(self.minimum_torsion_stress) # 最小ねじり修正応力

        self.use_load = self.load(self.use_length) # 使用時荷重[N]
        self.use_load_range = self.load_range(self.use_length) # 動作範囲2
        self.use_torsion_stress = self.torsion_stress(self.use_load) # ねじり応力
        self.use_torsion_correction_stress = self.torsion_correction_stress(self.use_torsion_stress) # 使用時ねじり修正応力

        self.maximum_load_length = 0.2*self.free_length + 0.8*self.adhesion_length # 最大荷重時長さ=動作範囲80%の時
        self.maximum_load = self.load(self.maximum_load_length) # 最大荷重[N]
        self.maximum_load_range = self.load_range(self.maximum_load_length) # 動作範囲3
        self.maximum_torsion_stress = self.torsion_stress(self.maximum_load) # ねじり応力
        self.maximum_torsion_correction_stress = self.torsion_correction_stress(self.maximum_torsion_stress) # 最大ねじり修正応力

    def load(self, length):
        return self.spring_constant * (self.free_length - length)

    def load_range(self, length):
        return (self.free_length - length) / (self.free_length - self.adhesion_length) * 100.0

    def torsion_stress(self, load):
        return 8.0 * self.average_diameter * load / (math.pi * (self.wire_diameter**3.0))

    def torsion_correction_stress(self, to):
        return self.stress_correction_factor * to

if __name__ == '__main__':
    spring = Spring(
        wire_diameter = 0.2, # 線径
        transverse_elasticity_modulus = 78500.0, # 横弾性係数
        inner_diameter = 5.0, # 内径
        effective_turns = 3.0, # 有効巻数
        spring_seat_turns = 1.0, # 座の巻き数
        free_length = 10.0, # 自由長さ
        minimum_load_length = 8.0, # 最小荷重時長さ
        use_length = 4.0, # 使用時長さ
        no_grinding = 1.0 # 研削
    )

    for key, value in spring.__dict__.items():
        print(key, ':', round(value, 4))
    
    if spring.effective_turns < 3.0:
        print('warning!! effective turns is too small')
        
    if spring.use_load_range < 20.0:
        print('warning!! use load range is too small')
    if spring.use_load_range > 80.0:
        print('warning!! use load range is too big')
        
    if spring.spring_index < 4.0:
        print('warning!! spring index is too small')
    if spring.spring_index > 22.0:
        print('warning!! spring index is too big')
        
    if spring.pitch > spring.average_diameter*0.5:
        print('warning!! pitch is too big')
        
    if spring.pitch < spring.wire_diameter:
        print('warning!! pitch is too small')

    if spring.aspect_rasio < 0.8:
        print('warning!! aspect rasio is too small')
    if spring.aspect_rasio > 4.0:
        print('warning!! aspect rasio is too big')

実行結果

wire_diameter : 0.2
transverse_elasticity_modulus : 78500.0
inner_diameter : 5.0
effective_turns : 3.0
spring_seat_turns : 1.0
free_length : 10.0
minimum_load_length : 8.0
use_length : 4.0
no_grinding : 1.0
outer_diameter : 5.4
total_turns : 5.0
average_diameter : 5.2
aspect_rasio : 1.9231
spring_index : 26.0
spring_constant : 0.0372
pitch : 3.1333
stress_correction_factor : 1.0537
adhesion_length : 1.2
adhesion_load : 0.3275
adhesion_load_range : 100.0
adhesion_torsion_stress : 542.1313
adhesion_torsion_correction_stress : 571.2188
minimum_load : 0.0744
minimum_load_range : 22.7273
minimum_torsion_stress : 123.2117
minimum_torsion_correction_stress : 129.8224
use_load : 0.2233
use_load_range : 68.1818
use_torsion_stress : 369.635
use_torsion_correction_stress : 389.4673
maximum_load_length : 2.96
maximum_load : 0.262
maximum_load_range : 80.0
maximum_torsion_stress : 433.7051
maximum_torsion_correction_stress : 456.975
warning!! spring index is too big
warning!! pitch is too big

コメント

タイトルとURLをコピーしました