3dプリンタつくりました

さて、3dプリンタつくる宣言*1 してから早1.5ヶ月が経ち、ようやく「これは3dだ!」という感じの物体が印刷できるようになったので報告します。


(モデルはThingiverse*23D Knot)

・・・うーん。やけに凸凹してますが紛れもなく結び目に見えますね!

以下ではとりあえずプリンタ本体、この印刷物、今後の方針について、とつらつら書いていこうかと思います。

本体


さて設計のかなりの部分についてはGoogle Docsで公開している*3ので、あらましだけ書きます。基本的に今回の設計の方針は手持ちの部品を有効活用するということなので一万円かかってませんが、再現しようとすると5万円越えると思います。3dプリンタが欲しい人は素直にreprap系のキットや完成品を買うのが得策でしょう。


これが全体の概要図です。STLモデルビューア+Gコード生成するページを書いておいて、それで生成したGコードをSDカード経由でプリンタに移して使うというのが通常使用時の使い方になっています。プリンタ側はUIの提供とスレーブの管理をするボード、そして各軸について図のような配分のスレーブが三つで計四枚のボードからなります。

構造

アルミフレーム*4を使ってます。これはたまたま余ってたのですがかなり頑丈です。これのおかげで軸がgdgdでもなんとか動いていると言えるでしょう。

ヘッド・ステージ駆動

二相ステッピングモータのマイクロステップ駆動(もどき)です。PWMでなくΔΣ変調しているのでスイッチ*5が遅くてもなんとかなっています。機械的には横方向がリニアブッシュ+タイミングベルト、奥行き方向がスライドレール*6+タイミングベルト、高さ方向は長ネジだけで支持と移動の両方を兼ねています*7。こういう弱い設計はCNCフライス等では考えられないことですが、ほとんど荷重がないので問題ありません。

フィラメント押出



これが積層溶融方式の要となる、樹脂フィラメントの押し出し+加熱器です。およそ240℃(ABSの場合)に維持した金属ノズルにフィラメント(今回は直径1.75mm)を押しこむことで先から細いひも状になって出てきます。・・・と書くと簡単なのですが、これは結構力のいる工程で、充分な力を確保するのはなかなか面倒なことです。この写真の構造に落ち着くまでにヒータは三回、押出部分は六回ぐらい作りなおしてます。

制御

マスターはSTBee mini(CortexM3ボード)、スレーブは全てATmega88Pを使って上記の処理を行なっています。スレーブに関しては特に書くことはないですが、マスターについて。ARMはツールチェインを用意して、コンパイル+書き込みできるまでが大変と思われがちで、エラーをにらみつつ謎のMakefileと格闘したりすることもある(?)ような気がしますが、今回summon-arm-toolchainとSConsを使うと

import os

# common code
env=Environment(
    AS="arm-none-eabi-as",
    CC="arm-none-eabi-gcc",
    LINK="arm-none-eabi-ld",
    CCFLAGS="-mcpu=cortex-m3 -mthumb -std=gnu89 -Wall -O2",
    # --start-group automatically resolves circular dependency
    LINKFLAGS="-T stm32f10x_hd_flash_offset.ld --start-group", 
    CPPPATH=["#.","#vcom","#fat",
             "#./lib/STM32F10x_StdPeriph_Driver/inc",
             "#./lib/STM32_USB-FS-Device_Driver/inc",
             "#./lib/CMSIS/Core/CM3"],
    ENV={'PATH':"/home/xyx/sat/bin:"+os.environ['PATH']})

env.Append(BUILDERS=
    {"Bin":Builder(action="arm-none-eabi-objcopy $SOURCE -O binary $TARGET")
    ,"Symbol":Builder(action="arm-none-eabi-nm -n $SOURCE > $TARGET")
    ,"List":Builder(action="arm-none-eabi-objdump -h -D $SOURCE > $TARGET")
    })

# children
libpath=[
    'vcom','fat',
    'lib/STM32F10x_StdPeriph_Driver',
    'lib/STM32_USB-FS-Device_Driver',
    'lib/CMSIS/Core/CM3']
SConscript(map(lambda d:'%s/SConscript'%d,libpath),'env')

# targets
env.Program("fw.elf",
    Glob("*.c")+['lib/CMSIS/Core/CM3/startup.o'],
    LIBS=['cm3','stdperiph_drv','usb_drv','vcom','fat','c'],
    LIBPATH=libpath+['/home/xyx/sat/arm-none-eabi/lib/thumb'])
env.Bin("fw.bin","fw.elf")
env.Symbol("fw.symbol","fw.elf")
env.List("fw.list","fw.elf")

(トップレベルのSConstructのみ、数行のSConscriptがいくつか必要)
とかなり簡潔に書けたのでこれは結構お勧めです。ARM安いですし。

データ生成

データ生成について。STLをFileで読み込んでwebgl-experimentalと2dのcanvasに表示、Gコードは三角形を適当にスライス+ラスターにしたあともにょもにょっと生成して、data URLでダウンロードするというシンプルな(?)構成です。HTMLひとつとCoffeeScriptいくつかでfile://で動作します*8

わざわざwebっぽい技術で固めたのは、適当なボードをプリンタ側につけてHTTPサーバとして動作させれば、完全にプラットフォーム非依存な形で(専用のUSBドライバやJavaを使うのに比べて)動かせるという目論見があったからですが、結局それはやってません。

はじめての数えきれないほどのいんさつ


左から順に、

  1. 手動での押し出し
  2. ハードコードした短いパス
  3. 〃した長いパス
  4. 任意のモデルへの対応 *9
  5. (それなりに)安定化

というプリンタの進化が見て取れます。最初はなにか出てるだけで楽しいものですがちょっと経つと「あ〜また失敗か」とぽいぽい捨てるようになるので、まぁそういうものですね。

あ、ちなみに冒頭の写真は印刷したての状態ではなく、

こういう状態のものをニッパで除去したものです。これは数分で出来ます。

今後

とりあえず動くようになった所で、これからどうしましょう、ということなのですが、とりあえずPrusa Mendelか何かをつくろうと思っています。というのも、今のこのプリンタはデータ化されてない設計も多く、部品の消耗に対応できないからです。

数年前ならいざ知らず、RepRapコミュニティがかなり大きくなった今の状況でずっと独自の設計、というのは作ってる時は楽しいのですが運用する上ではあまりメリットがありません。それでとりあえず小物をぱぱっと作れるような環境を作りたいな、と思っています。

さて、「ぱぱっと」というのはプリンタだけでできることではありません。3dモデルの作成というのは結構面倒な作業で、これをもっとてきとーな感じ、例えばなにか現物があってそれに合わせてハサミで紙を切り出すような、それと同じぐらい手軽にしたいものです。

これは環境からの3dモデル構築とか操作とか*10その辺の話題になってくるわけですが、その方面で「実際に自分が必要としているアプリケーション」を作り出すためにこのプリンタをフルスクラッチで作ったという側面もあります。既存のよくできた枠組みに完全に乗っかってしまうと、それがうまく動きすぎて外れることを恐れてしまうからです。

と格好いい感じでまとめてみましたが、まぁ気の向くままにぼちぼちやっていこうかと思います*11

*1:2011/10/10 3dプリンタ作り始めました

*2:3dものづくり系SNS。特にRepRapコミュニティではよく使われている

*3:https://docs.google.com/leaf?id=0B6zCoyeuDn-pOTNkZGY3Y2ItMzRmZS00MzU4LWJhNGQtMGYzMWZhZGRkOGNj&hl=en_US 新しい変更はあまり反映されてないけれども

*4:ユキ技研 LECOFRAME 25シリーズ

*5:TA7291

*6:家具とかに使われてる安物。リニアガイドではない。

*7:M6なのでネジの撓みが無視できないが、今のところ問題は起きていない

*8:Chromeだと--allow-file-access-from-filesが必要でしたが

*9:かっこいい感じのhttp://www.thingiverse.com/thing:12108何かを印刷しようとしたものの玉砕

*10:kinect fusion覚えてますか

*11:generative artとかそういうのもおもしろそうです