본문 바로가기

IT/3D Printing

큐비콘 싱글과 Octoprint를 연동해보자.

-- 본 포스팅에서 사용한 Octoprint에 CANVAS Hub라고 출력되는 것은, Palette 2 Pro 연동을 위하여 관련 플러그인을 설치하였기 때문으로, 본 포스팅에서 설명하는 내용에는 영향을 주지 않음을 미리 알려둔다. --


큐비콘 싱글이 기반으로 하는 Repetier Firmware가 매우 구버전인데다가, 자체적으로 busy protocol 비슷하게 구현해넣은 부분 때문에 Octoprint의 연동이 매우 어려워 보였다.

( 큐비콘 싱글에서 Octoprint 사용이 어려운 이야기 - http://miraclepocket.tistory.com/91 )


하지만, 해결책은 어떻게든 나오는 법... 앞서 올렸던 포스팅에서 해결책으로 적었던 것들보다 더 간편한(?) 방법을 찾게되어 적어본다.


1. 동작 시간이 긴 명령 수행 시 timeout 문제 해결


그런데... 어째서 Octoprint에서 G28 명령을 줬을 때는 그냥 멍~이다가, 큐비크리에이터에서 G28 명령을 줬을 때는 "S3 AutoTilt Alignment" 메시지를 쭈욱 출력할까?



앞서 올린 포스팅에서는 Octoprint가 인식하지 못하는 메시지는 시리얼 로그로도 남기지 않는 것 같다고 썼지만, Simplify3D를 가지고 연결한 후 G28 명령을 때려보니 그런 것이 아님을 알 수 있었다. 이쪽에서도 멍~하고 있을 뿐이었고, 그나마 Octoprint처럼 timeout을 내는 것이 아니라 AutoTilt Alignment가 끝나고나면 ok가 반환되는 것까지 확인할 수 있었다.


그럼 이건 조건이 있다는건데...


다행히 큐비콘측으로부터 받아서 가지고 있던 펌웨어 소스가 있었기에, "S3 AutoTilt Alignment" 문구를 출력하는 부분을 찾을 수 있었다. 그리고, 해당 문구는 출력이 되는 조건이 정해져 있었다... (어떤 조건인지는 소스코드 내용이라 여기서 적기는 약간 부적절해보임)


그리고 그 조건에 들어갈 수 있도록 해 주는 명령도 소스코드에서 찾을 수 있었으니, 바로 "M902"라는 명령이었다. 이 명령은 "M902 [문자열]"의 형태로 사용하는데, 표면적인 동작만 봐서는, 큐비콘 싱글의 LCD에 출력할 파일 이름을 찍어주는 정도의 용도다.


[주의할 점: M902 뒤에 문자열을 적는 것은 맞는데... 아무거나 적으면 Format error라는 메시지와 함께 동작이 거부되는 경우가 있다. 그냥 얌전히 TEST로 적고 쓸 생각...]


"M902 SCHOOL DAYS" 실행 직후의 LCD


하지만, 내부 구현에서는 이 명령이 호출되는 경우, PC와 연결하여 출력하는 경우로 판단하도록 되어 있는 것으로 보이며, AutoTilt Alignment 같이 긴 시간이 소요되는 행위를 수행할 때, 일종의 busy protocol과 같이 메시지를 해당 행위가 종료될 때까지 계속 PC쪽으로 송신하는 행위를 수행한다.


M902 수행 전에는 M109, M190 명령 등으로 핫엔드, 핫베드의 온도를 올려보면 멍~하고 있다가 타임아웃이 나기 일쑤였다. 하지만 M902 수행 후에는 일반적인 Marlin 펌웨어처럼 현재 온도 데이터를 계속 반환한다.





G28 명령 수행 시에도 의도한대로 "S3 AutoTilt Aligmnelt"가 출력되는 것을 볼 수 있다.




그리고 끝난 후에는 깔끔하게 ok. 여기까지도 timeout은 발생하지 않았다.


고맙게도 Octoprint는 프린터에서 뭔가 계속 오면 timeout을 발생시키지 않는 것으로 보인다. 아마 다양한 프린터를 지원하기 위해서 반환되는 메시지의 포맷 같은 것을 한정하지 않는 것이 아닐까 싶고, 그 덕에 이번 문제를 해결할 실마리를 잡은 셈이다.


그럼 이제, 가장 큰 문제는 하나 해결...


2. 프린터와의 Connection 안정화(?)


프린터가 Octoprint와 연결할 때 좀더 잘 연결되도록 해 보자.


Octoprint에서 프린터를 auto detection할 때는 M110 N0 이라는 gcode를 전송하여 응답을 보고 찾는다. 그런데, 큐비콘 싱글에서는 막상 해 보면, baudrate를 정확하게 250000bps로 설정하고 연결을 시도하면 연결이 안되며, baudrate를 auto detect로 놓고 잡으려고 해도 종종 250000bps에서 5번 시도 후, 230400bps로 넘어간 후에 뒤늦게 응답을 받는 바람에 엉뚱한 baudrate으로 인식되는 경우가 발생한다. 물론, 정상적인 동작이 안된다...;


하지만 큐비크리에이터와 연결할 때 시리얼 통신을 잡아보면, 약간 다른 양상이 보인다.

큐비크리에이터는 프린터를 찾으면 M912, M913이라는 커스텀 gcode를 전송한다.

M912는 제품 모델명을 반환(여기서는 3DP-110F), M913은 펌웨어 버전(여기서는 2.3)을 반환한다.


메시지 캡쳐가 불안정했을지 모르겠지만... M912를 M110 N0 대신 써봐도 되지 않을까?


그래서 설정을 이렇게 바꿔보았다.




항목의 위치는 Serial Connection - Firmware & Protocol이다.


그리고, 큐비콘 싱글은 PC와 연결될 때, 제품이 재부팅을 하도록 되어 있다. 당연히 이에 따른 딜레이도 약간 발생할 것이다.


그래서 Serial Connection - Intervals & timeouts 에서도 Initial baudrate detection pause 항목의 설정을 넉넉하게 5초로 변경하였다.



마지막으로, 펌웨어 종류를 자동으로 판별하는 기능을 끄고, checksum을 보내는 기능을 껐다.


사실, Octoprint에서 프린터로 보내는 명령의 무결성을 보장하기 위한 checksum은 켜놓고 쓰는 것이 좋다. 하지만 현 상황은 시리얼 통신 과정 하나하나마다 뭔가 시원하지 않은 느낌을 주는 상황인데다가, 테스트 과정에서 오류가 발생하기도 하였으니...;;


게다가 만약 checksum 검사의 일부 로직이 커스터마이즈되어 있기라도 하면...


그래서, 마침, 큐비콘 싱글의 소스코드에서 checksum 검사가 강제되어 있지는 않길래, 끄고 써본다.


설정은 Serial connection - Firmware & Protool에서 변경할 수 있다.



3. 마치며


솔직히 말해서, 완벽한 해결책은 아니다.


가장 좋은 해결책은 큐비콘측에서, 펌웨어를 busy protocol이 지원되는 Repetier Firmware 최신 버전으로 올려주고, 큐비크리에이터를 거기에 맞춰서 수정해주는 것이겠으나...


안해줄 것 같으니, 일단 이렇게라도 써 보자는 것이다.


언젠가는 아예 펌웨어를 바꿔보고 싶은 생각도 있지만... 아마 상당한 시간이 지난 후가 되지 않을까...? :-)