BETA

軸のねじり剛性設計を自動化した

投稿日:2020-05-04
最終更新:2020-05-04

軸の剛性設計

機械の軸はJIS B 0901に準じた直径にする場合がほとんどである。
そのため、軸の選定の基本的な考え方は、「荷重に耐えられる最小のJIS B 0901内の軸径」を選ぶことである。(部品の共通化などを加味すると話は別)

前回は強度設計(壊れないかどうか)を行ったので、今回は剛性設計(変形が許容範囲内に収まるか)を行う。

ねじり剛性の評価

トルク$T$を加えたときのねじれ角$\psi$は次の式で表される。
$$\frac{ \psi}{l} = \frac{T}{GI_{\rm p}}$$
ここで、$l$は軸の長さ、$G$は横弾性係数、$I_{\rm p}$は断面二次極モーメントである。
上の式の${ \psi}/{l}$を比ねじれ角と呼び、剛性の基準にする。(通常$\frac{1}{3}[\rm °/m]$から$\frac{1}{4}[\rm °/m]$)に設定することが多い。

プログラム

import numpy as np  

class CrossSection(object):  
    軸径=0  
    def __init__(self, 軸径):  
        self.軸径 = 軸径  

    def set軸径(self, 軸径):  
        self.軸径 = 軸径  

    def 断面係数(self):  
        d = self.軸径  
        return np.pi/32*(d**3)  

    def 極断面係数(self):    
        d = self.軸径    
        return np.pi/16*(d**3)    

    def 断面二次モーメント(self):  
        d = self.軸径  
        return np.pi/64*(d**4)  

    def 断面二次極モーメント(self):  
        d = self.軸径  
        return np.pi/32*(d**4)  



class Load(object):  
    トルク=0  
    曲げモーメント=0  
    def __inti__(self, トルク=0, 曲げモーメント=0):  
        if(トルク!= 0 and 曲げモーメント!= 0):  
            self.トルク = self.相当ねじりモーメント(トルク, 曲げモーメント)  
            self.曲げモーメント = self.相当曲げモーメント(トルク, 曲げモーメント)  
        elif(トルク != 0):  
            self.トルク = self.相当ねじりモーメント(トルク, 曲げモーメント)  
            self.曲げモーメント = 0  
        else:  
            self.トルク = 0  
            self.曲げモーメント = self.相当曲げモーメント(トルク, 曲げモーメント)  

    def setLoad(self, トルク, 曲げモーメント):  
        if(トルク!= 0 and 曲げモーメント!= 0):  
            self.トルク = self.相当ねじりモーメント(トルク, 曲げモーメント)  
            self.曲げモーメント = self.相当曲げモーメント(トルク, 曲げモーメント)  
        elif(トルク != 0):  
            self.トルク = self.相当ねじりモーメント(トルク, 曲げモーメント)  
            self.曲げモーメント = 0  
        else:  
            self.トルク = 0  
            self.曲げモーメント = self.相当曲げモーメント(トルク, 曲げモーメント)  

    def 相当ねじりモーメント(self, トルク=0, 曲げモーメント=0):  
        return (トルク**2+曲げモーメント**2)**0.5  

    def 相当曲げモーメント(self, トルク=0, 曲げモーメント=0):  
        return( 曲げモーメント+ self.相当ねじりモーメント(トルク, 曲げモーメント))/2  


class ShaftStudy(CrossSection, Load):  
    許容引張応力=None  
    許容剪断応力=None  
    許容比ねじれ角=None  
    横弾性係数=None  

    JISDiameter = np.array( [4,5,6,7,8,9,10,12,15,17,20,22,25,28,30,32,35,40,45,50,55,60,65,70,75,80,85,90,95])/1000    


    def __init__(self, 許容引張応力,  許容剪断応力, 許容比ねじれ角):  
        self.許容引張応力 = 許容引張応力  
        if(許容剪断応力 != None):  
            self.許容剪断応力 = 許容剪断応力  
        else:  
            self.許容剪断応力 = 許容引張応力/2  
        self.許容比ねじれ角 = 許容比ねじれ角  

    def setGoal(self, 許容引張応力,  許容剪断応力, 許容比ねじれ角):  
        self.__init__(許容引張応力, 許容剪断応力, 許容比ねじれ角)  

    def achived(self):  
        if(self.許容剪断応力 >= self.最大せん断応力() and  self.許容引張応力 >= self.最大曲げ応力()):  
            strength = True  
        else:  
            strength = False  

        if(self.許容比ねじれ角 >= self.比ねじれ角()):  
            stiffness = True  
        else:  
            stiffness = False  

        return (strength and stiffness)  


    def 最大せん断応力(self):  
        return self.トルク/self.極断面係数()  

    def 最大曲げ応力(self):  
        return self.曲げモーメント/self.断面係数()  

    def 比ねじれ角(self):  
        return self.トルク/self.横弾性係数/self.断面二次極モーメント()  


if(__name__=="__main__"):  
    SD = ShaftStudy(400*10**6, 200*10**6, np.deg2rad(1/4))  
    SD.setLoad(92.84,0)  
    SD.横弾性係数=80*10**9  

    for i in range(len(ShaftStudy.JISDiameter)):  
        SD.set軸径(ShaftStudy.JISDiameter[i])  
        if(SD.achived()):  
            break  

    print("軸径:"+ str( SD.軸径*1000) + "[mm]")  

結果

軸径:45.0[mm]  
Press any key to continue . . .  

クラス設計があんまりよくなかった気がする

参考

https://materialmechanics.work/archives/835

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@Negizoku の技術メモ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう