6-Axis Box Rig

東京都写真美術館での公開制作で、フライス盤で削っている途中のブロックを1コマずつ撮るための撮影装置です。1800mm四方ほどの箱の中にカメラを吊り下げて、位置3軸と回転3軸を動かします。箱の中央にはフライス盤が置いてあって、カメラはそのまわりを動きます。四方の壁にはLEDが貼ってあって、照明もコマごとに変えられます。

会期中は展示室に置いたまま動かすので、この装置自体も展示物のひとつです。

2024年の夏ごろから少しずつ考えはじめたもので、構造の考え方はそのころからあまり変わっていません。設計は右左見拓人さんにも相談しています。

オープンソース化について

設計は最終的にオープンソースで公開するつもりです。ライセンスは MIT のような寛容なものを考えています。CAD データ(ネイティブ形式と STEP)、部品表(入手先と型番)、自作基板のデータ、配線図、ファームウェアの設定、組み立て手順までをひとまとめにして出す予定で、このページはその下書きも兼ねています。

展示室で動いている装置は、その設計データから組んだもののひとつ、という位置づけです。部品が手に入らなくなっても、設計が残っていれば別の部品で組み直せます。

撮影ソフトの Koma もオープンソースですが、こちらはコピーレフト型のライセンスを考えていて、リグの設計とは別に扱います。

全体の構成

  • 箱:外形およそ1800mm四方。V-Slot 2040 × 1500mm を骨組みに使う
  • 位置の3軸:上から見て「H」の字。奥行き方向に2本のレール、そのあいだを1500mmの X が渡り、X のキャリッジから縦の軸が下に吊り下がる
  • 回転の3軸:縦の軸の先に、一般的な3軸ジンバルを上下逆さにしたものが付く
  • カメラ:Sigma fp + Sigma 105mm マクロ
  • 中央:フライス盤(オリジナルマインド KitMill AST200、協賛で貸与)
  • 壁:WS2815 のLEDテープを4面に

座標系

Houdini と同じ Y-up の右手系。縦が Y、1500mmの橋の方向が X、奥行きが Z。

最初はCNCの慣習どおり Z-up で組むつもりだった。ただ、このリグに流すGコードは自分で生成するもので、CAMの慣習に縛られる理由がない。カメラの経路を Houdini から変換なしで流せるほうを取った。FluidNC にとって軸の文字はただのラベルなので、困ることはほぼない。

回転軸の名前もこれに合わせて、X まわりのチルトが A、Y まわりのパンが B、Z まわりのロールが C。Houdini のカメラは −Z を向いているので、ロールが C になるのも合っている。

フライス盤も同じ座標系に揃えた。本体を時計回りに90°回して置き、元の Y が X、元の Z が Y、元の X が Z になるように配線とGrblの設定を振り直している。フライス盤の正面は箱の L 面(X−)を向く。

右手系を崩すと、パンやチルトが鏡に映したように逆回りに出る。物理的なレールの向きが合わないところは direction_pin の反転で合わせる。

軸と駆動

マイクロステップは全軸 1/8(1600 steps/rev)。細かくするより、速度とトルクの余裕を取った。

軸役割機構steps
X横(1500mmの橋)NEMA23 ×2(X1/X2 でスクエアリング)、GT2 30T プーリー、ループにした GT2 ベルトでガントリーを引く26.667 /mm
Y縦(吊り下げ)SFU1204 ボールねじ(φ12、リード4、L=1200mm、BK/BF12 の標準軸端)。上でホーミングし、可動域は負の方向400 /mm
Z奥行きGT2 20T、V-Slot の片側に沿わせたベルト(ループではない)、モーターがガントリーに乗る40 /mm
A / B / Cチルト / パン / ロールモーター側 18T → 96T(比 5.333)、単位は度23.704 /°
  • モーター:X は Usongshine 23HS5628(NEMA23、1.26N·m、2.8A/相)。回転軸などは NEMA17
  • 縦の軸は自重で落ちないよう、非励磁ブレーキ付きの STEPPERONLINE 17HS19-2004D-B025(24V)を選定。ブレーキは stepper enable で制御し、idle_ms: 255 で保持
  • 縦の軸のドライバだけ TMC2209(standalone の StepStick モード、設定は変えず 1/8)。ほかは TMC2208
  • 回転軸は連続回転があり得るので hard_limits: false。ホーミングは光学スロットセンサ(Omron EE-SX671 など)
  • 回転軸:max rate 720°/min、加速度 50°/s²、ホーミングのシーク 360°/min、pulloff 5°

吊り下げた縦の軸は剛性が低く、動いたあとしばらく揺れる。加速度はかなり低め(とくに X)にして、撮影は揺れが収まるのを待ってから。コマ撮りは1コマずつ止まるので、ここは時間で解決できる。

縦の軸の経緯

縦の軸はいちばん迷ったところ。

  • 最初は手持ちのミスミ C-BSSTAK2005-1400(φ20、リード5、L=1400mm、ハウジング・サポートユニット・NEMA23 モーターマウント込み)で、ストローク1250mmを取るつもりだった。買い足しゼロで済む
  • ただ、縦の軸ユニットまるごとが X のキャリッジに片持ちで乗るので、重いと X の橋のたわみとねじれがきつくなる。V-Slot は断面が開いていてねじれに弱い
  • 1500mmのボールねじ(BSBR2505-1500 で約6.5kg)と、φ15 × 1200mm(約1.9kg)を比べて、ストロークを1100mmくらいまで削っても軽いほうを取った
  • 台形ねじ(ミスミ MTSRL16-1500)もセルフロックでブレーキ不要という利点があったが、リード3だと遅すぎるので見送り
  • 最終的に SFU1204(L=1200mm)。ストロークはおよそ1100mm

回転軸(ジンバル)

一般的な3軸ジンバルを逆さに吊った形。いちばん外側がパン(Y まわり)、そこから L 字のアームが下りてロール(Z まわり)、その先の2本のアームのあいだにチルト(X まわり)のカメラマウントを挟む。

  • ギア:PLA-CF で印刷したヘリンボーンギア(モジュール1.25、リングギアのPCD 200mm)
  • ベアリング:6810Z(φ50/φ65/7mm)を1軸2個。内輪・外輪のスペーサーは金属にする(印刷品だと予圧でクリープする)
  • 構造部品は PETG より PLA-CF。曲げ弾性率が2〜3倍で、クリープにも強い。ノズルは焼入れ鋼かルビー
  • 剛性を上げるなら、まずカウンターバランス

3ヶ月半のあいだ動かし続けるので、精度そのものより、同じ場所に戻ってこられるかのほうが大事。1軸あたり 0.0015° くらいの繰り返し精度を目安にして、パーク姿勢での参照ショットと基準マーカーで、ずれを後から見つけられるようにする。

フレームとガントリープレート

  • V-Slot 2040 × 1500mm(AliExpress で購入済み)
  • ガントリープレートは Meviy の A5052 + 黒アルマイトで見積もったら、アルマイトの固定費で SUS304 より高くなった。PETG-CF で印刷する案を検討中(厚さ8mm、Gyroid 60% 以上、ホイールのボルト穴には金属スリーブを入れてクリープを防ぐ)

制御

  • コントローラ:PiBot FluidNC ESP32 GRBL CNC Controller V4.96 Pro。最初に使っていた V5.88 Ultra はリミット端子まわりの短絡で壊れた
  • FluidNC(v3.9.9)。grblHAL は web builder が4軸までなので使えない
  • stepping engine は I2S_STREAM。この場合 step ピンはすべて I2SO でないといけない
  • 設定ファイルは boxrig.yaml

モーターは X1・X2・Y・Z・A・B・C の7個に対して、PiBot のスロットは6つ。工場設定のスロットを振り直して、X1/X2 で X のスクエアリング、残りを Y〜B に割り当て、7個目の C は空いているソケットの MS3 用の I2SO 線(STEP i2so.19 / DIR i2so.22 / EN i2so.14)から出している。

配線の系統

(図:boxrig-wiring.png — 4面のLEDライン L1/L2・B1/B2・R1/R2・F1/F2、X1/X2 と YZABC へのイーサネット5本、Mac Studio への USB、下辺の分電盤)

  • X1 は L 面寄りの下、X2 は R 面寄りの下。X2 の駆動基板は X2 のそばに置く
  • Y・Z・A・B・C の5本は LAN ケーブルで束ねて、ガントリーの上を通して Y のキャリッジまで引く。そこから Y と Z の駆動基板へ分岐し、さらに下がって A・B・C の3枚へ
  • 24V のモーター電源も同じ経路で、Y のキャリッジで WAGO で分岐
  • カメラの USB は別経路で Mac Studio へ

自作基板

  • cnctmc-breakout:PiBot からモーターごとに RJ45 で配る分配基板。1モーター1ポートで、pin 1 = Vio、2–4 = モーター信号、5–7 = GND、8 = LIM。C チャンネルの STEP/DIR/EN は SN74HCT125N でバッファ。Vio は PiBot の 5V → ポリスイッチ → 100µF
  • cnctmc-mounter:モーター1個ぶんのドライバ基板(v2.1)。LIM1_HALL はホールICか N.C. スイッチ用で、ENABLE_HALL のはんだブリッジを閉じないと G が GND に落ちない
  • X1 だけ PiBot のオンボードソケット直結、X2 以降は breakout → mounter

リミットとホーミング

  • X は + 方向にホーミング(mpos_mm: 1000)。X1 は両端の N.C. スイッチを直列、X2 は + 端のみ。どちらも limit_pos_pin
  • ほかの軸の N.C. スイッチは limit_all_pin。極性は配線してから Pn: を見て1本ずつ決める
  • どれかの軸のリミットが入ったままだと FluidNC はホーミングを始めない(ALARM:12)。まだ配線していない軸は NO_PIN にしておく

FluidNC でつまずいたこと

  • YAML の値のあとに行内コメントを書くと弾かれる(行頭の # はOK)
  • 工場設定の i2so: セクションを消すと起動時にパニックする
  • 何もつないでいないリミット入力は浮いているので、スイッチをつなぐ前の Pn: は当てにならない
  • シリアルの XModem で config を送ると、ランダムに文字が化けて変なパースエラーになる。WebUI のファイルマネージャーで上げて、読み戻してから再起動する
  • TMC2208 を mounter に逆挿ししたら、breakout のポリスイッチ(0.5A)が飛んだまま抵抗が戻らなくなり、さらに SN74HCT125N も壊れた。ポリスイッチは 1.1A ホールドに交換、逆挿ししたドライバは捨てる

電源


(図:boxrig-power.png — 100V/AC → 3系統のDC電源 → 12V と 24V の端子台 → 各負荷。太線 16AWG、細線 18AWG)

  • インレットは1つ(ヒューズ・スイッチ付き C14)→ L/N/E の DIN 端子台 → 3つの電源へ
    • 12V/600W(LED の L・B・R 面)
    • 12V/300W(LED の F 面)
    • 24V/240W(モーター)
  • 12V の V− は ESP32 の GND も含めて1つの端子台にまとめる。600W と 300W の V+ は別の端子台
  • 24V は PiBot(X1)、X2、YZABC の幹線の3本に分ける。幹線は 1.25sq で最長5m
  • 電源 → 端子台は 12AWG、端子台 → 各負荷は 16AWG(幹線)と 18AWG
  • モーター信号:ミスミ NWTC6A2-UTP-S(Cat6A、AWG28 より線、φ3.8mm)
  • 同時に動くのは、ふだんは NEMA23 ×2 + NEMA17 ×2 くらい

LED

箱の4面の壁に WS2815(DC12V、黒基板、30 LEDs/m、RGB)を貼っている。


(図:boxrig-led-layout.png — 4面の展開図。テープの折り返しと、面ごとの2ラインの入口。R 面にはフライス盤の配線を通す穴をあける)

  • 1面あたり、テープを 100mm 間隔でジグザグに。1ラインで面の半分を受け持ち、各面2ライン(L1/L2、B1/B2、R1/R2、F1/F2)。折り返しは上下に交互
  • パネルは 150mm 幅 ×14 枚と 80mm 幅 ×8 枚の組み合わせ。縁は 14.5mm かぶせ
  • R 面のライン2本目(R2)は左上から始める。R 面にはフライス盤の配線を通す穴が要る
  • 自作基板 ws-uturn:テープの折り返しと12Vの注入用
  • 自作基板 ws-fanout:ESP32(NodeMCU ESP-32S)から8ラインを出す。レベル変換は SN74HCT32N、330Ω 直列
  • ESP32 と LED の12V電源は GND を共通にする
  • 実測:半面ぶん(420灯)を全点灯して、幹線の入口で 4A。1灯あたり 9.5mA くらいで、データシートの 17mA よりだいぶ少ない
  • ファームウェアは PlatformIO+FastLED(RMT 8ch)。PCからは WebSerial で、独自のバイナリプロトコル(部分更新・ラッチして ACK・塗りつぶしなど)を 921600bps で送る。全画面で 9〜10fps くらいで、コマ撮りには足りる

照明はコマごとに、4面を展開した1枚の画像として記録する。各LEDの位置の色を補間で拾うので、ブロックの高さを LED のピッチの整数倍に合わせる必要はない。いつでも同じ照明を再現できるように、カメラの露出と同じ扱いで全LEDの状態を残す。

フライス盤との関係

  • フライス盤のコントローラは LY-3axis-5.2-V3.4(GD32F303、Grbl 1.1f 互換)。Box Rig とは別の基板で、設定は $ の値で書く
  • 1コマぶんの切削Gコードは、Houdini から書き出した STL をもとに Fusion 360 の CAM API で自動生成する。出てきたGコードは手で直さない
  • 切削が終わってスピンドルが退避したら、フライス盤のテーブルがブロックを本体から離れる向きに押し出して、そこを撮る
  • ブロックの高さは 60mm か 66.6mm で迷っている。フライス盤が削れる高さは100mmなので、上のブロックが20mmを切ったら次のブロックを載せ、それまでのコマを撮り直してから、残りを接着して続ける

ソフトウェア

撮影は自作のコマ撮りアプリ Koma の addsub ブランチ(GitHub)。1コマの流れは、切削 → 集塵 → スピンドル停止の確認 → Box Rig をそのコマの姿勢へ → LED をそのコマの状態に → 撮影 → 必要ならパーク姿勢で参照ショット。どれも前のステップの完了(FluidNC の Idle、LED の ACK、撮影完了)を確かめてから次に進む。

まだ決まっていないこと

  • ガントリープレートの材質(PETG-CF の印刷か、金属か)
  • ブロックの高さ(60mm か 66.6mm)
  • LED を同時に何灯点けるか。電源と発熱の見積もりがこれで決まる
  • LED を貼るパネル(アルミ複合板に傾いている)
  • 公開する設計データの形式と置き場所(リポジトリの構成、CAD の形式、ライセンスの細部)

2024年のメモ

考えはじめたころのスケッチと、買ったもの。

前方は開閉可能。

構造の参考にしたのは OpenBuilds の IDEX ビルド。

openbuilds.com openbuilds.com

右左見拓人さんと色々相談。

届いた。