本記事はLivesense Advent Calendar 2016の25日目の記事になります。
リブセンスでサーバサイドエンジニアとして働いている iwtn です。
また今年も仕事とは全く関係の無い内容です。
今回は去年書いたOpenSCADで始めるプログラマブルな3Dモデリングの応用編です。
↑の記事は「OpenSCAD」で検索すると、公式サイトの次に来ます。
それぐらいOpenSCADがマイナーってことですね。世の中の多様性を感じます。素晴らしい。
というわけで、OpenSCADを使って普段職場で困っていることを解決するようなモノを作ってみましたので、その紹介をしたいと思います。
まだ流行しているかよくわかりませんが、Fintech関連(?)です。
それはこれ。硬貨選別器です。
機械的要素は一切無く、大きさのみで硬貨を選別するようになっています。ですので、硬貨選別「機」ではなく、硬貨選別「器」です。
OpenSCAD上での3Dモデルはこちら。
ソースコードはGithubで公開しています。オープンソースハードウェア(?)ですね。
https://github.com/iwtn/coin_selector
Githubにアップロードして驚いたのですが、STL形式のファイルをブラウザ上でレンダリングしてくれます(PCのブラウザのみのようです)。
以下のURLで見れます。マウスでグリグリ動かせます。楽しい。
https://github.com/iwtn/coin_selector/blob/master/main.stl
##なぜ作ろうと思ったのか
世の中にはたくさんの硬貨が集まる場所があります。
私の職場はそんな場所の一つで、少なくとも同じフロアで3箇所ぐらいは硬貨が溜まっています。
そして、それを手で分別するのは大変だから自動化する手段はないかなー、ぐらいが動機です。
「硬貨選別機」で検索するとわかりますが、機械式のものは結構なお値段がします。
これは、安価なものが作れればこの市場に切り込めそうですね。
後はネタです。OpenSCADの使い道は色々あるのですが、パッとできそうだったのがこれでした。
もしかしたら、うっかり神社の賽銭箱の部品ぐらいにはなれるかもしれません。
##プログラミングで3Dモデリングすることの意義
結論だけ言ってしまえば、然るべきデータを与えることで、柔軟にモデルを変更できるから、です。
私達プログラマは、日々プログラミングで様々なデータの処理を柔軟に行っています。
これを3Dモデリングに応用することで、去年の記事に書いたとおりプログラマブルに3Dモデルを作成できます。
そしてそれを3Dプリンタで現実に出力できるようになります。なんというプログラマブルな世界!
今回は日本円の硬貨で作ってみましたが、海外の硬貨でも簡単に同じような選別器を作れるはずです。
具体的には、以下で定義されている硬貨のデータを更新するだけで大体済むと思います。
https://github.com/iwtn/coin_selector/blob/master/main.scad#L36-L44
// value, diameter, tickness
coins = [
[1, 20.0, 1.2],
[50, 21.0, 1.7],
[5, 22.0, 1.5],
[100, 22.6, 1.7],
[10, 23.5, 1.5],
[500, 26.5, 2.0],
];
OpenSCADで作っておいてよかった!
コードの簡単な解説
OpenSCADでは、3Dモデルをモジュールという機能でまとめられます。
今回の実装では、硬貨を流すplate
モジュールと、硬貨を落とすためのhole
モジュールに分けてあります。
硬貨を流すplate
モジュールのコード
module plate(coins, start_plate_size, tickness, hole_width_margin, guard) {
diameters = [ for (a = coins) a[1] ];
l = suml(diameters);
full_length = l + start_plate_size + hole_width_margin * len(coins) * 2;
plate_height = max(diameters) + tickness + 3;
union() {
cube([full_length, plate_height, tickness]);
cube([full_length, tickness, 5]);
}
}
硬貨を落とすためのhole
モジュールのレンダリング結果(コードは長いので割愛)
そして、OpenSCADでは3Dのモデル同士を「演算」できます。
モジュールを「減算」、つまりplate
モジュールからhole
モジュールを引くことで、然るべき硬貨が落ちるようなサイズの穴を作っています。
difference() {
plate(coins, start_plate_size, tickness, hole_width_margin, guard);
holes(coins, start_plate_size, tickness, hole_margin, hole_width_margin, guard);
}
3Dプリントで出力する際は材質に気をつける
出力はDMM.makeの3Dプリントサービスを利用しました。
一番サイズが近い硬貨は五円玉と百円玉で、0.6mmしか違いがありません。
そのため、高精細な造形が必要だと考え、アクリル(Ultra Mode)で出力しました。(4000円ぐらいしました)
ただ、ちょっと歪んでしまいました。
そのため、強度の心配もありましたが一番安価な石膏でも出力してみました。
これが意外と精度がいい!あとお値段も安い!(とは言っても1000円ぐらいします)
↑の写真でもわかるかもしれません。↓の写真で右側のアクリルのほうが、わずかに歪んでいるのがおわかりいただけるでしょうか?
このわずかな歪みのせいで、硬貨がうまく落ちない時があります。精度も大事ですが、目的によって材料は使い分ける必要がありますね。現実って難しい。
まとめと今後の展開
- モノを作れるプログラミング、楽しいです。
- 3Dプリンタでモノを出力するときは、材質を考慮に入れて材料を選びましょう。
- 今後の開発方針としては、硬貨を選別して格納できる貯金箱の部品として使うか、円錐型にしてコンパクト化を進めるかで迷っています。
今年ももう終わりますが、来年も楽しくプログラミングしていきましょう!
それでは良いお年を!