산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

MK2 Plus 로봇 팔 컨트롤러

구성품 및 소모품

CNC 실드
× 1
OpenBuilds NEMA 17 스테퍼 모터
일반 Nema 17 스테퍼를 사용했습니다.
× 3
Arduino UNO
× 1
SparkFun 스테퍼 모터 드라이버 보드 A4988
× 3
OpenBuilds 마이크로 리미트 스위치
× 3

필요한 도구 및 기계

3D 프린터(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

EEZYBOT MK2 암

멋진 로봇 팔에 대해 thingiverse.com을 검색했다면 이것을 우연히 발견했을 가능성이 있습니다. EEZYBOT MK2 암(훌륭한 daghizmo가 설계)은 1:7 비율로 축소된 ABB IRB460의 운동학적 연결을 공유합니다. 그러나 이 팔은 서보와 함께 작동하도록 설계되어 약간 흔들리고 덜 우아합니다. 그러나 더 나은 솔루션이 있습니다. https://www.thingiverse.com/thing:2520572에 있는 MK2 Plus 암은 3개의 스테퍼 모터를 사용하여 연결 장치를 움직이는 원래 MK2 암의 리믹스 버전입니다.

이것을 인쇄하는 데 시간이 걸리므로 이 기사를 책갈피에 추가하고 모든 것을 인쇄한 다음 완료한 후 다시 오십시오! (며칠 정도 소요됩니다)

암을 조립하는 데 문제가 있는 경우 온라인에 많은 자습서가 있습니다.

홈 위치 선택

서보와 달리 스테퍼 모터에는 위치 인식 기능이 없습니다. 암에 전원이 공급될 때 먼저 귀환 루틴을 설정하여 이 문제를 해결해야 합니다. 3개의 리미트 스위치를 사용하여 홈 위치를 설정합니다. 연결 장치는 다소 복잡한 방식으로 작동하지만 암을 조립하고 모든 것이 어떻게 움직이는지 보면 스위치를 어디에 배치해야 하는지 쉽게 이해할 수 있습니다.

(즉, 데카르트 시스템과 같은 XY는 없지만 쉽게 하기 위해 XY라고 부를 것입니다.)

Z 리미트 스위치는 암의 메인 베이스 아무 곳에나 설정할 수 있습니다. 팔이 움직일 때 와이어가 떨어지지 않도록 뜨거운 접착제를 약간 추가합니다.

배선

모든 터미널이 CNC 실드에 표시되어 있기 때문에 배선은 매우 간단합니다. A4988 드라이버를 잘못된 방식으로 연결하지 마십시오! Y 리미트 스위치가 있는 쪽에 있는 스테퍼 모터는 CNC 실드의 Y 스테퍼 모터용 터미널에 연결해야 합니다. X 리미트 스위치 측면의 모터도 마찬가지입니다. (CNC 실드를 이런 식으로 다루기 쉽기 때문에 이것을 X와 Y라고 부릅니다) 암의 베이스를 회전시키는 최종 스테퍼를 Z 터미널에 연결하고 이름에 따라 엔드스톱을 배선합니다. 극성은 중요하지 않습니다.

모터가 실속 없이 작동하도록 전류를 공급할 수 있는 적절한 12V 전원 공급 장치를 찾으십시오.

코드

본론으로 들어가자. 스테퍼를 원활하게 구동하기 위해 Arduino용 AccelStepper 라이브러리를 사용할 것입니다. 이 라이브러리를 사용하면 여러 스테퍼 모터를 동시에 쉽게 가속, 감속 및 실행할 수 있습니다. 라이브러리 관리자(스케치> 라이브러리 포함> 라이브러리 관리자)를 사용하여 Arduino IDE를 통해 이 라이브러리를 직접 가져올 수 있습니다.

airspayce의 원래 제작자 페이지에서도 다운로드할 수 있습니다. https://www.airspayce.com/mikem/arduino/AccelStepper/

이제 필요한 모든 것이 준비되었으므로 코드를 단계별로 살펴보겠습니다.

먼저 사용할 핀의 이름을 정의합니다. 빠른 구글 이미지 검색으로 CNC 실드의 핀 다이어그램을 찾을 수 있습니다. 3개의 스테퍼 모터에 대한 AccelStepper 개체도 생성합니다.

#define XSTEP 2 //스테퍼 모터 스텝 핀
#define YSTEP 3
#define ZSTEP 4
#define XDIR 5 // 스테퍼 모터 방향 제어 핀
#define YDIR 6
#define ZDIR 7
#define ENABLE 8 // CNC 실드 인에이블 핀
#define XLIMIT 9 // 리미트 스위치 핀
#define YLIMIT 10
#define ZLIMIT 11
#define XMOTORACC 250 // 가속도 및 최대 속도 값
#define XMOTORMAXSPEED 1000
#define YMOTORACC 250
#define YMOTORMAXSPEED 1000
#
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)) { // 스위치가 활성화될 때까지 스테퍼를 CCW로 이동합니다.
XMOTOR. moveTo(초기_x홈); // 이동할 위치 설정
YMOTOR.moveTo(initial_yhome); // 이동할 위치 설정
initial_xhome--; // 필요한 경우 다음 이동을 위해 1 감소
initial_yhome--;
XMOTOR.run(); // 스테퍼 이동 시작
YMOTOR.run();
delay(5);
}
XMOTOR.setCurrentPosition(0); // 현재 위치를 0으로 설정
YMOTOR.setCurrentPosition(0);
initial_xhome =-1;
initial_yhome =1;
while(digitalRead(XLIMIT)){
XMOTOR.moveTo(initial_xhome); // 이동할 위치 설정
YMOTOR.moveTo(initial_yhome); // 이동할 위치 설정
initial_xhome--; // 필요한 경우 다음 이동을 위해 1씩 감소
initial_yhome++;
XMOTOR.run(); // 스테퍼 이동 시작
YMOTOR.run();
delay(5);
}
YMOTOR.setCurrentPosition(0); // 현재 위치를 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); // 현재 위치를 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)) { // 스위치가 활성화될 때까지 스테퍼를 CCW로 이동합니다.
ZMOTOR. moveTo(초기_zhome); // 이동할 위치 설정
initial_zhome--; // 필요한 경우 다음 이동을 위해 1 감소
ZMOTOR.run(); // 스테퍼 이동 시작
delay(5);
}
ZMOTOR.setCurrentPosition(0); // 현재 위치를 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 리미트 스위치가 먼저 눌려지도록 X와 Y 모터가 반대 방향으로 움직입니다.
  • Y 리미트 스위치를 누르는 즉시 두 모터가 같은 방향으로 회전하여 X 리미트 스위치가 눌러집니다.
  • X 스위치를 누른 후 모터가 약간 움직여 스위치가 눌려집니다(슬픈 눌림이 아니라 눌려 있음).
  • 마지막으로 Z 모터가 회전하여 Z 리미트 스위치가 눌러집니다.
  • 처음으로 귀환 절차를 수행할 때 정말 주의해야 합니다. 스테퍼가 다른 방향으로 움직이면 전원을 끄고 모터의 커넥터를 뒤집기만 하면 됩니다.

    이제 완료되었으므로 setup() 함수에서 autohome()을 호출하여 한 번만 실행되도록 합니다. loop()를 비워 두십시오. 그리고 전원 공급 장치에 손을 대고 문제가 발생하면 전원을 끄십시오.

    void setup() {
    // 여기에 설정 코드를 입력하여 한 번 실행:
    Serial.begin(9600);
    pinsetup();
    autohome();
    Serial.println("호밍 확인");
    }

    운이 좋으면 모터가 올바른 방향으로 회전하고 리미트 스위치가 오른쪽으로 딸깍 소리를 내며 원점 복귀 루틴이 문제 없이 작동합니다. 그러나 나와 같다면 모든 것이 시작되고 실행되기 전에 약간의 변경을 해야 합니다. 따라서 귀환이 잘못되면 항상 전원을 차단하여 3D 인쇄된 팔을 망가뜨리지 않도록 하십시오.

    마지막으로 팔이 원하는 위치로 이동하도록 loop()에 고유한 논리를 작성할 수 있습니다. 암이 연결된 방식으로 인해 X 및 Y 모터는 거의 직교 방식으로 엔드 이펙터를 제어합니다.

    void loop() {
    XMOTOR.runToNewPosition(100);
    delay(1000);
    YMOTOR.runToNewPosition(50);
    delay(1000);
    YMOTOR.runToNewPosition(-50);
    지연(1000);
    YMOTOR.runToNewPosition(0);
    지연(1000);
    XMOTOR.runToNewPosition( 0);
    지연(1000);
    }

    결론

    인기 있는 GRBL 펌웨어를 사용하여 이 팔을 제어하는 ​​방법에 대한 많은 자습서를 보았습니다. 그러나 이것은 팔을 움직이기 위해 팔에 직렬 명령을 보낼 컴퓨터가 필요하다는 것을 의미합니다. 몇 가지 동작을 수행하는 데 MK2 암만 필요한 경우 Arduino에 쉽게 하드코딩하여 자체 작업을 수행하도록 할 수 있습니다.

    이것은 직렬 명령으로 이것을 제어할 수 없다는 것을 의미하지는 않습니다! 직렬 구분 기호 코드를 여기에 통합하고 XY 및 Z 모터 단계를 문자열로 보낼 수 있습니다(특수 문자로 구분됨 - 예:5, 6, 7*로 X 모터를 5단계, Y는 6 및 Z x 7. *는 문자열의 끝을 나타내는 데 사용됨).

    또한 엔드 이펙터의 3D 공간 좌표를 전송하고 arduino에서 역기구학 또는 기본 삼각법을 사용하여 필요한 단계를 파악하도록 이를 추가로 개발할 수도 있습니다.

    즐거운 시간 보내세요! 그리고 Thingiverse의 모든 뛰어난 디자이너들에게 진심으로 감사드립니다!

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 로봇암
  • robotArmArduino
    파일을 추출하고 Arduino IDE로 엽니다.
    미리보기 없음(다운로드만 가능).
    MK2 로봇 팔 컨트롤러 - Github
    github 저장소 링크https://github.com/yasaspeiris/MK2-Robot-Arm-Controller

    맞춤형 부품 및 인클로저

    Thingiverse의 Robot Arm MK2 Plus
    thingiverse.com 의 ackyltle CAD 파일 크레딧

    제조공정

    1. 모터 컨트롤러는 Arm Cortex-M0 코어를 통합합니다.
    2. 듀얼 암 SCARA 로봇
    3. MeArm 로봇 암 - 로봇 - V1.0
    4. 이더넷을 통해 제어되는 로봇 암
    5. Littlearm 2C:3D 인쇄 Arduino 로봇 팔 제작
    6. DIY Arduino 로봇 팔 – 손 제스처로 제어
    7. Android 앱으로 Arduino 로봇 팔 제어
    8. Realtime Robotics, 새로운 로봇 컨트롤러 컴퓨터 공개
    9. 로봇 암이 장착된 터닝 센터
    10. 로봇, 협업 로봇 암과 모바일 플랫폼 결합