インボリュート歯車を手で描く
スクリプトや計算機を使わずに CAD でインボリュート歯車を書けるようになりました†
歯元のアンダーカットやフィレットを形作るトロコイド曲線もちゃんと再現します。
左がアンダーカット&フィレットなし、右がアンダーカット&フィレットありの歯形です。
設計は次の手順で行います
- 基礎円半径を求める
- インボリュート曲線を求める
- アンダーカットやフィレットなしの歯車形状を作る
- アンダーカットやフィレットを付ける
+ ラック形状を求める + ラック歯先のフィレット円の中心の軌跡を求める + ラック歯先のフィレット円の包絡線を求める + 歯形を調整する
前半:
LANG: p5js_live
// =============== ここが設定
const gif_url = 'https://dora.bk.tsukuba.ac.jp/~takeuchi/?plugin=attach&refer=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%2FFusion360%2F%E3%82%A4%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%88%E6%AD%AF%E8%BB%8A%E3%82%92%E6%89%8B%E3%81%A7%E6%8F%8F%E3%81%8F&openfile=DrawInvoluteGear1.gif';
const multi = 1; // スライダーは multi 回ループで最大値になる
const fps = 1; // 描画頻度 (frame per second)
const maxWidth = 600; // 横幅最大値
// ================ ここから下は汎用コード
let gif = null;
let frameSlider = null;
let w, h;
p.preload = () => gif = p.loadImage(gif_url);
const draw = () => {
let index = frameSlider.value();
gif.setFrame(index % gif.numFrames()); // フレームを選択して
p.image(gif, 0, 0, w, h); // 描画
}
p.setup = () => {
p.frameRate(fps);
w = Math.min(maxWidth, gif.width);
h = gif.height * w / gif.width;
p.createCanvas(w, h + 20);
frameSlider = p.createSlider(0, gif.numFrames() * multi - 1);
frameSlider.value(0);
frameSlider.position(0, h);
frameSlider.size(w);
frameSlider.input(draw);
draw();
}
p.draw = () => {
if(p.mouseIsPressed) return;
frameSlider.value((frameSlider.value() + 1) % (gif.numFrames() * multi));
draw();
}
後半:(すみません、厳密には計算を間違えていました。下記参照。)
LANG: p5js_live
// =============== ここが設定
const gif_url = 'https://dora.bk.tsukuba.ac.jp/~takeuchi/?plugin=attach&refer=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%2FFusion360%2F%E3%82%A4%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%88%E6%AD%AF%E8%BB%8A%E3%82%92%E6%89%8B%E3%81%A7%E6%8F%8F%E3%81%8F&openfile=DrawInvoluteGear2.gif';
const multi = 1; // スライダーは multi 回ループで最大値になる
const fps = 1; // 描画頻度 (frame per second)
const maxWidth = 600; // 横幅最大値
// ================ ここから下は汎用コード
let gif = null;
let frameSlider = null;
let w, h;
p.preload = () => gif = p.loadImage(gif_url);
const draw = () => {
let index = frameSlider.value();
gif.setFrame(index % gif.numFrames()); // フレームを選択して
p.image(gif, 0, 0, w, h); // 描画
}
p.setup = () => {
p.frameRate(fps);
w = Math.min(maxWidth, gif.width);
h = gif.height * w / gif.width;
p.createCanvas(w, h + 20);
frameSlider = p.createSlider(0, gif.numFrames() * multi - 1);
frameSlider.value(0);
frameSlider.position(0, h);
frameSlider.size(w);
frameSlider.input(draw);
draw();
}
p.draw = () => {
if(p.mouseIsPressed) return;
frameSlider.value((frameSlider.value() + 1) % (gif.numFrames() * multi));
draw();
}
基礎円半径を求める†
以下ではモジュール2、歯数10の歯車を描きます
- 基準円を原点を中心に直径 2 x 10 = 20 mm で描く
- 垂直に半径を描く
- 圧力角で 20°傾いた直線を描く
- その線と垂直に基準円の弦を描く
- 弦の中点が基準円上の点となる
- 原点から半径を描いて距離を表示しておく
インボリュート曲線を描く†
歯形を表すインボリュート曲線は先に描いた基礎円に接する弦の上に円弧と同じ長さ離れた点を取ることで得られる
ただしその際に歯車自身も回転するため、ここでは回転した点から弦を描いてその上に点を取ることで歯車を固定した視点でのインボリュート曲線を得る
具体的な手順としては、
- 先に描いた基礎円半径から左へ適当な角度傾けた、同じ長さの半径を描く
- 2つの半径の間の角度を従属パラメータとして表示する
- その半径から垂直に右方向へ直線を伸ばす
- 直線の長さを "(基礎円半径) * (回転角) / 180deg * PI" のように数式で設定する
- 角度を従属パラメータとしてあるため、2つ目の半径をマウスカーソルでドラッグすると直線の端点がインボリュート曲線上を移動する
- 角度を変化させながら端点位置にポイントを置いていくことでインボリュート曲線上の点を適当な密度で得る
- それらをスプライン曲線で結ぶことで十分な精度で歯車歯形が得られる
- さらに精度を高めるために基礎円と交わる点でスプライン曲線と半径とが接するようにする
- うっかり変更してしまわないよう曲線を固定する
アンダーカットやフィレットなしの歯車形状を作る†
- 基準円との交点から 1/4 ピッチを切り出す
- 歯先円弧を描く
- 基準円との交点から反対向きに 1/4 ピッチ離れた半径を描く
- 歯底円弧を描く
- 基礎円までの半径を描く
- 歯形を押し出す
- 鏡面対称
- 円周パターン
完成
フィレット付きのラック形状(フィレット半径&中心)を得る†
歯元の曲線はラック形状の切削工具で歯車を切り出す際に自然に形成されるものであるため、その作業を CAD 上で再現する
そのために、まずは歯先をフィレット付きで延長したラックの形状を求める。
- 歯底の中心点への半径を描く (M とする)
- 基準円を描く
- インボリュート曲線との交点を求める (P とする)
- P を通り歯底の中心点への半径 OM と圧力角 20°で交わる直線を引く
- ラックの歯先は歯底の中心を通る半径 OM に沿って P からモジュールに相当する 2mm 離れた点であるのに、ここでは間違えて OP に沿って 2mm を測ってしまった。本当は正しくないけれどそれほどひどくずれてもいないので許して。
- 歯底の中心点 M で半径との垂線を引き、ラックの歯先でラック歯形に接し、さらにこの垂線に接する円を求める
- この円がラック歯先に着けられる最大のフィレット半径になる
- このフィレット円の包絡線が歯元曲線になるのだが、それを求めるには中心点の軌跡を求めて半径分だけオフセットすればいい
フィレット円の中心の軌跡を求める†
歯車を回転させながら、ラックを直進させて歯車を切削する際、歯車から見てフィレット中心の軌跡がどのようになるかを CAD 上で再現する
- フィレット中心への半径から適当に右方向に回転させて同じ長さの半径を描く
- 回転角を従属パラメータとして表示しておく
- この半径の端点から垂直に左方向へ直線を伸ばす
- 直線の長さは "(基準円半径) * (回転角)/180deg*PI" とする
- 回転角を変化させながら直線の端点位置にポイントを置いていく
- それらをスプライン曲線で繋ぐ
- 開始点ではスプライン曲線は半径に接する
フィレット円の包絡線を求める†
円の包絡線は中心の軌跡を半径分だけオフセットしてやることで簡単に求められる
フィレット形状を作成†
- 余分な部分をカット
- 足りない部分を補う
- 鏡面対称
- 円周パターン
完成
バックラッシュの実現†
上記手順ではバックラッシュが付きません。
もっとも簡単にバックラッシュを付けるには、歯車をバックラッシュ分だけ回転したものを複製して、両者の論理積を取れば良いはずです。
とても簡単。
点の軌跡をスプラインで結ぶ手法は応用が利きそう†
このように、適当な回転角を設定した際の歯形状の点を1点求められれば、 徐々にパラメータを変えて点を置いて行き、最後にスプラインで結ぶことで曲線が得られる。
この方法はかなり応用が利きそうですね。
質問・コメント†
添付ファイル:
Counter: 177 (from 2010/06/03),
today: 1,
yesterday: 1























