3D 프린터2017.04.30 00:18


원제: Diagonal rod correction for delta printing XY dimensional calibration

원저자: Salmeron Valdivieso, H

2017-02

출처: http://www.thingiverse.com/thing:1274733




목차


1. 서론

2. 수학적 모델

3. 적용

a. Thingiverse 파일 사용

i. 리피터 펌웨어 값 수정

ii. 마를린 펌웨어 값 수정

iii. 예제

4. FAQ





1. 서론


가정용 3D프린팅은 지속적이고 문제가 많은 교정(calibration)으로 매우 실망스러운 작업이 될 수 있다. 이러한 어려움은 델타방식의 3D프린터를 사용할 경우 더 커지는데, 델타방식이 조형과 교정이 더 어렵기 때문이다. 이 글은 델타구조에서의 각 축(tower)의 "diagonal rod"값를 계산을 풀어낸 것이다. 이것으로 XY치수 오차를 해결할 수 있을 것이다(Horizontal Radius와 모터의 스텝수가 정확하다는 가정 하).



2. 수학적 모델


베드 중심에서 각 3개 중 하나의 축까지로 평행이동 모델을 만들어 보자. 여기서 D0를 컨트롤러에 입력한 "diagonal rod" 값으로, D를 치수가 정확해지는 실제 "diagonal rod" 값으로 정하자.


컨트롤러는 수평 방향으로 명령내려진 L*를 가기 위해 주어진 파라미터와 함수로 계산된 Dh만큼 "carriage"를 이동한다. 코드(software)는 파라미터를 교정하기 위해 h*를 계산한다. 노즐이 베드의 중심일때  "diagonal rod" 투영(대각선의 수평길이)은 "Horizontal Radius"인 R과 같다. 피타고라스 정리에 따라서:




그림 1: 평행이동의 개략도


노즐은 (실제로) 다른 거리인 L(실제 우리가 측정할 수 있는 거리)을 이동한다. 이것은 계산된 Dh가 실제 수치와 입력된 수치의 차이로 인해 달라졌기 떄문이다. 이때 실제 측정할 수 있는 L값을 이용해서 실제 "diagonal road"값 D를 계산해 볼 수 있다.



이 식에서 볼 수 있듯 직교방향(수직-수평간)의 수치 오차는 "diagonal rod"값에만 영향을 받는 것을 알 수 있는데, 이것을 바탕으로 각 축(tower)의 "diagonal rod"값에서 생긴 에러를 분간할 수 있다.



3. 적용


이러한 방법을 확인할 수 있는 쉬운 도구는 "Thingiverse"에 올렸다(http://www.thingiverse.com/thing:1274733).


상기 계산을 적용하기 위해서는 식 (1), (2) 및 (3)을 풀어야 한다. 정확한 "diagonal rod" D값을 계산하려면 L*, L, R, D0값을 구해야하고, 이를 위해 조형물을 하나 출력해서 측정해고 대입해야 한다. 이때 좋은 방법은 육각형을 출력하는 것인데, 각 축 방향으로 두 면을 가지고 있어 두번의 측정을 통해 두 배의 정확도를 가질 수 있기 때문이다.


a. Thingiverse 파일 사용

적용은 간단히 첨부된 육각형을 출력하고, 실제 출력된 길이를 측정하여 첨부된 스프레드시트에 넣으면 가능하다.

출력은 아무런 XY 치수나 "diagonal rod" 값을 수정하지 않아야 하며, 기계부 수정도 없이  진행해야 한다.

측정값의 표기는 아래 그림 2에 표시하였다.

그림 2: 육각형 출력물 측정

L은 양쪽 마주보는 면의 사이 거리로, 각 축방향의 직교방향으로 Lx, Ly 및 Lz가 측정해야할 길이이다.

Lx, Ly 및 Lz를 실제 상기 수식에 적용하기 위해서는 반으로 나눠야하는데, 이는 상기 식이 베드 중심에서 이동한 것으로 가정한 것이기 때문이다. 이것은 이미 주어진 엑셀 시트에 반영되어 있다.

Lx, Ly 및 Lz값을 엑셀 시트 LX, LY, LZ에 대입하여 넣고, 현재 펌웨어에 입력되어있는 "horizontal radius"와 "diagonal rod"값도 엑셀 시트에 넣어주면 아래 그림과 같이 결과를 얻을 수 있다.

그림 3: 스프레드 시트 입력 예시

i. 리피터 펌웨어 값 수정

상기 값을 이용해서 그림 4와 같이 리피터 소포트웨어에서 값을 수정할 수 있다. 

그림 4: Eprom 메모리 에디터 창

ii. 마를린 펌웨어 값 수정

마를린 펌웨어에서 각 "diagonal rod"값을 수정하는 것은 까다로운데, 아주 어려운 것은 아니다. 아래 내용은 하나의 방법으로 각 사용자에 따라 다른 버전 및 변형된 마를린을 사용하고 있으므로 아래 코드 부분이 이 사용자의 코드에 없을 수 도 있다.

1 단계

마를린 소스코드에서 "Marlin_main.cpp"를 연다. 그림 5에 있는 코드를 찾아서 그림 6의 코드로 수정한다. "Diag_rod_x", "Diag_rod_y" 및 "Diag_rod_z"가 새로운 "diagonal_rod" 값이다.

그림 5: 마를린의 원래 코드

그림 6: 새로운 코드

2 단계

그림 7의 코드를 그림 8의 코드로 바꿔준다.

그림 7: 마를린의 원래 코드

그림 8: 새로운 코드

3 단계

마지막으로 "Configuration.h"에서 DEFAULT_DELTA_DIAGONAL_ROD 값을 스프레드 시트에 있는 값으로 수정해 준다.

iii. 예제

패쓰.


4. FAQ

패쓰


5. 번역한 사람의 경우

a. 측정

그림 9. 교정을 위한 육각형 출력물

- 육쪽마늘 같은 출력물에 각 마주보는 변 사이를 측정해서 엑셀 시트에 투입하여 값 산출

- 처음 기존 치수가 맞지 않는 세팅값으로 출력한 것: 1st

- 수치 측정하여 펌웨어 수정 후 출력한 것: 2nd

- 다시 출력 후 "diagonal rod"값 재수정한 것: 3rd

그림 10. 최종 수정 후 20mm 큐브 결과물

- 교정 전 큐브 크기 가로 21.5, 세로 22mm 수준으로 오차에서 20±0.05mm로 교정 완료

b. 마를린 코드

저는 Anycubic Delta Kossel 버전의 마를린이었기 때문에, 제 경우에는 마를린코드가 달랐습니다. 

아래와 같이 수정하였습니다.

• "Configuration.h"에서:

(1) DELTA_DIAGONAL_ROD 부분

#define DELTA_DIAGONAL_ROD 217                     ← 원래 입력되있던 값

 

 

#define DELTA_DIAGONAL_ROD_X 221.324  

#define DELTA_DIAGONAL_ROD_Y 221.119 ← 스프레드 시트 결과 값

#define DELTA_DIAGONAL_ROD_Z 221.324  

(2) DELTA_DIAGONAL_ROD_2 부분

#define DELTA_DIAGONAL_ROD_2 pow(DELTA_DIAGONAL_ROD,2)  

#define DELTA_DIAGONAL_X_ROD_2 pow(DELTA_DIAGONAL_ROD_X,2)

#define DELTA_DIAGONAL_Y_ROD_2 pow(DELTA_DIAGONAL_ROD_Y,2)

#define DELTA_DIAGONAL_Z_ROD_2 pow(DELTA_DIAGONAL_ROD_Z,2)1

• "Marlin_main.cpp"에서:

(1) calculate_delta 함수 부분

 delta[X_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2

                      - sq(DELTA_TOWER1_X-cartesian[X_AXIS])

                      - sq(DELTA_TOWER1_Y-cartesian[Y_AXIS])

                      ) + cartesian[Z_AXIS];

 delta[Y_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2

                      - sq(DELTA_TOWER2_X-cartesian[X_AXIS])

                      - sq(DELTA_TOWER2_Y-cartesian[Y_AXIS])

                      ) + cartesian[Z_AXIS];

 delta[Z_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2

                      - sq(DELTA_TOWER3_X-cartesian[X_AXIS])

                      - sq(DELTA_TOWER3_Y-cartesian[Y_AXIS])

                      ) + cartesian[Z_AXIS];

delta[X_AXIS] = sqrt(DELTA_DIAGONAL_X_ROD_2

                      - sq(DELTA_TOWER1_X-cartesian[X_AXIS])

                      - sq(DELTA_TOWER1_Y-cartesian[Y_AXIS])

                      ) + cartesian[Z_AXIS];

 delta[Y_AXIS] = sqrt(DELTA_DIAGONAL_Y_ROD_2

                      - sq(DELTA_TOWER2_X-cartesian[X_AXIS])

                      - sq(DELTA_TOWER2_Y-cartesian[Y_AXIS])

                      ) + cartesian[Z_AXIS];

 delta[Z_AXIS] = sqrt(DELTA_DIAGONAL_Z_ROD_2

                      - sq(DELTA_TOWER3_X-cartesian[X_AXIS])

                      - sq(DELTA_TOWER3_Y-cartesian[Y_AXIS])

                      ) + cartesian[Z_AXIS];



Posted by Chuck Hong