Open MicroManipulator – マイクロメートル以下の精度を持つ3Dモーション制御プラットフォーム
Open MicroManipulator – A sub-micrometer 3D motion control plattform (github.com)
要約
このプロジェクトは、低コストで組み立てやすいオープンソースの電動XYZマイクロマニピュレータープラットフォームを発表しています。サブマイクロメートルの精度を実現し、光学アライメントや電子部品のプロービング、顕微鏡などの用途に適しています。並列キネマティック構造と精密な制御により、高い機械的剛性と広範囲の動作を実現しており、GコードコマンドによるUSBシリアルインターフェース経由での制御が可能です。
全文翻訳
Open Micro-Manipulator
このプロジェクトは、オープンソースで低コスト、かつ容易に構築できる、マイクロメートル以下の精度を実現する電動XYZマイクロマニピュレーターモーション制御プラットフォームを含んでいます。光学アライメント、電子部品のプロービング、顕微鏡検査などのアプリケーション向けに設計されています。
デバイスとその構築方法に関する詳細については、YouTube動画をご覧ください。
オープンソース電動XYZマイクロマニピュレーター – 手頃な価格のサブµmモーション制御
パラレルキネマティック構造と小型ボールジョイントのおかげで、良好な機械的剛性と広い可動範囲を実現しています。モーターは市販のステッパーモーターで、30 kHzのクローズドループコントローラーと非常に精密なPWM信号によって駆動されます。「磁気ギアリング」アプローチにより、低コストの磁気ロータリーエンコーダーの分解能を30倍に向上させ、50nmまでのステップを可能にします(分解能と精度の違いに注意してください。絶対精度は大幅に劣ります)。
デバイスはUSBシリアルインターフェース経由でシンプルなGコードコマンドで制御できるため、他のプロジェクトへの統合が容易です。ファームウェアは、スムーズで正確なパス追従機能のためのルックアヘッドを備えた完全なモーションプランニングスタックを実装しています。
始め方
プロジェクトを再現したい場合は、以下の高レベルな手順に従ってください。ビルドに関する質問や問題がある場合、またはプロジェクトに関連するトピックについて話し合いたい場合は、プロジェクトのコミュニティDiscordサーバーに参加してください。
- このドキュメントを読み、リンクされた動画を視聴する
- 部品表(Bill of Materials)に記載されている部品を入手する
- デバイスと電子機器を組み立てる
- ビルドに合わせてハードウェア構成を変更する hw_config.h
- PlattformIOプラグインを備えたVSCodeを使用してファームウェアをアップロードする
- 軸をキャリブレーションする
新しいデバイスのセットアップガイドも参照してください。セットアップガイド
✨NEW: ハードウェアバージョン4.0
以前のデザインのいくつかの問題を修正した新しいハードウェアバージョンがリリースされました。
- ホ—ミング中の自己衝突が修正されました。
- ボールジョイントブロックとネジのみでの接続は、十分に固定されておらず、少し回転する可能性がありました。
- リンケージロッドの長さを一貫して確保する信頼性の高い方法がありませんでした。
- 不要なボールジョイントの摩擦。
- 正確なボールの位置は、プリント品質とコーナーの丸みに大きく依存していました。
- ゴムバンドは、一度接着すると交換または取り外しができませんでした。
改善されたボールジョイントとリンケージ製造プロセスに関するビデオはYouTubeでご覧いただけます。Open Micro-Manipulator用 改善されたボールジョイント また、FreeCADモデルも再構築・改善され、すべてのピンとファスナーが含まれるようになりました。これにより、必要なすべての機械部品の参照が提供されます。
[画像: Open Micro-Manipulator GUI]
注意:BOMはまだ更新されていません...
Open Micro-Manipulator GUI
Open-Micro Manipulatorのテストと使用を簡単かつ便利にするために、グラフィカルユーザーインターフェースを備えたPython制御プログラムがここに提供されています。Open Micro-Manipulator GUI。デバイスを移動させるためのシンプルなコントロールを備え、ライブカメラフィード(例:顕微鏡カメラから)も表示します。追加機能として、シンプルなGコードランナーやリアルタイムマウスコントロール(例:生物学アプリケーション向け)が含まれます。
[画像: Open Micro-Manipulator GUI]
🐍 Python-API
軽量なPython APIは、すべてのシリアル通信を処理し、便利なコマンド実行とデバッグメッセージの印刷を提供します。インターフェースには、デバイスのホーム設定、移動、キャリブレーション、およびデバイス情報のクエリを行うための関数が含まれています。open_micro_stage_api.pyファイルをプロジェクトにコピーするだけで(requirements.txtの依存関係もインストールしてください)、すぐに開始できます。
使用例
from open_micro_stage_api import OpenMicroStageInterface
# インターフェースを作成して接続
oms = OpenMicroStageInterface(show_communication=True, show_log_messages=True)
oms.connect('/dev/ttyACM0')
# 関節をキャリブレーションするために一度実行します
# for i in range(3): oms.calibrate_joint(i, save_result=True)
# デバイスをホーム位置に移動
om s.home()
# いくつかのx,y,z位置に移動 [mm]
om s.move_to(0.0, 0.0, 0.0, f=10)
om s.move_to(3.1, 4.1, 5.9, f=26)
om s.move_to(0.0001, 0.0, 0.0, f=10)
# 移動完了を待機
om s.wait_for_stop()
API関数(最も関連性の高い関数のみ)
connect(port, baud_rate=921600)
disconnect()
set_workspace_transform(transform)
get_workspace_transform()
home(axis_list=None)
calibrate_joint(joint_index, save_result)
move_to(x, y, z, f, move_immediately, blocking, timeout)
set_tool_output(tool_idx, output_value, immediate)
set_pose(x, y, z)
dwell(time_s, blocking, timeout)
enable_motors(enable)
wait_for_stop(polling_interval_ms, disable_callbacks)
set_max_acceleration(linear_accel, angular_accel)
set_servo_parameter(pos_kp, pos_ki, vel_kp, vel_ki, vel_filter_tc)
✨ ファームウェア v1.0.4
ファームウェア1.0.4には、多くの小さな改善とバグ修正、そして素晴らしい新機能が含まれています。
-
ツール: ツール(例:レーザー彫刻用)の使用が、PCB上の2つのGPIOピンでサポートされるようになりました。ツールはプランナーに統合されており、Gコード実行時に高速かつ正確なタイミングで動作します。ツールはPWM(PIO機能を使用して、ソフトウェアPWMに依存せずに余分なチャンネルを引き出す)をサポートします。
使用例:
M3 T0 S0.7 // tool 0のPWM出力を70%に設定 G4 S0.001 // dwellコマンド(または他のモーションコマンド) - ツールの出力を適用するために必要 -
キャリブレーション: キャリブレーションには、潜在的な問題(エンコーダーのずれなど)のエラー報告を改善するための追加のエラーチェックが含まれるようになりました。
-
キネマティックモデルパラメータ: 初期化コードが整理され、パラメータにコメントが追加されました。パラメータはHW v4.0用にプリセットされていますが、必要に応じて古いHW-v3.0パラメータに戻すことができます。
-
バグ修正: 小さなバグ修正
重要:ハードウェアバージョンv3.0をお持ちの場合は、kinematic_model_delta3d.cppファイルで古いキネマティックパラメータに戻す必要があります(ファイルの先頭にそのための#defineがあります)。
ファームウェア v1.0.1
このアップデートでは、キャリブレーション、ホ—ミング、ロギングが改善され、いくつかの新しいGコードコマンドが追加されました。
改善点
- ホ—ミング: 並列ホ—ミングサポート、高い繰り返し精度、より正確な幾何学的参照
- ジョイントキャリブレーション: 洗練された手順、永続的なフラッシュストレージ(再起動後の再キャリブレーション不要)
- ロギング: より明確で詳細な出力
新しいGコードコマンド
G28— ジョイントをホーム位置に移動(複数の軸を同時にホ—ミングして起動時間を短縮可能)G24— ポーズ設定コマンド(モーションコントローラーをバイパスしてサーボターゲットを直接設定)M17/M18— モーターの有効化/無効化(有効化時にエンコーダーからポーズを復元)M51— エンコーダー値の読み取りM55— サーボループパラメータの設定M56— ジョイントキャリブレーション(フラッシュへの保存オプション付き)M57— デバイス状態に関する様々な情報の読み取りM58— ファームウェアバージョンの読み取り
⚙ CADファイル
すべてのCADモデルはFreeCADで作成されており、誰もがデザインを表示・変更できるように、プロプライエタリなCADソリューションの購読や支払いを必要としません。ほとんどのコンポーネントは、3軸CNCミルで容易に加工できるように設計されていることに注意してください。部品を3Dプリントすることも可能ですが、熱ドリフト(カーボンファイバーフィラメントは問題を軽減する可能性があります)を受け入れる必要があります。
CADファイルはここで見つけることができます。CAD Models。FreeCADバージョン1.2.0devが使用されており、古いバージョンではファイルが機能しない可能性があることに注意してください。
プリント用のSTLファイルはここで見つけることができます。STL Files
⚙ キネマティックモデル
キネマティックモデルはここで定義されています。kinematic_model_delta3d.cpp。コンストラクタで設定されている値とビルドの寸法を比較してください。特に、アームの長さが一致していることを確認してください。
⚙ 電子機器
重要:PCBバージョンv1.2(基板上のバージョンラベルを参照)を製造した場合、ダイオードD1にある、5Vレールとグランドをショートさせる誤配置されたビアをドリルで取り除く必要があります(修理画像を参照)。この問題はv1.3で修正されました。
電子機器はKiCADで設計されており、一般的に入手可能なモジュール(モータードライバーとMCUボード)のみが使用され、シンプルなPCBで接続されています。基板の組み立てを容易にするため、基板への部品実装にSMDはんだ付けは必要ありません。モーターの通常の巻線抵抗の場合、電流と加熱を合理的なレベルに保つために、デバイスは$${\color{lightgreen} 5V-6V }$$(2A)で給電されるべきです。
リポジトリには、PCBメーカーに直接アップロードできる製造ファイルも含まれています。
⚙ ファームウェア
ファームウェアはC++で記述されており、'SimpleFOC'プロジェクトからインスピレーションを得ています。余分な手間をかけずに、このプロジェクトで使用されているハードウェアに焦点を当て、合理化され読みやすいことを目指しています。パスプランニングとルックアヘッドを実装しており、多くの他のモーションコントローラープロジェクトとは異なり、真の6DOFポーズ補間とプランニングをサポートしているため、ヘキサポッドモーションプラットフォームの駆動準備ができています。これは、このプロジェクトの次のステップになるかもしれません。
ピン番号、モータータイプ、その他のパラメータの設定はhw_config.hで見つけることができます。ファームウェアをアップロードする前に確認してください。
ファームウェアのビルドとフラッシュ
ファームウェアのビルドとフラッシュには、Visual Studio Code(WindowsおよびLinuxで無料利用可能)を推奨します。PlatformIOアドオンをインストールし、ファームウェアフォルダを開きます。これで、他のPlatformIOプロジェクトと同様にファームウェアをビルドおよびフラッシュできます。
⚙ Gコードインターフェース
ファームウェアは、以下にリストされたGコードコマンドのサブセットのみをサポートします。
各コマンドは、okまたはerrorの応答で確認されます。
コマンドが追加情報(例:位置の取得コマンド)を提供する場合、その情報はokメッセージの前に返されます。
クライアントは、次のコマンドを送信する前に、前のコマンドからの確認を待つ必要があります。それ以外の場合、動作は未定義です。
| コマンド | 説明 |
|---|---|
G0 X Y Z F | 指定された位置に直線でエンドエフェクターを移動します。 • X, Y, Z: 目標位置 • F: 送り速度 |
G1 X Y Z F | G0と同じです。 |
G4 S/P | 指定された時間だけ待機/一時停止します。 • S: 秒 • P: ミリ秒 |
G24 X Y Z A B C | オプションの回転ベクトル* A, B, Cで、サーボループの現在のポーズを直接設定します。 |
G28 A-F | 1つ以上のジョイントをホーム位置に移動します。 • オプションのジョイント選択 A–F。 |
M3 | ツール出力を設定します。 • T: ツールインデックス • S: 出力値(0.0..1.0) 注:新しい値は次のモーションまたはウェイトコマンドで適用されます |
M17 | モーターを有効にし、現在のポーズを開始ポーズとして読み取ります。 |
M18 | モーターを無効にします。 |
M50 | 現在の内部ポーズを取得します。(エンコーダーはここで読み取られません) |
M51 | 現在のエンコーダー角度(度)と生のエンコーダー値を取得します。 |
M52 | プランナーキュー内のアイテム数を取得します。 |
M53 | すべての計画された移動が完了したかを確認します(1 = 完了、0 = 未完了)。 |
M55 A B C D F | サーボループパラメータを設定します。 • A, B: 位置PIコントローラーゲイン(PとI) • C, D: 速度PIコントローラーゲイン(PとI) • F: 速度フィルター時定数 |
M56 J S | ジョイントをキャリブレーションします。 • J: ジョイントインデックス • S: キャリブレーション結果を保存 |
M57 | デバイスとサーボループの情報(ホ—ミング/キャリブレーション状態、角度、ループ周波数、ファイルリスト)を取得します。 |
M58 | ファームウェアバージョンを取得します。 |
M204 L A | 線形および角加速度を設定します。 • L: 線形加速度 • A: 角加速度 |
*注:通信プロトコルは回転に3Dベクトルを使用します。方向は回転軸を表し、ベクトルの長さは軸周りの回転角度を表します。
❤️ サポート
このプロジェクトをサポートしたい場合は、以下を検討してください。
- ビルドガイドへの貢献 – プルリクエストを送信したり、提案を含むイシューを開いたりして、ビルド手順の改善または拡張を支援してください。
- 典型的なラジアルステッピングモーターシャフトのエラーモーションの特性評価 – 複数のNema-17ステッピングモーターのシャフトのラジアルエラーモーションを測定してください(この件に関する詳細はCylos Garageを参照してください:https://www.youtube.com/watch?v=gt2gK-oxy5s)。
- ビルド体験に関するフィードバック – 何がうまくいき、何がうまくいかなかったか、そしてプロセスを他の人にとってよりスムーズにする方法を教えてください。
- Ko-fiでプロジェクトをサポート – このプロジェクトに価値があると感じた場合は、Ko-fi ☕ を通じて財政的にサポートできます。