歯車について勉強する7 の履歴(No.5)
更新クラウンギアの歯形について考える†
フリーソフトとして公開している自作の 工作/Fusion360歯車スクリプト を使ってクラウンギアを作るために考察した内容です。
クラウンギアはフェースギアとも呼ばれ、2つの軸が直角に交わる配置で噛み合うギアです。 相手のピニオン歯車には通常のインボリュート歯車が使えます。
クラウンギアの円筒面上で歯形を計算すると良い†
クラウンギアの基準円半径を $r_p$ とする。
中心軸から $r_p+\Delta r$ の距離にある円筒面によるピニオンギア形状の断面を考える。
円筒面上の座標は回転角 $\theta$ と高さ方向の変位 $h$ で指定可能である。
高さ $h$ をクラウンギアの基準面から測ることにすると、 ピニオンギアの中心軸は $h=mz_p/2+mx$ の高さに来る。
ここでモジュール $m$ とピニオンギア歯数 $z_p$ の積である $mz_p$ はピニオンギアの基準円直径、 その半分 $mz_p/2$ はピニオンギアの基準円半径である。
$x$ はモジュール単位で測った転位量であり、$mx$ はそれを距離に直した値である。
つまり、転位ゼロの時ピニオンギアの基準円とクラウンギアの基準面とが接する。 転位がゼロでなければその分だけピニオンギアの高さが変化する。
円筒面を切り開いて平面状にしたと考えると、横軸に $(r_p+\Delta r)\theta$ を縦軸に $h$ を取ればよい。
ピニオンの軸に垂直な面上で計算されたピニオン歯車形状をこの円筒面上に持って来るには、 高さ方向はそのままで良いとして、横方向は $$ x=(r_p+\Delta r)\sin\theta $$ の関係があるから、これを逆に解けば $$ \theta=\sin^{-1}\frac{x}{r_p+\Delta r} $$ を満たす点へ移されることになる。
切削用に歯先を延長したピニオンの形状†
クラウンギアと組み合わされるピニオン歯車の形状は通常のインボリュート歯車で良いのであるけれど、 これをそのまま切削具として使ってしまうとピニオン歯車の歯先と切削後のクラウンギアの歯底とが接してしまう。
ピニオン歯車の歯先とクラウンギア歯底との間に適切な頂隙を確保するためには、 切削用のピニオン形状はピニオンギアの歯先を頂隙分だけ延長したものでなければならない。
また、この延長部分はインボリュート歯形である必要がないため、本来の歯先の角からインボリュート面に滑らかに接続するようフィレットを付けた形状とするのが良い。
頂隙は通常モジュールの 0.25 倍(歯元の丈から歯末の丈を引いた値)であるから、 延長された歯先は $h_a$ を歯末の丈として半径 $mz_p+mx+h_a+0.25m$ の円と接することになる。
歯の中心線上に中心を持つ円がこの延長歯先円と歯形の両方に接するなら、 この円弧がフィレット付き歯先延長形状の候補となる。
なぜ候補なのかというと、この円と歯形とが接する点が延長前の本来の歯先円よりも 内側に入ってしまう場合には、この円よりも小さな円を描く必要があるためだ。
この場合には、本来の歯先の角から歯形に垂線を立て、 この線上に中心を持つ円が延長歯先円と接する点を見つけてフィレットの中心とする。
計算でフィレットの中心と半径を求めるには、
- まず延長前の本来の歯先の角から歯形に対する垂線方向を求める
- この垂線と歯の中心線とが交わる点 $P_1$ を求める
- この点を中心に歯先の角で歯形に接する円を描いた際に延長歯先円と交わらなければ前者のケースが有効
つまり歯の中心線上の $P_1$ より外側で延長歯先円と歯形との両方に接する円を描いて延長歯形が求まる- $P_1$ と延長歯先半径との間で半径 $r$ を変化させ、
- 半径 $r$ の円と中心線が交わる点から歯先円に触れる円を描く
- 歯形までの距離が $r$ と等しくなる点が求めたい点
- 「歯形までの距離」は本来の歯先から延長歯先円まで延長したインボリュート曲線上で最も近い点を探せば求まる
- この点を中心に歯先の角で歯形に接する円を描いた際に延長歯先円と交わるなら後者のケースが有効
つまり本来の歯先の角から引いた推薦上で歯形と延長歯先円に接する円弧を描いて延長歯形が求まる- 歯先の角と中心線との間の垂線上で歯先の角までの距離と延長歯先円までの距離とが等しくなる点を求めればよい
結構大変だけれど何とか正しい形状を求められるようになった。
クラウンギアとピニオンギアの回転に伴うピニオン形状の移動†
ピニオンギアの回転は単純に中心点に対する回転であるけれど、 回転後の座標値に対して $$ \theta=\sin^{-1}\frac{x}{r_p+\Delta r} $$ の計算により $\theta$ を求めることになる。
ピニオンの回転に伴い、クラウンギアの方も回転する。 こちらは単に $\theta$ に回転量を加えればよい。
この計算で円筒面上でのピニオンギアの軌跡を求め、その包絡線を歯溝形状とすることになる。
はすばピニオンへの対応†
ピニオン形状を円筒面へ移す際に、ピニオンの軸方向の位置により回転角が変化することになる。
「ピニオンの軸方向の位置」はピニオン軸上では $r_p+\Delta r$ に等しいが、$x\ne 0$ では $$ (r_p+\Delta r)\cos\theta=(r_p+\Delta r)\sqrt{1-\Big(\frac{x}{r_p+\Delta r}\Big)^2} $$ である。
はすば角度が $\beta$ であれば高さ変位 $\Delta z$ に対して回転角 $\Delta\phi$ は $$ (mz_p/2)\Delta\phi=\Delta z\tan\beta $$ を満たすはず。
つまり、 $$ \Delta\phi=\frac{\tan\beta}{mz_p/2}(r_p+\Delta r)\sqrt{1-\Big(\frac{x}{r_p+\Delta r}\Big)^2} $$
・・・ん?
そもそも $\phi$ が求まらないと $x$ が求まらないにも関わらず、ここで得られたのは $x$ が求まらないと $\phi$ が求まらないという式になっている。
この式を使う限り、卵と鶏とを同時に手に入れる必要が出てくるわけか。
うーん、こういう単純な式では求めることはできなさそう。
たぶん、歯形断面上のすべての点について、元の点から延びるはすばピニオンの歯筋に沿って探索し、対応する円筒面との交点を求めてやる必要がある。
結構な計算量になるけれど、まあできなくはないか。
そして、この場合には歯溝形状が対称にはならないので、 まじめに両側を計算しなければならない。
ピニオンの歯元のフィレット部分との接触†
クラウンギアの基準線より内側ではクラウンギアの歯先がピニオンの歯元のフィレット部分と触れてしまう。
これを避けるには、切削用クラウンギアをフィレット値最大で作ってクラウンギアを製作し、 実際にはフィレット値を小さくしたクラウンギアと組み合わせて使うことになる。
インボリュート領域以外で歯車が接触するのは気持ちが悪いので避けた方が良い気がするのだけれど・・・ どうしても避ける必要があるのか、気にしなくていいのか、よく分かっていない。
インボリュート領域と切り下げ領域との境目†
特にはすばのピニオンを使う場合、インボリュート領域と切り下げ領域とが比較的大きな角度で交わり、 明確なエッジが形成されるみたいだ。
こういうエッジを含む形状をロフトで生成しようとすると断面の構成点数を非常に大きくしなければならなくて 計算量が増えるし、いくら増やしたところであまりきれいな結果が得られない。
そこで、インボリュート領域と切り下げ領域とをそれぞれ別々に計算して、 2回に分けて切り取りを行うことにした。
具体的には、
- 歯が最も深く入る角度から歯車を右に回転させて得られる切り取り領域と
- 歯が最も深く入る角度から歯車を左に回転させて得られる切り取り領域と
を別々に計算して、それぞれに対して切り取りを行う。
この方法により切り取り領域の生成は比較的滑らかな曲線のみで行いつつ、 切り取り後の歯面には急峻なエッジが正確に形成されるようになる。
python が遅すぎる†
上記の方法で正しい歯形が出力できるようになったのだけれど、 正確な歯形を得るには結構な計算量を要求されるみたいだ。
とはいえ javascript だとさほどの待ち時間なく終わる程度のものなのだけれど。
その同じ処理を python で実行すると数十倍(?)待たされる。
どうするべきなのか???
ネイティブコードを呼び出すような書き換えは実行環境依存になっちゃうし、できればしたくないんだけどなあ・・・