これって、 2016 clojure advent calender の記事です。
もともと紙とペン・定規・コンパスなどの道具で点や線を書くので、手書きのころは立体物でも2次元の図面だけ作っていました。僕も実は機械工学科だったので、「図学」とか言ってちゃんとした製図の方法を習ったりしたものです。
コンピュータを使うようになると、自由度が広がってこれまでできなかったようなことができるようになりました。
- 3DCGで立体を描画できるので物をイメージしやすくなった
- 曲線を直接扱えるようになって、自由な形が作れるようになった。
などです。 最近の3Dモデラーなども目的は同じではありますが、数値から離れて直感的に物を扱えるようになっています。
自由度を広げるという方向にはまた別のアプローチとして、例えば二次関数や表されるグラフのように数式で表される線や、特定のアルゴリズムによって定義される点や線の集まりで図を作るという方向性に行ったものもあります。
パラメータを含んだ式を使って図面を表すことで、複雑な形でも簡潔に表すことができる可能性があったり、また、そのパラメータを変更するだけで、大きさや比率の違うものが簡単に作れたりするわけです。
ようするに、部品があって、それに対する操作があって、列挙したり、繰り返しや条件分岐などで制御したりなどして、目的のものを作っていくわけです。 そして、変数が使えることによって、各属性をパラメータにする(パラメタライズ)ことができるので、カスタマイズが楽にできるということになります。
SCADの言語というか表現方法は、ちょっと独特で、そこそこ長いプログラミング経験がある僕としても始めて見る感じの書き方で、かといって使いやすかったり、読みやすかったりするわけでもなさそうです。
そんなわけで、しばらく前に目にしてはいたものの、手は出していませんでした。
最近、久し振りに図面を引くことになり、フリーのCADの状況を調べていたときに再発見しました。 記述方法そのものも以前のより進化しているようですが、なんと、ClojureでDSLを作った人がいるようなのです。
ということで、ちょっと調べてみることにしました。
http://adereth.github.io/blog/2014/04/09/3d-printing-with-clojure/
筆者がこんなこと書いてます。うん、そのとおりですね。
そして、そんな場合にこそDSLを作ることに意義があるのでしょう。
奇妙な関数の書式
関数名の後のカッコ内のパラメータに付いている記述やブロックの書式
ソースコード上に変数の経路を複数作ることができ、また、変数の値の変更が予期せず変更以前の場所にも波及したりする。
うんうん。 よさそうですよ。
scad-cljを使ってとりあえず何か作ってみましょう。
https://github.com/farrellm/scad-clj
なんともシンプルですね。docディレクトリがあって、中に「intro.md」なるファイルがあるので期待して空けてみると。
ともあれ、leiningenでプロジェクトを作成してscad-cljを関連づけます。
:dependencies の ベクターに [scad-clj "0.5.2"] を追加して、lein deps を実施します。
関連パッケージを含めていくつかのパッケージがローカルに転送され、準備OKです。
さて、どこかにあるはずのサンプルを探します。ネットを探しまわるのもありですが、まずは、ソースからです。
testディレクトリがあるのでまずはそこ。テストが書いてあれば、それぞれの関数がどのような入力に対してどのような出力をするのかよくわかるはずです。
が、これも空でした。残念。
となればソースを見るしかなさそうです。
geometry.clj には、 line と lines という関数があります。その通り、線を引く関数のようです。
text.clj には、文字列を生成する text-partsという関数が定義されています。
model.clj には、$f や $fa など、scadで特殊な意味のある変数や、import や use などの指示子、あとは、square や sphere などの基本的な2Dと3Dのパーツが定義されています。
そして、scad.cljには、write-expr というメソッドが定義されていて、たぶん、これが、レンダラーですね。
と、ここまで見てきても、全くイメージが掴めません。
まあ、結局最初のサイトですね。scad-clj を知るきっかけになったサイト
とりあえず、書いてあることをやってみましょう。
立方体(cube)と球(sphere)と円柱(cylinder)を合成(union)したものがprimitiveとしてできあがるはずなんですが、これ、どうしたらいいんでしょう?
write-scad という関数でこのprimitiveを出力できる形にできるようなので、REPLを起動して実行してみます。 ファイル名はとりあえず、 test01.scad とでもしておきます。 できたファイルをscadで開いてみます。
表示されましたねー。
さらにこのscad、開いているファイルが変更されると自動的に読み込むようになっているので、primitiveを変えて関数を呼ぶだけで、scadの中の図形が自動で変更されます。
ということで、scadの画面を開きながら、REPLでいろいろ試行錯誤しながらあれこれ形を作ることができるということのようです。
なかなか面白そうですよ。
こんな風に、Clojureの制御構文も使うことができます。
ということで、これでちょっと変った物をと思ったのですが、面白そうなものを思いつかず、時間も無くなってしまったので、将来の自分への宿題ということで・・・
READ MORE
CAD
Computer Aided Design ということは、コンピューターを使ってデザインをするためのツールですが、基本的には「製図」をするためのツールです。学生時代に製図をしたことが無いとなんのことかわからないかもしれませんが、機械や建造物などの設計図を書くことを製図といいます。もともと紙とペン・定規・コンパスなどの道具で点や線を書くので、手書きのころは立体物でも2次元の図面だけ作っていました。僕も実は機械工学科だったので、「図学」とか言ってちゃんとした製図の方法を習ったりしたものです。
コンピュータを使うようになると、自由度が広がってこれまでできなかったようなことができるようになりました。
- 3DCGで立体を描画できるので物をイメージしやすくなった
- 曲線を直接扱えるようになって、自由な形が作れるようになった。
などです。 最近の3Dモデラーなども目的は同じではありますが、数値から離れて直感的に物を扱えるようになっています。
自由度を広げるという方向にはまた別のアプローチとして、例えば二次関数や表されるグラフのように数式で表される線や、特定のアルゴリズムによって定義される点や線の集まりで図を作るという方向性に行ったものもあります。
パラメータを含んだ式を使って図面を表すことで、複雑な形でも簡潔に表すことができる可能性があったり、また、そのパラメータを変更するだけで、大きさや比率の違うものが簡単に作れたりするわけです。
OpenSCAD
OpenSCADは、ものの形状を式で表しやすい形状の集まりとして扱うことに特化したCADの一つです。ようするに、部品があって、それに対する操作があって、列挙したり、繰り返しや条件分岐などで制御したりなどして、目的のものを作っていくわけです。 そして、変数が使えることによって、各属性をパラメータにする(パラメタライズ)ことができるので、カスタマイズが楽にできるということになります。
ClojureでSCAD
LispでCADといえばAutoCADですね。使ったこと無いのですが、製図の図面に現れるオブジェクトとそれに対する操作を簡潔に表現する方法として、Lispが優れているということの証なのだろうと思ってるのですが、SCADの記述は残念ながらLispではありません。SCADの言語というか表現方法は、ちょっと独特で、そこそこ長いプログラミング経験がある僕としても始めて見る感じの書き方で、かといって使いやすかったり、読みやすかったりするわけでもなさそうです。
そんなわけで、しばらく前に目にしてはいたものの、手は出していませんでした。
最近、久し振りに図面を引くことになり、フリーのCADの状況を調べていたときに再発見しました。 記述方法そのものも以前のより進化しているようですが、なんと、ClojureでDSLを作った人がいるようなのです。
ということで、ちょっと調べてみることにしました。
scad-clj
scad-cljに出会ったのがこのサイトです。http://adereth.github.io/blog/2014/04/09/3d-printing-with-clojure/
筆者がこんなこと書いてます。うん、そのとおりですね。
そして、そんな場合にこそDSLを作ることに意義があるのでしょう。
- Strange function application syntax (parameters in parens after the function name with an expression or block following the closing paren)
奇妙な関数の書式
関数名の後のカッコ内のパラメータに付いている記述やブロックの書式
- Unclear variable binding rules (multiple passes are made over the code and the results of changing a variable may affect things earlier in the code unexpectedly)不明確な変数の束縛ルール
ソースコード上に変数の経路を複数作ることができ、また、変数の値の変更が予期せず変更以前の場所にも波及したりする。
- No package/namespace managementネームスペースが無い
- Multiple looping constructs that depend on what you are going to do with the results, not on how you want to loopいくつかあるループ構文は、どのようにループさせたいかではなく、結果をどのように使うかによって選ばなくてはならない
うんうん。 よさそうですよ。
scad-cljを使ってとりあえず何か作ってみましょう。
scadのセットアップ
本家のGithubはここです。https://github.com/farrellm/scad-clj
なんともシンプルですね。docディレクトリがあって、中に「intro.md」なるファイルがあるので期待して空けてみると。
TODO: write great documentationうーん残念。ドキュメントが無いようですから、使うには自力でソースなどを見てみるしかなさそうです。
ともあれ、leiningenでプロジェクトを作成してscad-cljを関連づけます。
:dependencies の ベクターに [scad-clj "0.5.2"] を追加して、lein deps を実施します。
関連パッケージを含めていくつかのパッケージがローカルに転送され、準備OKです。
さて、どこかにあるはずのサンプルを探します。ネットを探しまわるのもありですが、まずは、ソースからです。
testディレクトリがあるのでまずはそこ。テストが書いてあれば、それぞれの関数がどのような入力に対してどのような出力をするのかよくわかるはずです。
が、これも空でした。残念。
となればソースを見るしかなさそうです。
geometry.clj には、 line と lines という関数があります。その通り、線を引く関数のようです。
text.clj には、文字列を生成する text-partsという関数が定義されています。
model.clj には、$f や $fa など、scadで特殊な意味のある変数や、import や use などの指示子、あとは、square や sphere などの基本的な2Dと3Dのパーツが定義されています。
そして、scad.cljには、write-expr というメソッドが定義されていて、たぶん、これが、レンダラーですね。
と、ここまで見てきても、全くイメージが掴めません。
まあ、結局最初のサイトですね。scad-clj を知るきっかけになったサイト
やってみよう
とりあえず、書いてあることをやってみましょう。
立方体(cube)と球(sphere)と円柱(cylinder)を合成(union)したものがprimitiveとしてできあがるはずなんですが、これ、どうしたらいいんでしょう?
write-scad という関数でこのprimitiveを出力できる形にできるようなので、REPLを起動して実行してみます。 ファイル名はとりあえず、 test01.scad とでもしておきます。 できたファイルをscadで開いてみます。
表示されましたねー。
さらにこのscad、開いているファイルが変更されると自動的に読み込むようになっているので、primitiveを変えて関数を呼ぶだけで、scadの中の図形が自動で変更されます。
ということで、scadの画面を開きながら、REPLでいろいろ試行錯誤しながらあれこれ形を作ることができるということのようです。
なかなか面白そうですよ。
こんな風に、Clojureの制御構文も使うことができます。
ということで、これでちょっと変った物をと思ったのですが、面白そうなものを思いつかず、時間も無くなってしまったので、将来の自分への宿題ということで・・・
この投稿は ErgoDox Advent Calendar 2016 の 7日目の記事です。
Ergodox作りました
最近のErgodoxの話題というと、Ergodox EZを入手したよとか、Falbatecでそろえたというような記事が多いのですが、もともとErgodoxはオープンハードなプロダクトなので、基板やケースを作って、部品を集めて、自分で組み立ててというのが本来の取り組み方なのではないかと思うのです。
なんてことを言ってハードルを上げていた僕は、Ergodoxを手に入れることなど無いだろうと思っていたのですが、ひょんなことから基板や部品を分けていただくことができたので手に入れることができたのですが、何しろ全部自分で揃えようとしたらどんなことが必要なの? 日本で揃うの? ってあたりを記事にしてみます。
Ergodoxの情報
先ずは本家の情報を入手しないとですよね。しばらく前は、ergodox.org にサイトがあったのですが、潰れてしまっておりました。
最近以下の場所で復活しています。
https://www.ergodox.io/
ここから入手できるのは。
- 部品一覧
- ファームウェアの情報
- ケースの情報
部品一覧を見ながら入手方法を考えてみましょう。
基板1組(1x Pair of pcbs (one for each hand))
左右対象のセパレート型のキーボードであるErgodoxですが、その基板は、表裏を使って左右を作り分けるようになっています。 要するに、同じのを2枚用意すればよいのです。
手に入れる方法はいくつかあって、
- 自作はハードルが高いので買う
日本のサイトで見たことはありませんが、海外のサイトにはErgodoxの基板を打っているところがあります。
・ Falbatech ここはフルセット揃うのであたりまえですが、基板だけでも入手可能ですね。
・ MechanicalKeyboards.com メカニカルキーボード関連の情報/物を扱っているサイトです。
・ その他 プリント基板は英語で PCB(printed circuit board) と言うので、「ergodox pcb」などのキーワードで検索すると他にもいくつか出てきます。 安いところだとセットで1000円くらい?リスクと計りに掛けて選択ください。 - だれかが作ったものを入手
僕のはこれでしたけど、まあ、そんな目に遭うことはなかなか無いかもですね。
そもそも日本でメカニカルキーボードの話ができるのって、2chぐらいしか知らない。 あとは、ツイッター? - 自分で作る
最近は、データを用意すれば比較的少ない枚数でも基板を作ってくれるサービスを利用することができるので、そういうサービスを利用して自分で作ることもできます。
そして、自分で作るのであれば改造することもできますね。実際、僕が入手した基板は改造されていて、小指側の1.5xキーが 1xキー2つになっています。
Ergodoxのオリジナルの基板のデータはergodox.orgから行けますが、githubにあります。
https://github.com/bishboria/ErgoDox
このデータは、フリーソフトのKiCadという基板のデータを作るためのCADで作られています。
http://kicad.jp/?page_id=2
データとそれを操作するソフトが手に入るのですから、さあ、どんどん改造しましょう。
改造したら、あとは発注です。たとえばこんなところ
https://www.seeedstudio.com/fusion_pcb.htmlhttp://www.pcbgogo.jp/
さて、これで好きなようにキーの物理配置をいじることができますね!
Teensy 2.0 マイコンボード 1つ(1x Teensy USB Board, Version 2.0)
キーボードのコントローラには、Atmega32U4が載ったTeensy 2.0というマイコンボードが使われています。写真の白いUSBケーブルがささっているやつです。
https://www.pjrc.com/teensy/
Atmega32U4というチップはUSBのインターフェースを供えていて、また、Teensy 2.0は専用のブートローダが書き込まれていて、専用の書き込みソフトを使ってUSB経由で中身を書き換えられるようになっています。特別な装置が無くても書き換えができるので、手軽に開発ができます。
ただ、このTeensy 2.0というボードは日本で取り扱っているところが無くちょっと入手が難しいところが難点です。
基板を改造して、他のAtmega32U4ボードを使うようにしてしまうってのはありだと思いますね。ちょっと調べただけでいくつかみつかります。
Da Vinci
Arduinoファームが載ったものと、Atmeg32U4オリジナルのブートローダが載ったものがあります。
全ピン出ていて値段も安く、入手性もいいのですが、オリジナルよりかなり大きいです。
ATmega32U4搭載マイコンボード
サイズは小さめですが、全ピンは出ていないかも。
Pro Micro
海外のものですが、前のボードのスイッチサイエンスなど日本の業者が扱っていてそこから入手できます。
Arduino Micro
お高いですが、安心感はありますよね。
サイズは大きいです。
DaVinciを使うように基板を改変してみるのもいいかもと、今思った。
IOエキスパンダー MCP23018-E/SP 1つ(1x MCP23018-E/SP I/O expander)
左右分離という形状はErgodoxの大きな特徴の一つです。この実現方法として、左右それぞれを独立したキーボードとしてしまうという手があって、たとえばInfinity Ergodoxなどはその方式を取っています(いるはず)。
オリジナルのErgodoxは、右手側にTeensyを載せてマスターとして左手側には簡単なICの載ったスレーブとするという構成になっています。
左手側に載っているのは、IOエキスパンダーというICで、TeensyとはI2C接続なので、たった2本の信号線で16本入出力をコントロールできます。
このあたりの電子部品は、日本でも老舗のお店があったりして、最近なら通販もやっていてそこにあれば入手は比較的容易です。
昔から電気・電子工作とか好きだったので、秋葉原のパーツやさんは知っていて、実店舗でお世話になっているのは、秋月電子さんとかマルツさんとか千石さんとかですね。 通販もやってます。
海外の図面を使う場合、同等パーツだとフットプリントが違ってだめなので同じパーツが必要になりますが、下のところも探すとあったりします。
https://www.digikey.jp/
http://jp.rs-online.com/web/
最悪海外で発注ですけど、100円のパーツの送料が2000円とか笑えないとこになったりします。
チェリー MXスイッチ 76〜80個(76-80x Cherry MX switches, (depending on your layout))
しばらくく前まで、ほぼ唯一のキーボード用メカニカルスイッチのメーカだったのがチェリー(現ZFエレクトロニクス)ですが、特許が切れていくつかの中国のメーカーが互換のスイッチを製造しています。Gateron, Kailh, Outemu, Greentech あたりが有名です。
チェリーのものがそうだったように、押下に必要な力が違っていたりクリック感があったりなど、いろいろな仕様のものがあり、また、最近はメーカによる違いなどもあり、選択肢はかなり広くなっています。
僕は、Gateronという中国のメーカーの茶軸と呼ばれるスイッチを入手しました。
https://www.jw-shop.com/
海外だと、ちょっと検索するだけでいくつかみつかりますね
https://mechanicalkeyboards.com/
https://1upkeyboards.com/
僕が入手したのはMassdrop
http://www.massdrop.com
マスドロップって何?って人は検索してみてください。 共同購入サイトみたいなものです。
WM17115 USB ミニB コネクタ (1x USB mini B connector WM17115)
基盤用のUSB ミニB用のコネクタ。 WM17115というのは、Digikeyの型番で、たぶん、モレックスの54819-0519と同じもの。 これなら日本でもみつかる。3.5mm 4極(TRRS)プラグソケット (2x 3.5 mm TRRS sockets, CP-43514. FC68129 will also work if its extra pins are snipped off)
あまりみかけない、4極の3.5mmソケットです。 右と左は4線で接続するI2C通信でつなぐのですが、これを接続するためのものです。
以下のパーツは秋月とかマルツとかで入手可能
Teensy用 ヘッダーピン (24x Teensy header pins, male (unless pre-installed))1N4148 もしくは DO-35ダイオード 76〜80個 (76-80x 1N4148 diodes, SOD-123 package (Surface mount) or DO-35,(0.3” pitch) (through hole))
2.2KΩ 抵抗 2つ (2x 2.2k Ω resistors (red, red, red))
3mm T1 LED 3つ (3x 3mm T1 LEDs)
220Ω 抵抗 3つ (3x 220 Ω resistors, or match to LED. (red, red, brown))
0.1µF セラミックコンデンサ (1x 0.1 µF ceramic capacitor (marked “104” for 10*104 picofarad). Not strictly necessary but suggested)
USBミニBプラグ (1x USB mini B plug with short cable (such as H2955))
分解して中身だけ使うのでなんでもOKですかね。
USBケーブル オスA-オスミニB (1x USB cable male A to male mini B)
キーボードとPCの接続用
3.5mm 4極(TRRS)プラグ (1x Cable with two 3.5 mm TRRS plugs)
でも、4極のソケットがDigikeyにしか無いので、全部Digikeyで揃えるってことになるかも。
ケース (1x Ergodox Keyboard case)
ケースの図面も2種類入手可能で、1つは、3Dプリンタで出力するもの。かなりすっきりした外観のケースが作れます。 もう1つは、アクリルなどの板をカットして積み上げて作るものです。
僕のは基板が改造されていることもあり、自分で図面を加工してアクリル板で作りました。
加工については、図面さえ用意できれば、加工を頼むことができる所をみつけるのはそれほど難しくありません。また、最近は、DMM.MAKEなどの加工機械や場所を提供してくれるサービースが利用できたりして、レーザーカットや3Dプリンタの出力を自分でやることもできるようになっています。
いずれにしても、かなりコストかかりますけどね。
僕は知り合いにレーザー加工している人がいるので頼んで作ってもらいました。
板をカットしてつくる方法で、MDF材などを使えば手で加工することもできなくはないし、とても安くできますね。
キーキャップ (76-80x MX Keycaps)
意外なことに、多分、この、キーキャップを入手するのが一番大変で、場合によってはコストの半分以上がこのキーキャップのため、というようなことにもなります。まあ、直接指が触る部分でもあり、一番目に付くわけですから、こだわるのも悪くないでしょう。
日本で入手できるキーキャップとしては、ダイヤテックのやつがあります。
ところが、これを入手しても、Ergodoxの一部のキーは合うものが含まれていません。
特に、
- 両小指のところのちょっと大きいやつ
- 人差し指のところのちょっと大きいやつ
- 親指のところの 大きいやつ
がそうなります。
これを単体で入手するとなると、もう、日本ではだめで、
Pimp My Keyboard の DSA PBT/ABS のErgodoxモディファイアーセット
か、
WASDキーボードでバラのキーを必要数だけ入手する
のいずれかになるでしょう。
となれば、もう、全部そこで揃えたほうがいいですね。
自分はというと、ジャンクなメカニカルキーボードを倉庫からみつけてきて、そこから外したキーキャップを使っています。基板が改造されているおかげで、小指のところのキーが標準サイズなので、致命的に足りないキーというのは人差し指のところの2つだけです。
あ、僕はDvorak配列使いなので、配列はもうめちゃくちゃです。
とまあ、こんな感じで、部品を集めたり作ったりするのもなかなか大変なわけですが、そういう苦労もまあ、楽しみの一つなわけです。
おまけ Massdrop
Massdropというのは、海外の共同購入サイトです。とあるものについて、xx人集ればxx円で入手できますよー、みたいなことをやっていて、参加者を募るわけです。Ergodox EZやInfinity Ergodoxもここに何度もDropされています。
また、キースイッチや、キーキャップもしばしばDropされています。
12/7現在でもこんなキーキャップがDropされています。
https://www.massdrop.com/buy/max-keyboard-keycap-set
過去にあったやつについては、投票が行なわれていて、どんなのがあったのか見てみることができます。
https://www.massdrop.com/vote/Ergodox-Keycaps
再登場するかどうかはわかりませんが、興味があればWatchしておくといいですね。
Cherryのスイッチもあります。
https://www.massdrop.com/vote/Cherry-MX-Keyswitches-110-Pack-Plate-Mount
僕のキースイッチはここで入手しました。
https://www.massdrop.com/buy/gateron-switches