貧者のUSBケーブルチェッカーのケースを設計する
> oembed
<<
3Dプリンター向けのデータをどうやって作るかを、まだ模索している段階なのですが、今回のやり方を文書化することで、新たな発見があるかも・・と思い記事にしてることにしました。
利用するツール
- 2次元CADツール
- コンパスや定規などで作図する感じで造形できます
- 3次元CADツール
- プログラミングで立体を造形できます
基板上のでっぱりのあるコネクタのサイズなどを測定し、LibreCADで作図をします。
https://inline.inajob.tk/img/twitter-5643382/%E8%B2%A7%E8%80%85%E3%81%AEUSB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC%E3%81%AE%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B/5bf70122-c952-11ec-a9a2-d2e235d52094#.png
作図補助レイヤーで垂直・水平のガイドを作図し、でっぱり部分をレイヤーで作図します。
(図で緑色と黄色の線が作図補助のための直線です。)
基板外形、でっぱりの高さが異なる部分は別のレイヤーにします。
OpenSCADではDXFファイルのレイヤーを指定してインポートできるので、便利です。
OpenSCADで作図する
このライブラリは、立体物にアンカーを設定して、そこに他の図形をアタッチする形で立体物を作成する機能を提供してくれます。
DXFファイルからレイヤーを指定して読み込む場合には以下のように書きます。
> code
import (file = "board.dxf", layer = "rect-board");
<<
論理演算で穴をあけるための造形物は以下のように書きます。(モジュール化もしています)
> code
module hole()
linear_extrude(height=3)
import (file = "board.dxf", layer = "hole");
module hole2()
linear_extrude(height=7)
import (file = "board.dxf", layer = "hole2");
<<
ケースの上部分はこのように書きます。
> code
baseW = 57; // 基板外形 幅
baseL = 46; // 基板外形 奥行き
boardThickness = 1.6; // 基板厚
baseThickness = 2; // 底厚
baseSideThickness = 5; // 横壁厚
topH = 8; //ケース高さ
render() // ちらつき防止
diff("cut") // cutというtagの図形を切り抜く
yrot(180) // y軸中心に180度回転させる
force_tags("cut"){ // 切り抜く部分をグループ化
hole(); // 基板上のでっぱりを引き算する(高さ別に4つのデータが存在)
hole2();
hole3();
hole4();
union(){ // バッテリー収納部を作図する(ここはLibreCADで作っていない)
linear_extrude(height=topH - 1){ // バッテリー部分の壁厚は1mm
circle(r = 10+1); // CR2032の半径=10mm+マージン1mmの円
}
linear_extrude(height=2) // 配線用のスペースを作図する(ここはLibreCADで作っていない)
}
}
// スナップフィットジョイントの作図
xflip_copy() // X軸に対称にコピー
yflip_copy() // Y軸に対称にコピー
up(baseH - baseThickness - boardThickness) // ジョイントの高さ位置合わせ
back(10) // ジョイントの前後位置合わせ
xrot(90) cyl(r=1, l=10, anchor=0, 1, 0); // ジョイントをシリンダで作成、アンカーは下面に設定 }
}
<<
https://inline.inajob.tk/img/twitter-5643382/%E8%B2%A7%E8%80%85%E3%81%AEUSB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC%E3%81%AE%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B/c8e3e280-c950-11ec-a9a2-d2e235d52094#.png
ケース下部分はこのように書きます
> code
baseH = 8;
render() // ちらつき防止
diff("cut") //cutというtagの図形を切り抜く
force_tags("cut") // 切り抜く部分をグループ化
zflip() linear_extrude(height=boardThickness) // 基板外形を作図(linear_extrudeの向きが期待と逆なのでzflipしている
board(); //DXFから基板外形を読み込む
// スナップフィットジョイントと左右はみ出し部分の作図
xflip_copy() // X軸に対称にコピー
// 左右はみ出し部分は一部角丸の直方体として作図
yflip_copy() // Y軸に対称にコピー
back(10) // ジョイントの前後位置合わせ
xrot(90) cyl(r=1, l=10-1, anchor=0, 1, 0); // ジョイントをシリンダで作成、アンカーは下面に設定(1mm短くしてうまくハマるようにしている) }
<<
https://inline.inajob.tk/img/twitter-5643382/%E8%B2%A7%E8%80%85%E3%81%AEUSB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC%E3%81%AE%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B/0b24228a-c951-11ec-a9a2-d2e235d52094#.png
説明をコメントになるべく書いてみましたが、なかなかわかりづらいですね。
しかしBOSL2を使った相対的な位置の指定により、OpenSCAD単体で作図するのと比べて、かなり直感的にコーディングすることが出来ました。
もっとうまく抽象化することもできるとは思いますが、そこは読みやすさや、コーディングしやすさとのトレードオフだと感じています。
BOSL2所感
とにかくアタッチができるのが有用と感じました。
直方体を定義すると、その頂点または辺の中点を簡単にアタッチ原点と設定することが出来ます。
これにより相対的な立体図形の配置が出来るようになり、OpenSCAD単体で作図していると変数だらけになってしまう問題を解消できます。
(アタッチが出来ないので辺の長さをすべて変数に逃がす必要があった)
またxflip, yflip, zflipやup, down, left, rightなど軸を1つに限定した操作も可読性が良くなり良いものだと感じました。
cuboidには角丸のオプションがあり、フィレットが苦手なOpenSCADの弱点を少しは緩和させてくれます。 (それでもやはりフィレットは苦手ですが・・)
linear_extrudeの引き延ばした先にアタッチできないのが若干惜しい気持ちになりました。
まとめ
今回初めてLibreCADとOpenSCAD、そしてBOSL2を使った作図をしてみました。 LibreCADを使うとマウスを使って簡単に直感的な作図が出来ました。
立体的な造形はマウスよりコーディングの方が保守性が高いのでOpenSCADが有用だと感じました。
そしてBOSL2というOpenSCADのライブラリを使うことで、立体物の造形を比較的直観的に実現できました。
今回は試験的にツールを組み合わせただけなので、もっと良い方法があるかもしれません。