OpenSCAD は 3D 形状を PC 上で作成するためのプログラミング言語とそのツールです。
ご存じない方は、こちらにカンタンな紹介ページを書きましたので、読んでくださいね。
OpenSCAD を使い始めて、最初のころに書いたプログラム。
目の前にあった「けん玉」を作ってみたのですが、その時にはフィラメントの手持ちが少なかったのかよく覚えていないけれど、3D プリンターで出力していなかったのですねぇ。
OpenSCAD の事を聞かれて、少し説明することになったのだけれど、何か良さそうなチュートリアルというかサンプルはないのか探していたら、自分で書いてた・・
でも、3D プリンターで出力していないのでちゃんと出来るのかわからないものを人に説明するのに使うのもどうかなぁと思ったので、思い出したついでに出力してみたら、これいいじゃんなので、これから始めようという方や、初めて間もない方向けに公開しようと思います。
最初は軽くいきたいので、3回に分けることにしますというか、「けん玉」の部品は3個からなっているので、そういう理由もありますね。(正直に言うと)
この3個の部品の組み合わせと、45センチほどのタコ糸と、小さなネジで「けん玉」が完成します。
今回は、「けん玉」の球を作ってみましょう。
まずはイラストでも図でもよいので、作成する物の形をよ~く確認する。
OpenSCAD の特徴が解ってくると、この辺りは特有の考え方があって、この部分はこの形とこの形の組み合わせだから・・とか、この部分はこの形からこの形を引いてしまえばできるよねとか・・
2次元でもよいので、グラフ用紙などに図を書いておくと、もちろん計算してその座標を導き出してもよいのだけれど、ささっとやるには便利かもしれません。(この程度だらいらないかもしれないけどね)
OpenSCAD には主要なコマンドが用意されていて、もちろん球を作るコマンドもありますから、それを使う。
球を作るコマンドは、
sphere(半径);
ってコマンド。
これから、持ち手の先の部分が入る円筒状の形状を下から開けて、てっぺんから糸が通る形状を取り去ればよいということになりますね。
取り去るコマンドは、
difference (){
}
なんてのが用意されているので、この中でまずは sphere で球を書いてから、原点を適当な位置に移動して、円柱は、
cylinder (長さ,半径);
なので、円筒と糸を通る穴を抜けばよいってことになります。
いきなりだけれどコードは、
$fn=360; difference (){ sphere(30); translate([0,0,-30]) cylinder(h=5,r1=9,r2=6,center=false); translate([0,0,-30]) cylinder(h=45,r=6,center=false); translate([0,0,0]) cylinder(h=30,r=1,center=false); }
こんな感じ。
1行目の $fn=360; はスミマセンが最後で説明します。
2行目は、上記でも紹介した difference (){ で 13行目の } までの間で、最初に描画されたプリミティブ(物体)(sphere(30); )から、あとに記述された形状を引き算するって意味。
続いて 3行目には、sphere(30); として、半径30ミリの球を描画する。
続いて 5行目は、 translate([0,0,-30]) で、Z 軸上に原点を-30ミリ移動している。
要するにたまの一番下に移動するって事。
続いて 6行目は、取っ手の先端部分(剣)が入りやすくなる様に、台形状に縁取り(抜き)してる。ここでは cylinder(h=5,r1=9,r2=6,center=false); として、高さは 5ミリ、下側の半径は 9ミリ、上側は 6ミリ。
(難しい「けん玉」が良い時はこれはいらない)
7行目では、わかりやすいようにまた移動して、translate([0,0,-30]) 。
8行目は取っ手部分の先端部分(剣)が入る筒状の形を球から抜いている(引き算)。cylinder(h=45,r=6,center=false); としてあるから、高さは 45ミリ、穴の半径は6ミリ。
10行目では球の真ん中に原点移動 translate([0,0,0])。
11行目では、糸の通る穴を cylinder(h=30,r=1,center=false); として抜いている。高さは 30ミリ、半径は 1ミリ。
}で difference を閉じて終了。
このソースコードを OpenSCAD の左側のウインドウにコピペして、>>のアイコンをクリックすれば、「けん玉のたま」が右上のウインドウに表示されるはず。
これをコンパイルすると、こんな感じになります。
1行目の $fn=360; は、解像度を指定するもので、プログラムの作成時には // でコメントアウトしておいた方が、計算量が減るのでお勧め。
STL ファイルにエクスポートしたり、鮮明な画像が見たいときにコメントを外して、造形する方が処理が早いので、良いみたいです。
ちなみに $fn は、OpenSCAD で用いられる特殊変数で、他には $fa と $fs があります。
$fn の意味は、曲面を作る際の分解数として用いられ、360°をいくつに分解するかを指定する変数。
この場合には 360 と指定しているので、1°に指定しています。
もしも $fn=12; とすると、30°での指定となり、粗い出力となります。
細かく指定するほど、計算時間を必要としますから、最後に任意の値に設定して、STL ファイル等にエクスポートするのが効率の良い方法ですよ。
他の特殊変数については、使ったその時に紹介します。
STL ファイルをエクスポートするには、$fn で指定した解像度を有効(コメントを外す)にして、Render してから File メニューの Export で STL を選んだあと、任意のファイル名でセーブすれば OK 。
下記は、エクスポートした STL ファイルを Cura で取り込んだ画面。
ん~。
出来てるけど、これだと下側から開けた穴の上に糸を通す穴ってことなので、おそらくはサポートが入って、フィラメントが無駄(少しね)になるかも。
Cura で180° 回転させて出力すればよいけれど、もうお分かりと思うので、OpenSCAD のソースコードを修正してみてくださいな。
Cura では、GCODE を出力して SD カードでデータを 3D プリンターに渡します。
実際に出力した結果はこんな感じ。
出力は、
なんてパラメータを Cura で指定しています。
汚い出力を見るのが嫌なので、いつも解像度(Resolution)は 0.1mm で出力していますけど、もう少し粗くてもよいかも。
でもこの設定で9時間ほどで出来上がる。
夕方お仕事の終わりに開始して、朝までにはできている感じですね。
Infill: 20% だと「けん玉のたま」が少し軽めかも。
子供が使うのなら丁度良いけれど大人だともう少し重い方が良いかもなので、必要に応じて増やしてください。(でもフィラメントはその分使いますよ)
まだあんまりプログラムっぽくなっていないけれど、カンタンでしょう?
3回の連載で「けん玉」が完成します。
記事がアップされ次第、それぞれにリンクを張ります。
お楽しみに~
電子機器が大好きです。
プログラムを書くのをお仕事としていたこともあるので、両方できる PIC や Arduino を使って、いろいろな(役にあんまり立たない)ものを作っています。
実は UNIX 関連のお仕事も長かったので、Raspberry Pi もお手の物なのですけれど、これから触る機会が多くなるのかなぁ。
ボチボチ行きますが、お付き合いください。
若いころの写真なので、現時点では、まだ髪の毛は黒くてありますが、お髭は真っ白になりました。
愛車の国鉄特急カラーのカスタムしたリトルカブで、時々、秋月電子通商の八潮店に出没します。