最小半径で上に登っていくDIYプラレールを3Dプリンターで作る試み(その2)
カテゴリー:3Dプリンター「3Dグレコ」でイロイロDIY(記事数:63)

2018.05.17

最小半径で上に登っていくDIYプラレールを3Dプリンターで作る試み(その2)


う〜ん、美しい!!!!いつの間にかOpenSCADと変態プラレールのプロになってないか俺?w。前回のフィラメントの色が美しないとYoutubeで不評だったので、プラレールっぽい水色のフィラメントを買いました!DIYであることは分かりにくくなるので、そっくりな濃い青色のフィラメントは避けました。

↓今回の報告は、この前の続きです。

この前の失敗を報告した時にコメント欄で「中央に支柱を立てれば?」とアドバイスもらったのを試してみました。
↓3Dプリンターで出力直後


↓外したサポート材の山(笑)、このパーツ1つ作るのに150gのフィラメントを使いますので300円ぐらい。しかし本体は80gしかなく、半分(150円分)がゴミとなるサポート材です。まあ仕方ないかねぇ。


↓中央の支柱は丈夫にするためにかなりの厚みを持たせ、縦方向に積層出来るようになっています。そのままだとフィラメントの消費量がすごいので四角形でくりぬいて必要な材料を減らしています。四角形部分はサポート材が形成されないように角度45度でくりぬかれています。


↓半径5cmの急カーブを曲がると車体が飛び出しがちなので、レール両側のガードの高さを4mm→10mmと高くしてあります。また見た目分かりませんが、別のプラレールとの結合部分の形状が変更となっており、タカラトミーのプラレールともそのままつなげますし、このパーツを縦に積層した場合も問題無く接合出来るようになってます。計算難しかった。。。。。他にもレールが外側にいくほど少し高くなるような傾きがつけてあったりなど様々な工夫を取り入れています。


↓結果は前回の記事も含めて編集した動画をYoutubeにアップロードしたのでそちらを見てください。


↓今回のOpenSCAD設計コード

-----------------------------------------------
$fn=50;

pitch=1/288;
wall_body=12; // normal=8
innerwall_body=3; //normal=8
wall=6; //normal=8
width=42; //normal=38

polldistance=5;
pollsize=50-width/2-polldistance;
pollheight=65;

//main /////////////////////////////////////////////
for (t=[0:pitch:1-pitch]){
body(t2xyz(t),t2xyz(t+pitch),t2xyz(t+pitch*2),t);
}
//in2(t2xyz(1),t2xyz(1+pitch),t2xyz(1+10.3/360),t2xyz(1+10.3/360+pitch));
in2(t2xyz(1),t2xyz(1+pitch),t2xyz(1+10.3/(360-10.3)),t2xyz(1+10.3/(360-10.3)+pitch));
out2(t2xyz(0+pitch),t2xyz(0));
for(t=[0.1:0.1:0.9]){
attach(t2xyz(t),t2xyz(t+pitch));
}
pol2();

translate([0,0,-20]){pol3();};

////////////////////////////////////////////////////
// what is 10.3
// 9/r*2*3.14159*360=10.3
function t2xyz(temp)=[50*sin(temp*(360-10.3)),50*cos(temp*(360-10.3)),temp*pollheight];

function XY(angle,Ddis,Vdis)=[
sign(Ddis*angle[0])*sqrt(pow(Ddis,2)/(1+pow(angle[1]/angle[0],2)))+sign(Vdis*-angle[1])*sqrt(pow(Vdis,2)/(1+pow(angle[0]/angle[1],2))),
sign(Ddis)*angle[1]/abs(angle[0])*sqrt(pow(Ddis,2)/(1+pow(angle[1]/angle[0],2)))+sign(Vdis)*angle[0]/abs(angle[1])*sqrt(pow(Vdis,2)/(1+pow(angle[0]/angle[1],2)))];

module attach(pos1,pos2){
Dir=pos2-pos1;
translate([0,0,pos1[2]+2]){
linear_extrude(height = 7,center=true){
polygon(points=[pos1+XY(Dir,0,-width/2),pos1+XY(Dir,0,-width/2-polldistance-2),pos2+XY(Dir,2,-width/2-polldistance-2),pos2+XY(Dir,2,-width/2)]);
}
}
}


module pol2(){ //main pole
difference(){
difference(){
cylinder(r=pollsize,h=pollheight);
cylinder(r1=pollsize-2,r2=pollsize-4,h=pollheight);
}
{ // hole
for(j=[5:10:55]){for(t=[0:20:360]){
translate([cos(t)*(pollsize-2),sin(t)*(pollsize-2),j]){
rotate([45,0,t]){cube([4,4,4],center=true);}}}}

for(j=[10:10:60]){for(t=[10:20:360]){
translate([cos(t)*(pollsize-2),sin(t)*(pollsize-2),j]){
rotate([45,0,t]){cube([4,4,4],center=true);}}}}
}
}
translate([0,0,pollheight]){
difference(){
cylinder(r=pollsize-2.5,h=10);
cylinder(r=pollsize-4,h=10);
}
}
}

module pol3(){ //base pole
difference(){
cylinder(r=pollsize,h=6);
cylinder(r=pollsize-4,h=6);
}
translate([0,0,6]){
difference(){
cylinder(r=pollsize-2.5,h=10);
cylinder(r=pollsize-4,h=10);
}
}
difference(){
cylinder(r=70,h=2);
{
cylinder(r=pollsize,h=2);
for(t=[0:40:360]){
translate([sin(t)*38,cos(t)*38,0]){cylinder(r=10,h=2);};
}
for(t=[20:40:360]){
translate([sin(t)*55,cos(t)*55,0]){cylinder(r=10,h=2);};
}
}
}
}

// body
module body(pos1,pos2,pos3,tt){
Dir1=pos2-pos1;
Dir2=pos3-pos2;
translate([0,0,pos1[2]]){
translate([0,0,1]){
linear_extrude(height = 1.5,center=true){
//outer
polygon(points=[pos1+XY(Dir1,0,width/2),pos1+XY(Dir1,0,9.5),pos2+XY(Dir2,0,9.5),pos2+XY(Dir2,0,width/2)]);
}}
translate([0,0,-1]){
linear_extrude(height = 1.5,center=true){
//inter
polygon(points=[pos1+XY(Dir1,0,-9.5),pos1+XY(Dir1,0,-width/2),pos2+XY(Dir2,0,-width/2),pos2+XY(Dir2,0,-9.5)]);
}}

translate([0,0,5]){
linear_extrude(height = wall_body,center=true){
//outer
polygon(points=[pos1+XY(Dir1,0,width/2),pos1+XY(Dir1,0,width/2-1.5),pos2+XY(Dir2,0,width/2-1.5),pos2+XY(Dir2,0,width/2)]);
}}
translate([0,0,3]){
linear_extrude(height = wall_body,center=true){
//inner
polygon(points=[pos1+XY(Dir1,0,-width/2),pos1+XY(Dir1,0,-width/2+1.5),pos2+XY(Dir2,0,-width/2+1.5),pos2+XY(Dir2,0,-width/2)]);
}}
linear_extrude(height = innerwall_body,center=true){
polygon(points=[pos1+XY(Dir1,0,9.5),pos1+XY(Dir1,0,8),pos2+XY(Dir2,0,8),pos2+XY(Dir2,0,9.5)]);
polygon(points=[pos1+XY(Dir1,0,-9.5),pos1+XY(Dir1,0,-8),pos2+XY(Dir2,0,-8),pos2+XY(Dir2,0,-9.5)]);
if (tt<0.02 || tt>0.98 ||round(tt*360/20)==round(tt*360)/20 || round((tt*360+1)/20)==round(tt*360+1)/20 || round((tt*360+2)/20)==round(tt*360+2)/20){
if (tt<0.99){
polygon(points=[pos1+XY(Dir1,0,8),pos1+XY(Dir1,0,-8),pos2+XY(Dir2,0,-8),pos2+XY(Dir2,0,8)]);
}
}
}
}}

//module out2 (pos1,pos2,pos3,pos4){
module out2 (pos1,pos2){
//start out
// Dir=pos3-pos1;
Dir1=pos2-pos1;
// Dir2=pos4-pos3;
//hiraban
translate([pos2[0],pos2[1],pos2[2]]){
linear_extrude(height = 1.5,center=true){
polygon(points=[XY(Dir1,0,-3),XY(Dir1,7.5,-5),XY(Dir1,7.5,-1),XY(Dir1,1,-1),XY(Dir1,1,1),XY(Dir1,7.5,1),XY(Dir1,7.5,5),XY(Dir1,0,3)]);
}
linear_extrude(height = wall,center=true){
polygon(points=[XY(Dir1,0,3),XY(Dir1,-1.5,3),XY(Dir1,-1.5,8),XY(Dir1,0,8),XY(Dir1,0,4.5),XY(Dir1,9,6.5),XY(Dir1,9,1),XY(Dir1,7.5,1),XY(Dir1,7.5,5)]);
polygon(points=[XY(Dir1,0,-3),XY(Dir1,-1.5,-3),XY(Dir1,-1.5,-8),XY(Dir1,0,-8),XY(Dir1,0,-4.5),XY(Dir1,9,-6.5),XY(Dir1,9,-1),XY(Dir1,7.5,-1),XY(Dir1,7.5,-5)]);
}}
}

module in2 (pos1,pos2,pos3,pos4){
//start in
Dir1=pos2-pos1;
Dir2=pos4-pos3;
translate([0,0,pos3[2]]){
linear_extrude(height = wall,center=true){
polygon(points=[pos3+XY(Dir2,-9,-8),pos3+XY(Dir2,0,-4.5),pos3+XY(Dir2,0,-9.5),pos3+XY(Dir2,-12,-9.5),pos3+XY(Dir2,-12,9.5),pos3+XY(Dir2,0,9.5),pos3+XY(Dir2,0,4.5),pos3+XY(Dir2,-9,8)]);
polygon(points=[pos3+XY(Dir2,-1,width/2-1.5),pos3+XY(Dir2,0,width/2),pos1+XY(Dir1,0,width/2),pos1+XY(Dir1,-1,width/2-1.5)]);
polygon(points=[pos3+XY(Dir2,-1,-width/2+1.5),pos3+XY(Dir2,0,-width/2),pos1+XY(Dir1,0,-width/2),pos1+XY(Dir1,-1,-width/2+1.5)]);
}
linear_extrude(height = 1.5,center=true){
polygon(points=[pos1+XY(Dir1,-1,11),pos3+XY(Dir2,0,11),pos3+XY(Dir2,0,width/2-1.5),pos1+XY(Dir1,-1,width/2-1.5)]);
polygon(points=[pos1+XY(Dir1,-1,-11),pos3+XY(Dir2,0,-11),pos3+XY(Dir2,0,-width/2+1.5),pos1+XY(Dir1,-1,-width/2+1.5)]);
}
}

}
--------------------------------------------------


ずいぶん設計コードが長くなってしまいました。

 動画を見てもらうと分かりますが、大失敗です。主原因は「急カーブを曲がるためにはレール端のガードを高くする必要があるが、これを高くすると、上方に登ろうとしているプラレール車体の後ろ部分がこのガードにぶつかってしまう。」って問題です。この問題は前回紹介したプラレールより悪化しているみたいなのですが、設計を変更した部分が多すぎて解決方法が明確には思いつきません。一つ気になるのは、レールを傾けて、外側を高くしたのは不要だったかな?ってぐらい。う〜ん、それだけを修正してもう一度出力する気には今はなれません。

 そもそも半径5cm(レールの中心線として)って縛りがチャレンジングすぎましたかねぇ。半径8cmぐらいなら余裕で成功しそうですが、うちにある3Dプリンターの出力サイズは、直径15cmの円柱の範囲内、正方形だと1辺が12cmが限界ですので、1層=1ユニットとして出力するには半径5cmで作るしかありませんでした。半径8cmだと、直径16cm、レールの幅を考えると直径20cmの構造物になりますので、1層を90度回転するごとにわけて、4ユニットにする必要があり、出力がかなり大変になると予想されます。

今後は1層=1ユニットにこだわらずプラレールを上方に簡単に導けるパーツ作りでもやろうかなと思いますが、コンセプトを一から考え直す必要がありそうです。複数パーツに分かれてもよいからなるべくサポート材が少なくてすむ形状を考えたいけど、そうると、つまらない形状になりそうな予感。

 まあ、今回のチャレンジで組んだ基本モジュールを使えばどんなプラレールも簡単に作れる状態にあるのでチャレンジする価値は大きかったなと思います(敗北宣言)。

Category:3Dプリンター「3Dグレコ」でイロイロDIY



■ ■ ■ コメント ■ ■ ■

いいっすね!=57
001 [05/17 16:05]自分でやろうとかやりたいとかは一切思わないけどw:なんだかんだこういう費用対効果あわないめんどくさいことやる行動力は尊敬する。 (7)
002 [05/18 14:51]roc@OCN:車両の方もモデリングしてレール出力の前にどこがあたるとか検証できないんですかね? (6)
003 [05/18 16:00]ポンチ@Biglobe:回転最小半径とエアロの最低地上高、車体幅を完全無視した設計でわろーた。せめてノギスでサイジングしろよ。博士の割に検証やサイジング、実験せずやっちゃうんだね。意外と拘らんのやね (2)
004 [05/18 18:26]j:プラレールの列車を3Dスキャナで読み込んで、プリンタ出力前に一度、CAD上で載せてみて課題出したりすると無駄な出力しなくて済みますよ。と思ったけどレンタルでも4000〜5000円くらいかかるので、のぎすで測って自分でモデル簡単に作ればただですね。そのデータでCAD上で出力前に確認すれば無駄なフィラメント使わなくて済みますよ。こんなこと言うのはたやすいけど、001と同じく行動力は感服します。 (3)
005 [05/18 23:51]ふぇちゅいんさんふぁん(ゆるりゆラリー)★73:なぜに前半はBGMが騒々しいのに後半は完全なる無音なのか。これではただの動画垂れ流しであって、他人に動画を見てもらって収入を得るyoutuberとは異なる。 (3)
006 [05/19 01:53]ふぇちゅいん(管理人) TW★67:>>005 あ、ほんとだ音楽はYoutubeの機能で適当につけていたんだけど曲が終わると繰り返さないんだね。別の曲に変更しました。う〜ん、Youtubeに頼らずにフリーの音楽をつけるにはどうしたらよいんだろう。 (5)
007 [05/19 15:17]ふぇちゅいんさんふぁん(ゆるりゆラリー)★73:マクドナルド号が良いのは、車体の短さじゃなくてホイールベースの短さが効いてるよね。レールのガードはホイールの側面に当たって走行抵抗になってるように見える、特に内側。内側はガードなくてもいいんじゃないか。あとバンクが足りない気がする。 (4)
008 [05/19 20:37]:>>006 YouTube用の音楽素材ダウンロードページがあるから、そこから落として自分の編集ソフトに放り込み編集という感じだね。動画の長さが音楽の長さになったり、複数の音楽をリミックスした長さの動画にしたりするのが腕の見せ所。https://accounts.google.com/ServiceLogin.... (3)
009 [05/19 20:40]:>>006 ダウンロードして使う音楽は著作権や使用方法があるから気を付けて。https://support.google.com/youtube/answe.... (5)
010 [06/13 22:45]LSS:縦に半分に切って横に倒して出力したら、サポート剤は少しですむんじゃないでしょうか。 (2)


011 [06/13 22:47]LSS:私も変態なプラレールいろいろ作ってます。よろしく。https://www.thingiverse.com/linuxsercher.... (3)

名前 ↑B

コメント(※改行は省略されます)

※3回以上の連続書き込み不可
この記事のアクセス数:


デルタ型3Dプリンター「3Dグレコ」でうまく印刷するためのTIPS

(1)印刷するためのコード「.gcode」ファイルはフリーソフトCuraで落ちているデータ「.stl」から作れる。
(2)Curaの設定でスタートアップコードにステージの高さをキャリブレーションするためのG29コードを追加する。
(3)ヒートベッドが搭載されていないのでABSは印刷しにくい、PLAの方が綺麗にゆがみなく出力可能。
(3)ABS樹脂でもPLA樹脂でも、ステージには「消え色ピット」をまんべんなく塗り、乾かして使用する。ゴミが溜まってきたらステージを取り外し、水につけると綺麗に取り除ける。マスキングテープをはり、その上に「消え色ピット」を塗るとステージを外して掃除する手間が省ける。
(4)ヘッドが変な動きをしたらモーターとベルトをつなぐイモネジがゆるんでいる可能性があるので締める。
(5)Initial Heightを0.2mmにするとしっかりステージに印刷するオブジェクトが固定される。


(6)印刷前にgcodeファイルをRepetier-Hostなどで確認すると良い、ポイントはきちんとステージに設置しているか、Brimは十分かなど。
ありとあらゆるノウハウがあるのでこのページに書かれている事を最初から最後まで熟読すると良い。

デルタ型3Dプリンター「3Dグレコ」 3DPRTRE2 ※日本語マニュアル付き サンコーレアモノショップ


→カテゴリー:3Dプリンター「3Dグレコ」でイロイロDIY(記事数:63) (コメント数)