Pythonで圧縮コイルバネの計算をしてみる
2020/03/06 categories:Python| tags:Python|Mechanical design|
圧縮コイルバネを設計する機会があり、せっかくなので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