2018.04.09
3Dプリンターで作ったDIYレールで、プラレールを高い位置まで導く試み(失敗)
これまでにレールの軌跡を指定するとそのルートに従いプラレールのカスタムレールを出力するOpenSCADスクリプトを作ってきました。2D平面のレールは自在に出力可能になり、レール幅など少しカスタムすることで半径5cmの急カーブを曲がれるレールが作れることが分かりました。↓
次にこのレールを用いて、らせん(スパイラル)状に高度をあげて、プラレールを高い位置まで省スペースでもっていけるレールを作ろうと思います。作ったモデルは↓(※下記は分割の細かさを最終モデルから少し落としています。うちのパソコン非力なんで編集時は落としている(^^;))
OpenSCADのソースコードは↓です。
-----------------------------------------------
$fn=10;
pitch=1/72;
wall_body=12; // normal=8
innerwall_body=3; //normal=1/5
wall=6;
width=41;
//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));
out2(t2xyz(0+pitch),t2xyz(0),t2xyz(0-10.3/360),t2xyz(0-10.3/360-pitch));
poll(t2xyz(0),t2xyz(0+pitch));
poll(t2xyz(0.25),t2xyz(0.25+pitch));
poll(t2xyz(0.5),t2xyz(0.5+pitch));
poll(t2xyz(0.75),t2xyz(0.75+pitch));
Cyl2();
////////////////////////////////////////////////////
function t2xyz(temp)=[50*sin(temp*(360-10.3)),50*cos(temp*(360-10.3)),temp*60];
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)))];
//poll
module poll(pos1,pos2){
Dir=pos2-pos1;
posO=pos1+XY(Dir,0,width/2+1.5);
translate([posO[0],posO[1],0]){
Cyl();
}
posI=pos1+XY(Dir,0,-width/2-1.5);
translate([posI[0],posI[1],0]){
Cyl();
}
}
//cylinder
module Cyl(){
difference(){
cylinder(r=3,h=60);
{
cylinder(r=2,h=5);
translate([0,0,5]){cylinder(r1=2,r2=0,h=5);}
}
}
translate([0,0,60]){cylinder(r=1.5,h=5);}
}
module Cyl2(){
cylinder(r=3,h=5);
cylinder(r=10,h=2);
translate([0,0,5]){cylinder(r=1.5,h=5);}
}
// body
module body(pos1,pos2,pos3,tt){
Dir1=pos2-pos1;
Dir2=pos3-pos2;
translate([0,0,pos1[2]]){
linear_extrude(height = 1.5,center=true){
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)]);
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)]);
if (round(tt*360/10)==round(tt*360)/10){
polygon(points=[pos1+XY(Dir1,0,8),pos1+XY(Dir1,0,-8),pos2+XY(Dir2,0,-8),pos2+XY(Dir2,0,8)]);
}
// polygon(points=[pos1+XY(Dir1,0,width/2),pos1+XY(Dir1,0,-width/2),pos2+XY(Dir2,0,-width/2),pos2+XY(Dir2,0,width/2)]);
}
linear_extrude(height = wall_body,center=true){
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)]);
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)]);
}
}}
module out2 (pos1,pos2,pos3,pos4){
//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(Dir,7.5,0)+XY(Dir2,0,-5),XY(Dir,7.5,0)+XY(Dir2,0,-1),XY(Dir,1,0)+XY(Dir1,0,-1),XY(Dir,1,0)+XY(Dir1,0,1),XY(Dir,7.5,0)+XY(Dir2,0,1),XY(Dir,7.5,0)+XY(Dir2,0,5),XY(Dir1,0,3)]);
}
linear_extrude(height = wall,center=true){
polygon(points=[XY(Dir1,0,3),XY(Dir,-1.5,0)+XY(Dir1,0,3),XY(Dir,-1.5,0)+XY(Dir1,0,8),XY(Dir1,0,8),XY(Dir1,0,4.5),XY(Dir,9,0)+XY(Dir2,0,6.5),XY(Dir,9,0)+XY(Dir2,0,1),XY(Dir,7.5,0)+XY(Dir2,0,1),XY(Dir,7.5,0)+XY(Dir2,0,5)]);
polygon(points=[XY(Dir1,0,-3),XY(Dir,-1.5,0)+XY(Dir1,0,-3),XY(Dir,-1.5,0)+XY(Dir1,0,-8),XY(Dir1,0,-8),XY(Dir1,0,-4.5),XY(Dir,9,0)+XY(Dir2,0,-6.5),XY(Dir,9,0)+XY(Dir2,0,-1),XY(Dir,7.5,0)+XY(Dir2,0,-1),XY(Dir,7.5,0)+XY(Dir2,0,-5)]);
}}
}
module in2 (pos1,pos2,pos3,pos4){
//start in
Dir=pos3-pos1;
Dir1=pos2-pos1;
Dir2=pos4-pos3;
translate([pos1[0],pos1[1],pos1[2]]){
linear_extrude(height = wall,center=true){
polygon(points=[XY(Dir1,0,-8),XY(Dir,9,0)+XY(Dir2,0,-4.5),XY(Dir,9,0)+XY(Dir2,0,-9.5),XY(Dir,-1.5,0)+XY(Dir1,0,-9.5),XY(Dir,-1.5,0)+XY(Dir1,0,9.5),XY(Dir,9,0)+XY(Dir2,0,9.5),XY(Dir,9,0)+XY(Dir2,0,4.5),XY(Dir1,0,8)]);
polygon(points=[XY(Dir,9,0)+XY(Dir2,0,width/2-1.5),XY(Dir,9,0)+XY(Dir2,0,width/2),XY(Dir1,0,width/2),XY(Dir1,0,width/2-1.5)]);
polygon(points=[XY(Dir,9,0)+XY(Dir2,0,-width/2+1.5),XY(Dir,9,0)+XY(Dir2,0,-width/2),XY(Dir1,0,-width/2),XY(Dir1,0,-width/2+1.5)]);
}
linear_extrude(height = 1.5,center=true){
polygon(points=[XY(Dir1,0,11),XY(Dir,9,0)+XY(Dir2,0,11),XY(Dir,9,0)+XY(Dir2,0,width/2-1.5),XY(Dir1,0,width/2-1.5)]);
polygon(points=[XY(Dir1,0,-11),XY(Dir,9,0)+XY(Dir2,0,-11),XY(Dir,9,0)+XY(Dir2,0,-width/2+1.5),XY(Dir1,0,-width/2+1.5)]);
}
}
}
-----------------------------------------------
前回のスクリプトから、立体出力するためにt2xy()という関数をt2xyz()に拡張してます。また、これまでレールの端の凹凸連結部はどんな曲線のレールであっても、直線で出力していたのですが、直線だとスパイラルに上っていくレールどうしの連結に問題が出るので、連結部自体も曲線に従って出力出来るように改造しています。(直線でも出力可能。曲線にすると、どんなレールどうしでも連結可能という汎用性が失われてしまうので悩ましいのですが)。
さらにスパイラル360度一周するレールを8本の支柱で支えています。支柱は縦方向に連結可能にして、上端に凸構造の差込部、下端に凹構造の差込部(サポート材が出来ないように中の空洞を円錐構造に加工してあります)。
↓3Dプリンターで出力したところ。フィラメントの使用量は130g、材料費として250円ぐらいかな。しかし、ほとんどサポート材なのでもったいないです。う〜ん。
↓サポート材を外したところ。大量のゴミ(サポート材)が勿体ないです。溶かしてフィラメントを自分で作る装置が欲しいね。
このモデルの改善点としては、使用フィラメント量を減らすためレール中央部分を空洞にして10度に1度だけ左右を連結しているのですが、これだと弱すぎました。サポート材を外している時に1か所パキっと綺麗に取れてしまった。まびいて、30度に3度だけつなぐよう太くするのが良いかと。また出力時のトラブルで支柱が少し歪んでいるところも、デザインを改善するか、または、出力速度を遅くする(今回は出力速度を60mm/s)のがよさそうです。その他は最初の出力にしては特に不具合も無く良い感じだったのですが・・・・
↓プラレール乗せたところ
大失敗、プラレールの車両がデカすぎて、支柱の間を通れませんw。車輪部分はレール幅を広げるなどして通れるようになりまししたが、車輪より車体の方が断然大きいのをすっかり考えていませんでした。
今回の失敗はかなりイタイです。というのも。今回出力したこのスパイラルオブジェクトは支柱部分も併せてちょうど直径15cm。うちの3Dプリンターで出力出来る限界サイズだからです。(半径5cmが曲がれるようにこだわったのはこれが理由です)。
どうやらスパイラル1周分を分割出力する必要がありそうです。う〜ん。120度ずつ出力かな。分割したパーツの連結も考え、上部のパーツを保持する支柱も設計しないといけないのでかなり面倒です。う〜ん。面倒になってこのプロジェクトは一時塩漬けにしそうな予感。ちょっと未定です。ただ、OpenSCADでのモデリングは紙とペンで考えることも多いし、電車での移動時とかの暇つぶしに良いので進めるかもしれません。
少し今後どうするか考えます。↓デカい(直径25cmまで出力OK)3Dプリンターが組み立て式だけど35000円(Aliexpressの値段、下記はAmazon)で買えるので、3Dプリンターをアップデートして解決するのも手かなw。置き場所に困りそうだけど。
Category:#DIYプラレール
■ ■ ■ コメント ■ ■ ■
この記事のアクセス数:本カテゴリーで直近コメントが書かれた記事
→カテゴリー:#DIYプラレール(記事数:26)
本カテゴリーの最近の記事(コメント数)