직접 만드는 MK2 플러스 로봇 암 컨트롤러
부품 및 소모품
CNC 쉴드 × 1
OpenBuilds NEMA 17 스테퍼 모터 (일반 NEMA 17 사용) × 3
Arduino UNO × 1
SparkFun 스테퍼 모터 드라이버 보드 A4988 × 3
OpenBuilds 마이크로 리미트 스위치 × 3
필요한 도구 및 기계
앱 및 온라인 서비스
Arduino IDE
프로젝트 소개
EEZYBOT MK2 암
Thingiverse에서 멋진 로봇 팔을 검색하다 보면 이 팔을 발견하게 됩니다. EEZYBOT MK2 암(설계자 daghizmo)은 ABB IRB460의 운동학 링크를 1:7로 축소한 것입니다. 하지만 서보 모터로 동작하도록 설계되어 다소 흔들리고 우아하지 않습니다. 더 나은 대안이 있습니다. MK2 플러스 암 은 원본 MK2를 리믹스해 3개의 스테퍼 모터로 링크를 구동합니다.
출력하는 데 며칠 걸리니 이 글을 북마크하고 출력 완료 후 다시 오세요!
조립에 어려움이 있다면 온라인 튜토리얼이 많이 있습니다.
홈 포지션 선정
서보와 달리 스테퍼 모터는 위치 인식이 없습니다. 전원 켤 때 홈 루틴으로 해결합니다. 3개의 리미트 스위치로 홈 포지션을 잡습니다. 링크 작동 방식이 다소 복잡하지만 조립해 보면 스위치 위치를 쉽게 이해할 수 있습니다.
(데카르트 좌표계처럼 XY는 아니지만 CNC 쉴드 다루기 쉽게 X, Y라 부르겠습니다)
Z 리미트 스위치는 암 메인 베이스 아무 곳에나 달면 됩니다. 핫글루로 살짝 고정해 움직일 때 선이 빠지지 않게 하세요.
배선
배선은 간단합니다. CNC 쉴드 단자가 모두 표시되어 있습니다. A4988 드라이버를 거꾸로 꽂지 않게 주의하세요! Y 리미트 스위치 쪽 스테퍼 모터는 CNC 쉴드의 Y 스테퍼 단자에, X 리미트 스위치 쪽 모터는 X 단자에 연결합니다. 베이스를 회전시키는 마지막 스테퍼는 Z 단자에 연결하고, 엔드스톱은 이름대로 연결합니다. 극성은 상관없습니다.
모터가 스톨하지 않을 만큼 전류를 공급할 수 있는 괜찮은 12V 파워 서플라이를 구하세요.
코드
아두이노용 AccelStepper 라이브러리를 사용해 스테퍼를 부드럽게 구동합니다. 이 라이브러리로 여러 스테퍼를 동시에 가속/감속/구동할 수 있습니다. 아두이노 IDE 라이브러리 매니저(스케치 > 라이브러리 포함 > 라이브러리 매니저)에서 바로 설치 가능합니다.
원작자 페이지: https://www.airspayce.com/mikem/arduino/AccelStepper/
필요한 핀 이름 정의와 AccelStepper 객체 생성:
#define XSTEP 2
#define YSTEP 3
#define ZSTEP 4
#define XDIR 5
#define YDIR 6
#define ZDIR 7
#define ENABLE 8
#define XLIMIT 9
#define YLIMIT 10
#define ZLIMIT 11
#define XMOTORACC 250
#define XMOTORMAXSPEED 1000
#define YMOTORACC 250
#define YMOTORMAXSPEED 1000
#include <AccelStepper.h>
AccelStepper XMOTOR(1, XSTEP, XDIR);
AccelStepper YMOTOR(1, YSTEP, YDIR);
AccelStepper ZMOTOR(1, ZSTEP, ZDIR);
핀 설정 헬퍼 함수:
void pinsetup() {
pinMode(ENABLE, OUTPUT);
digitalWrite(ENABLE, LOW);
pinMode(XLIMIT, INPUT_PULLUP);
pinMode(YLIMIT, INPUT_PULLUP);
pinMode(ZLIMIT, INPUT_PULLUP);
}
홈 루틴 로직:
void autohome() { xyhome(); zhome(); }
void xyhome() {
int initial_xhome = -1;
int initial_yhome = -1;
XMOTOR.setMaxSpeed(500.0); XMOTOR.setAcceleration(50.0);
YMOTOR.setMaxSpeed(500.0); YMOTOR.setAcceleration(50.0);
while (digitalRead(YLIMIT)) {
XMOTOR.moveTo(initial_xhome);
YMOTOR.moveTo(initial_yhome);
initial_xhome--; initial_yhome--;
XMOTOR.run(); YMOTOR.run(); delay(5);
}
XMOTOR.setCurrentPosition(0); YMOTOR.setCurrentPosition(0);
initial_xhome = -1; initial_yhome = 1;
while (digitalRead(XLIMIT)) {
XMOTOR.moveTo(initial_xhome);
YMOTOR.moveTo(initial_yhome);
initial_xhome--; initial_yhome++;
XMOTOR.run(); YMOTOR.run(); delay(5);
}
YMOTOR.setCurrentPosition(0);
YMOTOR.setMaxSpeed(250.0); YMOTOR.setAcceleration(10.0);
initial_yhome = 1;
while (!digitalRead(YLIMIT)) {
YMOTOR.moveTo(initial_yhome);
YMOTOR.run(); initial_yhome++; delay(5);
}
YMOTOR.setCurrentPosition(0);
YMOTOR.setMaxSpeed(YMOTORMAXSPEED); YMOTOR.setAcceleration(YMOTORACC);
XMOTOR.setCurrentPosition(0);
XMOTOR.setMaxSpeed(250.0); XMOTOR.setAcceleration(10.0);
initial_xhome = 1;
while (!digitalRead(XLIMIT)) {
XMOTOR.moveTo(initial_xhome);
XMOTOR.run(); initial_xhome++; delay(5);
}
XMOTOR.setCurrentPosition(0);
XMOTOR.setMaxSpeed(XMOTORMAXSPEED); XMOTOR.setAcceleration(XMOTORACC);
}
void zhome() {
int initial_zhome = -1;
ZMOTOR.setMaxSpeed(100.0); ZMOTOR.setAcceleration(100.0);
while (digitalRead(ZLIMIT)) {
ZMOTOR.moveTo(initial_zhome);
initial_zhome--; ZMOTOR.run(); delay(5);
}
ZMOTOR.setCurrentPosition(0);
ZMOTOR.setMaxSpeed(50.0); ZMOTOR.setAcceleration(50.0);
initial_zhome = 1;
while (!digitalRead(ZLIMIT)) {
ZMOTOR.moveTo(initial_zhome);
ZMOTOR.run(); initial_zhome++; delay(5);
}
ZMOTOR.setCurrentPosition(0);
ZMOTOR.setMaxSpeed(1000.0); ZMOTOR.setAcceleration(1000.0);
}
설명이 길지만 실제 동작은 다음과 같습니다:
X, Y 모터를 반대 방향으로 움직여 Y 리미트 스위치가 먼저 눌리게 함
Y 스위치 눌리면 두 모터 같은 방향으로 움직여 X 스위치 누름
X 스위치 눌리면 모터를 살짝 움직여 스위치에서 떨어뜨림
마지막으로 Z 모터 돌려 Z 리미트 스위치 누름
처음 홈 루틴 실행 시 매우 주의하세요. 모터가 반대 방향으로 돌면 즉시 전원 끄고 모터 커넥터를 뒤집으세요.
setup()에서 autohome() 호출해 한 번만 실행되게 하고 loop()는 비워둡니다. 전원 공급기 옆에 손을 대고 있다가 문제 생기면 바로 끄세요.
void setup() {
Serial.begin(9600);
pinsetup();
autohome();
Serial.println("HOMING OK");
}
운 좋으면 한 번에 성공하지만, 저처럼 여러 번 조정해야 할 수도 있습니다. 홈 루틴이 잘못되면 즉시 전원 끄고 3D 프린트 팔을 망가뜨리지 마세요.
마지막으로 loop()에 원하는 동작 로직을 작성하세요. 링크 구조상 X, Y 모터가 엔드 이펙터를 거의 데카르트 방식으로 제어합니다.
void loop() {
XMOTOR.runToNewPosition(100); delay(1000);
YMOTOR.runToNewPosition(50); delay(1000);
YMOTOR.runToNewPosition(-50); delay(1000);
YMOTOR.runToNewPosition(0); delay(1000);
XMOTOR.runToNewPosition(0); delay(1000);
}
결론
이 팔을 제어하는 데 GRBL 펌웨어를 사용하는 튜토리얼이 많은데, 그러면 컴퓨터에서 시리얼 명령어를 보내야 움직입니다. 몇 가지 동작만 필요하면 아두이노에 하드코딩해 자율적으로 움직이게 할 수 있습니다.
물론 시리얼 명령어로 제어할 수도 있습니다. 시리얼 구분자 코드를 추가해 X, Y, Z 스텝을 문자열로 전송하면 됩니다(예: 5,6,7*는 X 5스텝, Y 6스텝, Z 7스텝 이동, *는 문자열 끝).
더 발전시켜 엔드 이펙터의 3D 공간 좌표를 보내고 아두이노가 역운동학이나 기본 삼각함수로 필요 스텝을 계산하게 할 수도 있습니다.
즐거운 제작 되세요! Thingiverse의 훌륭한 설계자들에게 진심으로 감사드립니다!
코드
robotArm
파일 압축 해제 후 아두이노 IDE로 열기
미리보기 없음 (다운로드만 가능).
MK2 로봇 암 컨트롤러 - GitHub
https://github.com/yasaspeiris/MK2-Robot-Arm-Controller
커스텀 부품 및 인클로저
로봇 암 MK2 플러스 on Thingiverse
설계자 ackyltle에게 크레딧 CAD 파일