トロコイド歯車を手で描く

更新


工作/歯車について勉強する

ポンプに使われるとコロイド歯車を 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%83%88%E3%83%AD%E3%82%B3%E3%82%A4%E3%83%89%E6%AD%AF%E8%BB%8A%E3%82%92%E6%89%8B%E3%81%A7%E6%8F%8F%E3%81%8F&openfile=trochoid%20pump.gif';
const multi = 1;     // スライダーは multi 回ループで最大値になる
const fps = 10;       // 描画頻度 (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つの基準円の直径は歯の枚数の比率で取る 100mm : 80mm = 5 : 4
  • 2つの基準円は滑らずに転がるため回転数比は 4 : 5 になる
  • 2つの基準円が接する点が小さい歯車に乗って移動する様子を大きな歯車から見た曲線を描く
  • これには小さな歯車の中心点が回転することと、小さな歯車自身が回転することを取り込むことで行える
  • この点の移動に沿って円の中心を動かした際の円周の包絡線が外側の歯車の歯形になる
  • 1/5 のさらに 1/2 を描いたのがこちらの図

trochoid pump draw1.png

鏡面対称と円周パターンで全周の形状を得て、

trochoid pump draw2.png

適当なサイズのディスクからくりぬくことで外側歯車が得られる。

trochoid pump draw3.png

内側の歯車を作成

内側の歯車の歯形は簡単には計算できないため、ディスク上の部材が外側の歯車と重なる部分を切り取ることで作成する。

内側歯車をすっぽり覆うディスクを作成し、外側歯車と重なる部分を切り取る。

1.png 2.png

2つの歯車を少し回してもう一度切り取る。

3.png 4.png

これを内側の歯車が 45°回るまで繰り返すと、右下の領域にほぼ完全な歯形が得られる。

21.png

これを複製することで全周の歯形が得られる。

22.png 24.png 27.png 27-0 03-44-00.png

そのままだと遊びがゼロなので、外側の歯車をオフセットして遊びを作る。

36-0 03-47-44.png

作業の様子

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%83%88%E3%83%AD%E3%82%B3%E3%82%A4%E3%83%89%E6%AD%AF%E8%BB%8A%E3%82%92%E6%89%8B%E3%81%A7%E6%8F%8F%E3%81%8F&openfile=trochoid%20pump%20draw2.gif';
const multi = 1;     // スライダーは multi 回ループで最大値になる
const fps = 2;       // 描画頻度 (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();
}

質問・コメント





Counter: 249 (from 2010/06/03), today: 3, yesterday: 2