
Open Micro-Manipulator는 서브마이크론 정밀도를 목표로 하는 저비용 오픈소스 XYZ 모션 제어 플랫폼이다. 광학 정렬, 전자 부품 프로빙, 현미경 작업 등에 활용하도록 설계됐다.
장치와 제작 과정을 소개하는 영상에서 자세한 내용을 볼 수 있다.
평행 운동학 구조와 소형 볼 조인트를 사용해 기계적 강성과 넓은 운동 범위를 확보한다. 시판 스테퍼 모터는 30kHz 폐루프 제어기와 정밀 PWM 신호로 구동한다. ‘자기 기어링’ 방식은 저가형 자기 회전 인코더의 분해능을 30배 높여 50nm 단위 이동을 가능하게 한다. 다만 분해능과 정확도는 다르며, 절대 정확도는 이보다 상당히 낮다.
장치는 USB 시리얼 인터페이스로 간단한 G-Code 명령을 보내 제어할 수 있어 다른 프로젝트에 통합하기 쉽다. 펌웨어에는 부드럽고 정확한 경로 추종을 위한 룩어헤드 기능을 포함한 모션 계획 스택이 구현돼 있다.
제작과 설정
프로젝트를 재현하려면 다음 절차를 따른다.
- 문서를 읽고 연결된 영상을 본다.
- 부품 목록에 있는 부품을 준비한다.
- 장치와 전자 회로를 조립한다.
- 조립한 하드웨어에 맞춰 hw_config.h를 수정한다.
- VSCode와 PlatformIO 플러그인으로 펌웨어를 업로드한다.
- 축을 보정한다.
새 장치 설정은 설정 안내서를 참고할 수 있다.
하드웨어 버전 4.0은 이전 설계의 문제를 수정했다. 수정 사항에는 홈 이동 중 자기 충돌, 나사만으로 고정한 볼 조인트 블록의 불안정성, 링크 로드 길이를 일관되게 맞추기 어려운 점, 불필요한 볼 조인트 마찰, 출력 품질과 모서리 둥글기에 크게 좌우되는 볼 위치 정밀도, 접착한 뒤 교체하거나 제거할 수 없던 고무줄 문제가 포함된다. 개선된 볼 조인트와 링크 제작 과정을 보여주는 영상도 공개됐다. FreeCAD 모델도 재구성·개선했으며, 모든 핀과 체결 부품을 포함해 필요한 기계 부품의 기준을 제공한다. 다만 부품 목록(BOM)은 아직 업데이트되지 않았다.
제어 프로그램과 API
장치 테스트와 사용을 간편하게 하도록 Open Micro-Manipulator GUI라는 Python 제어 프로그램을 제공한다. 장치를 움직이는 기본 조작 기능과 현미경 카메라 등의 실시간 영상 표시 기능이 있다. 간단한 G-code 실행기와 생물학 분야 작업 등에 쓸 수 있는 실시간 마우스 제어 기능도 포함한다.
경량 Python API는 시리얼 통신과 명령 실행, 디버그 메시지 출력을 처리한다. 장치 원점 이동, 이동, 보정, 정보 조회 기능을 제공한다. 프로젝트에 open_micro_stage_api.py를 복사하고 requirements.txt에 적힌 의존성을 설치하면 사용할 수 있다.
from open_micro_stage_api import OpenMicroStageInterface
# create interface and connect
oms = OpenMicroStageInterface(show_communication=True, show_log_messages=True)
oms.connect('/dev/ttyACM0')
# run this once to calibrate joints
# for i in range(3): oms.calibrate_joint(i, save_result=True)
# home device
oms.home()
# move to several x,y,z positions [mm]
oms.move_to(0.0, 0.0, 0.0, f=10)
oms.move_to(3.1, 4.1, 5.9, f=26)
oms.move_to(0.0001, 0.0, 0.0, f=10)
# wait for moves to finish
oms.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): 서보 매개변수 설정
펌웨어 변경과 명령
펌웨어 1.0.4는 여러 개선과 버그 수정을 포함하며, 도구 제어 기능을 추가했다. 레이저 각인 등에 쓸 수 있는 도구를 PCB의 J5에 있는 GPIO 핀 두 개에 연결할 수 있다. 도구 출력은 모션 플래너에 통합돼 G-code 실행 중 타이밍에 맞춰 작동한다. PIO 기능을 이용한 PWM을 지원하므로 소프트웨어 PWM에 의존하지 않고 추가 채널을 확보한다. 예시는 다음과 같다.
M3 T0 S0.7 // set pwm output of tool 0 to 70% G4 S0.001 // dwell command (or any other motion command) - necessary to apply the tools output
보정에는 인코더 정렬 같은 잠재적 문제를 더 잘 보고하도록 오류 검사가 추가됐다. 초기화 코드를 정리하고 매개변수 주석을 보강했으며, 매개변수는 하드웨어 v4.0 기준으로 설정했다. 필요한 경우 이전 하드웨어 v3.0 매개변수로 전환할 수 있다. 그 밖에도 작은 버그를 수정했다. 하드웨어 v3.0을 사용하는 경우 kinematic_model_delta3d.cpp 파일 상단의 #define을 사용해 이전 운동학 매개변수로 전환해야 한다.
펌웨어 v1.0.1은 보정, 원점 이동, 로그 기능을 개선하고 G-Code 명령을 추가했다. 원점 이동은 여러 조인트를 동시에 이동할 수 있게 됐으며 반복성과 기하학적 기준의 정확도를 높였다. 조인트 보정 절차를 다듬고 결과를 플래시에 저장해 재부팅 후 다시 보정하지 않아도 되도록 했다. 로그 출력도 더 명확하고 상세해졌다.
추가된 명령은 다음과 같다.
G28: 조인트 원점 이동. 여러 축을 동시에 이동해 시작 시간을 줄일 수 있다.G24: 자세 설정. 모션 컨트롤러를 거치지 않고 서보 목표값을 직접 설정한다.M17/M18: 모터 활성화·비활성화. 활성화할 때 인코더로 자세를 복원한다.M51: 인코더 값 읽기M55: 서보 루프 매개변수 설정M56: 조인트 보정 및 플래시 저장 옵션M57: 장치 상태 정보 읽기M58: 펌웨어 버전 읽기
펌웨어가 지원하는 G-Code는 아래와 같다. 각 명령은 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 | 하나 이상의 조인트를 원점으로 이동한다. 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는 각 가속도다. |
통신 프로토콜은 회전에 3차원 벡터를 사용한다. 벡터의 방향은 회전축을, 벡터의 길이는 해당 축을 중심으로 한 회전 각도를 나타낸다.
CAD와 하드웨어
CAD 모델은 모두 FreeCAD로 제작해 독점 CAD 프로그램에 가입하거나 비용을 내지 않아도 확인하고 수정할 수 있다. 대부분의 부품은 3축 CNC 밀링으로 쉽게 가공할 수 있도록 설계됐다. 3D 프린터로 부품을 만들 수도 있지만 열 드리프트가 생길 수 있으며, 탄소 충전 필라멘트로 이를 줄일 수 있다. CAD 모델과 3D 프린팅용 STL 파일을 제공한다. CAD 파일은 FreeCAD 1.2.0dev로 제작했으며, 이전 버전에서는 작동하지 않을 수 있다.
운동학 모델은 kinematic_model_delta3d.cpp에 있다. 제작한 장치의 치수를 생성자에 설정된 값과 비교해야 하며, 특히 암 길이가 일치하는지 확인해야 한다.
전자 회로는 KiCAD로 설계했다. 모터 드라이버와 MCU 보드 등 흔히 구할 수 있는 모듈을 간단한 PCB로 연결하며, 보드를 구성할 때 SMD 납땜이 필요하지 않다. 일반적인 모터 권선 저항을 기준으로 전류와 발열을 적정 수준으로 유지하려면 5V~6V, 2A 전원을 사용해야 한다. PCB 버전 v1.2를 제작했다면 보드의 버전 표기를 확인해야 한다. 이 버전은 다이오드 D1의 비아 위치 오류로 5V 레일이 접지에 단락되므로 수리 이미지를 참고해 해당 비아를 뚫어야 한다. 이 문제는 v1.3에서 수정됐다. PCB 제조사에 바로 업로드할 수 있는 제작 파일도 저장소에 포함돼 있다.
펌웨어는 C++로 작성했으며 SimpleFOC 프로젝트에서 일부 영감을 얻었다. 군더더기 없이 간결하고 읽기 쉬운 코드를 지향하며, 이 프로젝트의 하드웨어에 초점을 맞춘다. 룩어헤드 경로 계획을 구현했으며, 다른 많은 모션 컨트롤러 프로젝트와 달리 6자유도 자세 보간과 계획도 지원한다. 따라서 헥사포드 모션 플랫폼을 구동할 수 있지만, 이것이 다음 프로젝트 단계가 될지는 정해지지 않았다. 핀 번호, 모터 유형 등은 hw_config.h에서 설정할 수 있다. 펌웨어를 업로드하기 전에 설정을 확인해야 한다.
펌웨어 빌드와 업로드에는 Windows와 Linux에서 무료로 사용할 수 있는 Visual Studio Code를 권장한다. PlatformIO 애드온을 설치하고 펌웨어 폴더를 열면 다른 PlatformIO 프로젝트와 같은 방식으로 빌드하고 업로드할 수 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요