「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



こないだの、OpenSCADで作ってたトロコイドポンプの
プログラム、計算の関数周り以外を大改修して、
影との引き算を使わないロジックに変更してみた。

結果、動くといえば動くんだけど、やっぱり妙な
スリットが出来ちゃうのは相変わらずだなぁ。

とりあえず出来た感じはこんな。



外側8歯はもちろん、



外側4歯も大丈夫。

絵は載せてないけど外側3歯もokだった。

けど、やっぱり5枚歯以下が登場すると、変なスリット
が出てきちゃうので、色々と弄り回して、なんとか
スリットが出て来ないようにしてみたのがこの4枚歯
の例。


どうやら、歯の曲面の曲がり具合に対して、特殊変数$fa
(最小角の断片の設定)が小さすぎると、太さゼロの
ポリゴンみたいなものが出来ちゃって、だめみたい。

なので、与えられたパラメタを使い、バグらない範囲に
$faを設定するように計算する処理を入れてみた。

なぜこの値(計算式)に設定するのかについては、
単なる経験則であって、いわゆるマジックナンバー
なので、正直気持ち悪い。

あともう少し微小に分割したいんだけど、これ以上
分けちゃうと、今のロジック・計算式だとどうしても
上手くいかない。ポンプとしては少し表面が粗い。

とりあえず現時点のプログラムを載っけておく。

/**************/
/* parameters */
/**************/

// radial of outer circle
outer_r = 20;

// number of outer teeth (must be a even number)
out_teeth = 4;

// degrees par step
$fa = 15 / out_teeth;  // it is a magic number


/******************/
/* sub parameters */
/******************/

// tooth height (radial of small circle)
tooth_h = outer_r / (out_teeth * 2);

// radial of inner circle
inner_r = outer_r - (tooth_h * 2);

// number of inner teeth
in_teeth = out_teeth - 1;


/*************/
/* functions */
/*************/

// Epicycloid(outer circloid) //

function epicycloid_x (r1, r2, agl) =
                       (r1 + r2) * cos(agl)
                       - r2 * cos (((r1 + r2) / r2) * agl);

function epicycloid_y (r1, r2, agl) =
                       (r1 + r2) * sin(agl)
                       - r2 * sin (((r1 + r2) / r2) * agl);


// hypercycloid(inner circloid) //

function hypercycloid_x (r1, r2, agl) =
                       (r1 - r2) * cos(agl)
                       + r2 * cos ((-(r1 - r2) / r2) * agl);

function hypercycloid_y (r1, r2, agl) =
                       (r1 - r2) * sin(agl)
                       + r2 * sin ((-(r1 - r2) / r2) * agl);


// trochoid //

function trochoid_x (r1, r2, agl) = 
    (floor( agl / (360 / r2) * 2) % 2 == 1)
    ? epicycloid_x (r1, tooth_h, agl)
    : hypercycloid_x (r1, tooth_h, agl);


function trochoid_y (r1, r2, agl) = 
    (floor( agl / (360 / r2) * 2) % 2 == 1)
    ? epicycloid_y (r1, tooth_h, agl)
    : hypercycloid_y (r1, tooth_h, agl);



/***********/
/* modules */
/***********/

// a trochoid //

module trochoid_gear (a, b) {
  for (i = [1: (360 / $fa)]) {
    echo(i);
    agl1 = i * $fa;      // now angle
    agl2 = (i+1) * $fa;  // next angle
  
    x1 = trochoid_x(a, b, agl1);
    y1 = trochoid_y(a, b, agl1);
    x2 = trochoid_x(a, b, agl2);
    y2 = trochoid_y(a, b, agl2);
        
    echo (x1, y1);
    polygon (points = [[0,0],[x1,y1],[x2,y2]] );
  }
}



/**************/
/* draw gears */
/**************/


linear_extrude(10) {

  // outer gear
  trochoid_gear (outer_r, out_teeth);
  
  // inner gear
  translate ([0, outer_r * 3, 0]) {
    trochoid_gear (inner_r, out_teeth - 1);
  }
  
  
  translate ([outer_r * 3, 0, 0]) {
    difference () {
      // outer gear
      trochoid_gear (outer_r, out_teeth);
      
      // inner gear
      translate ([tooth_h * 2, 0, 0]) {
        trochoid_gear (inner_r, out_teeth - 1);
      }
    }
  }  

}


「outer_r」に、外側ギヤの平均外周(凸と凹を均した
円周)を指定して、「out_teeth」にギヤの歯数を指定
すれば、外側がその歯数のトロコイドポンプの図形を
描いてくれるという寸法。

これを、そのままライブラリとして利用するための
ことを、まだ詰め切れていないので、あとでもう
ちょっと整理する必要あり。

ちなみに現状は、ポリゴン(2Dオブジェクト)でそれぞれ
の断面を描くところまでが大事な処理の中心で、それを
extrudeで立体化しているのはサンプルとしてのおまけ。

なので、ライブラリ化するとしたら、この立体化している
部分は実行させない必要があるので、「include」では
なく、「use」で読み出す必要あり。

ただ、その際に、ライブラリ内部で$faを操作している
ので、その辺がちゃんと動くのかどうかとか、そもそも
$faをライブラリファイルの中でいじっているときに、
呼び出し元に悪さしないのかどうかとかを忘れて
しまった…。
あとでその辺整理しなおしてみようかなと。



このポンプの図形(断面)はトコロイド曲線だろうから、

https://www.youtube.com/watch?v=2NOpQG_pzq8&t=150

こういう感じの流体ポンプにも応用できるはずなんだ
よな。


なんにしても、現状の計算式を元にしちゃうと、ギヤの
中心からポリゴンを描こうとしちゃうため、太さがゼロ
のポリゴンが出て来ておかしなことになっちゃうので、

http://aozoragakuen.sakura.ne.jp/taiwa/taiwaNch04/hikari/node4.html

この2つのベクトルを別々に扱って、内側は内側の軌跡
だけを繋いで平面を作り、外側は外側だけで平面を作り、
それらを合成する、っていう感じに分ければ、太さゼロ
のポリゴンは出て来ないだろうと思うんだよな…

でもなぁ。厳密に言うと、太さゼロのポリゴンなんて、
本当は出来ていないはずなんだけど、これができちゃう
理由って、なんだろう?内部が単精度か何かで計算して
いたりするの?うーーーん。





https://twitter.com/Yokohama_Geo/status/1036442684016095232

サマータイムで、IoT機器みたいな、すでに配置して
あるような機器のメンテは結構やばそうだな。
特にこういう、地震計みたいなやつ。




https://www.youtube.com/watch?v=1AJ3y5vH4is&t=332

100均でタイマーライトなんて売っているのか…。
作ろうと思っていたのに。

この時間を設定するメカ(というか回路部分)、なかなか
興味深いんだけど、回路自体はこの間Aliexで買った、
長時間タイマーモジュールと似ているなぁ。

でも、これが100円で売ってるなら、1個欲しい。セリア
かな?ダイソーかな?





https://twitter.com/handaru20pF/status/1029936308553052160

「よし」

https://twitter.com/yori_shirou/status/1030431258231300097

「よし」





https://twitter.com/tks/status/1036423945778475008

>「がんばったらできた」経験を現在進行系で
>やってないと老け込む

解る気がする。

そういえば、多感な時期に聴いた音楽って、それから
ずっと引きずるものなんだけど、それって、若いころ
は気になった音楽があったら、歌詞やメロディーを
一生懸命覚えたり、楽器持ってる人は弾けるように
練習したりっていう、「がんばる」を無意識のうちに
多かれ少なかれやっていたからなのかなぁ?って気が
してたりする。

最近は、良い音楽に出会っても、あまり一生懸命
聴かないもんな。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする