産業機械をパソコンの中でひも解く・チップマウンタ ―― 到着した、と機械は言う。まだ揺れているのに
- python
- シミュレーション
- 制御
- 信号処理
- メカトロニクス

部品を吸って、高速で運んで、基板に置く。止まったあとも、ノズルの先端が揺れているのが見えます(揺れは分かるよう300倍に誇張しています)。立体と、Xの送り、先端の揺れは計算の結果です。Yの割り出しと部品の上げ下ろしは、位置を合わせるための動きです。
部品を吸い上げて、高速で運んで、基板に置く。それを毎時何千回も繰り返す機械です。速く動かしたい。ところが速く動かすほど、止まったあとにノズルの先端が揺れ続けて、部品が斜めに着地します。
これは、ウェブを書く人ならぴんと来る壊れ方だと思います。「200 OK は返ってきた。でも画面はまだ描き終わっていない」。到着の合図を信じて次に進むと、まだ整っていない状態をつかむ。今回はそれが、ノズルの先端で起きます。モータのエンコーダは「着いた」と言うのに、本当に部品が置かれる先端は、まだ揺れている。
前回はXYステージでした。今回はチップマウンタの頭です。私はこの機械を触ったことがありません。実機も用意していません。実機の高速機は覆いのある多ヘッドの装置で、見た目はこれとはずいぶん違います。ここでは要点だけを残して、一つのヘッドの機構だけを描いています。
頭をパソコンの中に建てる
200mmの点から点への移動を、加速のしかたまでなめらかにした指令で動かします。急に加速したり止めたりしないための決めごとで、加速そのものが変化する速さ(これをジャークと呼びます)を抑えた、S字型の指令です。
ただ、ノズルの先端は、指令した位置にそのまま付いているわけではありません。腕とノズルがしなる分だけ、ばねの先のように遅れて揺れます。
速く動かすとは、加速を短い時間で立ち上げること。この急な立ち上がりには、いろいろな速さの成分が混ざって含まれます。その中に、構造が自然に揺れたがる速さ(固有振動数。ここでは45ヘルツ、周期にして22ミリ秒ほど)が入っていると、ばねのような腕がそこで揺れ出します。今回は加速を立ち上げる時間が7.5ミリ秒で、構造の周期(22ミリ秒)の三分の一ほど。この短さだと、加速の変化の中に45ヘルツの成分が含まれてしまい、移動が終わったあとも揺れが尾を引きます。この、動作が終わっても残る揺れを、残留振動と呼びます。ゆっくり動かせば加速がゆるやかになり、45ヘルツにエネルギーが乗りにくくなります。
「着いた」は、置ける、を意味しない
置いてよい範囲は、狙いから25マイクロメートルの帯です。素のまま速く動かすと、止まったあと、先端は最大で136マイクロメートルの幅で揺れ続けます。この揺れが帯に収まるまで、0.44秒かかります。
なぜエンコーダはこれに気づけないのか。エンコーダが付いているのはモータ側、つまり根元です。部品を実際に置くのは、しなる腕の先のノズル先端。根元と先端のあいだにたわみがあるので、モータがぴたりと止まっても、先端はまだ揺れていられます。エンコーダは先端がどこにいるかを見ておらず、モータがどこまで回ったかしか見ていません。だから、先端が揺れている最中でも、同じ「着いた」の信号を返します。測っている場所と、本当に効かせたい場所がずれているこの状態を、非コロケーションと呼びます。
その揺れの最中に置いてしまうと、置いた瞬間の先端のずれは76マイクロメートルでした。置いてよい帯(25マイクロメートル)を大きく超えています。
部品が片側に寄って着地すると、あとの加熱で、はんだの多い側が先に強く濡れて、部品を引き起こします。片端で立ってしまう。これを墓石立ち、トゥームストーンと呼びます(はんだを溶かすこの加熱工程をリフローと呼びます)。

モータのエンコーダが「着いた」と言う瞬間も、実際に部品を置くノズル先端は、許容の帯(±25マイクロメートル)の外で76マイクロメートル揺れています。素のままだと、帯に収まるのは0.44秒後です。
ソフトで言えば、イージング(S字の加減速)をかけていないアニメーションが、目標を通り越して揺れ戻る、あれです。ばねに減衰(揺れを時間とともに小さくしていく効き)を入れ忘れた状態、と言ってもいい。
指令のほうを作り替える
直すのは、機械ではなく、指令のほうです。一回で動かすかわりに、揺れの半周期ぶんだけ間を空けた、二回の弱い指令に分けて重ねます。最初の指令が起こした揺れは、半周期あとには逆向きに動いている。そこへ二回目をちょうど逆のタイミングで当てると、二つの揺れが打ち消し合います。ブランコを、止めたいときに軽く逆へ押すのと同じ理屈です。二回を足すと元の一回ぶんになるので、着く場所も速さも変わらず、残る揺れだけが消えます。結果を見てから直すのではなく、あらかじめ指令に織り込むこの手を、入力整形(フィードフォワード)と呼びます。

まず素のまま(赤)。止まったあとも先端が許容の輪(±25マイクロメートル)の外で揺れ続けます。次に入力整形(青)。同じ速さのまま、先端は輪の中心へすっと収まります。揺れは分かるよう300倍に誇張しています。
ソフトのイージング曲線を、機械の揺れの周期に合わせて設計している、というイメージがいちばん近いはずです。
打ち消しは、タダではない
ただ、無条件ではありません。この打ち消しは、機械の揺れの周期を正確に知っていることが前提です。周期の見積もりを二割外すと、揺れは35マイクロメートルまで戻り、また墓石立ちが出ました。知っているつもりの周期と、本当の周期がずれると効きません。それに、整形は動作が終わるまでの時間に、必ず11ミリ秒ほどを足します。効果は、時間と引き換えです。
意外だったことも書いておきます。サーボにノッチフィルタを入れれば鳴きは止まる、と思いがちですが、この揺れには届きません。ノッチは、フィードバックの輪の中で観測できる共振を削るためのものです。ところが今回の揺れは、エンコーダに映らない先端で、指令そのものが起こしています。輪の中では見えないので、フィードバック側でいくら削っても届かない。だから、指令の側を整形するほうが素直なのです(サーボはモータを目標へ追い込む制御、ノッチフィルタは特定の周波数だけを削るフィルタです)。

左へ行くほど速く、素のままだと速いほど揺れが増えて、許容±25マイクロメートルを超えます。入力整形(星)は、ほぼ全力の速さのまま、指令の完了を11ミリ秒だけ遅らせて揺れをほぼゼロにし、このせめぎ合いの外へ出ます。
正直な境界
このモデルは、一つの軸、一つの揺れ方だけを見ています。アニメーションではYの割り出しや部品の上げ下ろしも動きますが、揺れを追っているのは速い横移動(X)の一軸だけです。実機は頭の位置や載せた部品で周期が変わるので、現場ではもっと賢い整形を使います。本当の周期と減衰は、実機を加振して測らないと決まりません。飛んでいる先端にセンサを付けるわけにもいかないので、そこは正直に、名前を挙げるだけにしてあります。それに、このモデルが見ているのは、着地のずれが許容を超えるところまでです。加熱中に部品が実際に立ち上がる回転そのものは、外に置いています。ここから先は実機の仕事です。
実機がなくても、確かめられること
速く動かすほど精度が下がる、というのが、そのまま数字に出ました。加速の変化を十分の一に絞ると、揺れは136マイクロメートルから11マイクロメートルへ、素直に減ります。整形を入れると、速さを保ったまま、揺れがほぼゼロになる。どれも、周期や減衰の数字を変えると図が動くようにしてあって、都合よく描いたものではないことを確かめてあります。
分かったこと
「着いた」という合図は、本当に置ける状態を意味していませんでした。ウェブの「200は返ったが描画はまだ」と同じ話です。直しは、指令のほうを揺れの周期に合わせて整形すること。ただしその打ち消しは、周期を正しく知っていることが前提で、外すと戻ります。速さと精度は、ここでも簡単には両立しませんでした。
触ったことのない機械でも、パソコンの中でならここまではたどれます。別の機械でも、同じ手順を試しているところです。
コードと詳しい諸元・検証は GitHub に置いてあります。params.json の周期や減衰を変えると、揺れ方も墓石立ちの出方も変わります。
この記事は Zenn に初出したものを加筆・補足したものです ── Zenn の元記事を見る