OpenSCADで作る日本円硬貨選別器

本記事は[Livesense Advent Calendar 2016](http://qiita.com/advent-calendar/2016/livesense_1)の25日目の記事になります。

リブセンスでサーバサイドエンジニアとして働いている iwtn です。
また今年も仕事とは全く関係の無い内容です。

今回は去年書いた[OpenSCADで始めるプログラマブルな3Dモデリング](http://qiita.com/ganta-viii@github/items/b984519ad24ac3c7d7d5)の応用編です。
↑の記事は「OpenSCAD」で検索すると、公式サイトの次に来ます。
それぐらいOpenSCADがマイナーってことですね。世の中の多様性を感じます。素晴らしい。

というわけで、OpenSCADを使って普段職場で困っていることを解決するような**モノ**を作ってみましたので、その紹介をしたいと思います。
まだ流行しているかよくわかりませんが、**Fintech**関連（？）です。

それはこれ。硬貨選別器です。
![日本円硬貨選別器のデモ.gif](https://qiita-image-store.s3.amazonaws.com/0/16864/f45c10ec-ac6c-de92-2941-a0a95f5a2769.gif)
機械的要素は一切無く、大きさのみで硬貨を選別するようになっています。ですので、硬貨選別「機」ではなく、硬貨選別「器」です。

OpenSCAD上での3Dモデルはこちら。
<img width="1405" alt="日本円硬貨選別器の3Dモデル" src="https://qiita-image-store.s3.amazonaws.com/0/16864/61b4e7a7-13a1-cacc-0e6f-2c400bbb89f7.png">
ソースコードはGithubで公開しています。**オープンソースハードウェア**（？）ですね。
https://github.com/iwtn/coin_selector

Githubにアップロードして驚いたのですが、[STL形式](https://ja.wikipedia.org/wiki/Standard_Triangulated_Language)のファイルをブラウザ上でレンダリングしてくれます（PCのブラウザのみのようです）。
以下のURLで見れます。マウスでグリグリ動かせます。楽しい。
https://github.com/iwtn/coin_selector/blob/master/main.stl

##なぜ作ろうと思ったのか
世の中にはたくさんの硬貨が集まる場所があります。
私の職場はそんな場所の一つで、少なくとも同じフロアで3箇所ぐらいは硬貨が溜まっています。
そして、それを手で分別するのは大変だから自動化する手段はないかなー、ぐらいが動機です。
[「硬貨選別機」で検索する](https://www.google.co.jp/search?q=%E7%A1%AC%E8%B2%A8%E9%81%B8%E5%88%A5%E6%A9%9F)とわかりますが、機械式のものは結構なお値段がします。
これは、安価なものが作れればこの市場に切り込めそうですね。

後はネタです。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]);
  }
}
```

硬貨を流す`plate`モジュールのレンダリング結果
<img width="1405" alt="プレートモジュール" src="https://qiita-image-store.s3.amazonaws.com/0/16864/bad14529-55fc-b637-c31d-1afb5e080e92.png">

硬貨を落とすための`hole`モジュールのレンダリング結果（コードは長いので割愛）
<img width="1405" alt="スクリーンショット 2016-12-24 22.23.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/16864/1c0f5c60-f910-a1b4-450a-6c7833ba063f.png">

そして、OpenSCADでは[3Dのモデル同士を「演算」できます](http://qiita.com/ganta-viii@github/items/b984519ad24ac3c7d7d5#%E5%9B%B3%E5%BD%A2%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B)。
モジュールを「減算」、つまり`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);
}
```
<img width="1405" alt="日本円硬貨選別器の3Dモデル" src="https://qiita-image-store.s3.amazonaws.com/0/16864/61b4e7a7-13a1-cacc-0e6f-2c400bbb89f7.png">

## 3Dプリントで出力する際は材質に気をつける
出力は[DMM.make](http://make.dmm.com/)の3Dプリントサービスを利用しました。
一番サイズが近い硬貨は五円玉と百円玉で、0.6mmしか違いがありません。　
そのため、高精細な造形が必要だと考え、[アクリル（Ultra Mode）](http://make.dmm.com/print/material/#2)で出力しました。（4000円ぐらいしました）
ただ、ちょっと歪んでしまいました。
そのため、強度の心配もありましたが一番安価な[石膏](http://make.dmm.com/print/material/#1)でも出力してみました。
これが意外と精度がいい！あとお値段も安い！（とは言っても1000円ぐらいします）

上がアクリル、下が石膏です。
![IMG_20161224_223320.jpg](https://qiita-image-store.s3.amazonaws.com/0/16864/f5f1ea88-836d-21f1-665c-264936d04435.jpeg)

↑の写真でもわかるかもしれません。↓の写真で右側のアクリルのほうが、わずかに歪んでいるのがおわかりいただけるでしょうか？
このわずかな歪みのせいで、硬貨がうまく落ちない時があります。精度も大事ですが、目的によって材料は使い分ける必要がありますね。現実って難しい。
![IMG_20161224_223411.jpg](https://qiita-image-store.s3.amazonaws.com/0/16864/ef54412d-118e-a13d-ab77-6bdbc45e7aea.jpeg)

## まとめと今後の展開
* モノを作れるプログラミング、楽しいです。
* 3Dプリンタでモノを出力するときは、材質を考慮に入れて材料を選びましょう。
* 今後の開発方針としては、硬貨を選別して格納できる貯金箱の部品として使うか、円錐型にしてコンパクト化を進めるかで迷っています。

今年ももう終わりますが、来年も楽しくプログラミングしていきましょう！
それでは良いお年を！