elsa in mac

CoreXY 3D 프린터에 Marlin 펌웨어 적용 시 S3D 의 Bed Temperature Spike 현상 본문

3D 프린터/3D 프린터 관련 정보

CoreXY 3D 프린터에 Marlin 펌웨어 적용 시 S3D 의 Bed Temperature Spike 현상

elsa in mac 2018. 10. 10. 13:01

S3D Marlin 아이콘 이미지

CoreXY 3D 프린터에 Marlin 펌웨어를 적용할 시, 그리고 Slicer로 Simplify3D 를 사용할 경우, 매우 특이한 현상을 확인하게 됩니다. 이 것은 최근의 Marlin 펌웨어에서 볼 수 있는 현상인데요.. 아래와 같이 HeatBed의 현재 온도 그래프가 엉망 진창이 되는 현상 입니다. 

S3D 메인 창 스샷

거의 숫자를 알아볼 수 없을 정도로 높은 온도 또 반대로 낮은 온도 그래프가 만들어 지면서, Graph 전체가 망가지는 현상 입니다. 일명 Temperature Spike 현상인데요..  일단 이런 그래프를 보게 되면 급 당황하게 됩니다. 온도 센서인 Thermistor가 망가진 것인가 ? 항상 나오는 것도 아니기 때문에, 그냥 지나칠 수도 있는 문제이기도 하죠..

CoreXY에서 특히 이와 같은 Bug아닌 Bug 현상이 보이는 이유는 무엇일까 ?  
직접적인 원인은 Simplify3D가 Controller로 부터 받은 온도 센싱 정보를 분석하는 Parsing 루틴의 허술함에 있다고 할 수 있으며, 반대로 Marlin에서 메시지 형식을 보다 꼼꼼하게 체크하지 못했기 때문이기도 합니다. 

무슨 말인지 좀 따져 봅니다.
일단, Gcode. 특히 현재의 온도를 보고하는 M105 Gcode의 형식은 아래와 같습니다. 

SENT: M105

READ: ok T:21.80 /0.00 B:22.59 /0.00 @:0 B@:0

S3D는 현재의 온도를 그래프로 표시하기 위해 Controller에 현재의 온도 정보를 주기적으로 물어보게 됩니다. (M105) 즉, Simplify3D가 M105를 Controller에 보내면, Controller가 그 응답으로 T: B: @ Message를 보내오는 것이죠. S3D는 이 Message구문을 분석하여 그래프로 보여 줍니다. 

T:는 Hotend의 현재 온도 B: 다음에 오는 숫자는 Heating Bed의 현재 온도로 인식을 하는 것인데요, 여기까지는 문제가 없습니다. 

Marlin 의 System 설정을 CoreXY로 하게 되면, 특정 GCode를 수행하였을 때, USB를 통해 상황에 따라 특정 Message를 보냅니다.  이는 Simplify3D가 요청한 메시지도 아닙니다. 아래는 CoreXY 3D 프린터에서 Homing 명령(G28)을 수행했을 때 날라오는 메시지의 예 입니다. 

READ: X:32.00 Y:0.00 Z:0.00 E:0.00 Count A:1800 B:1200 Z:0

이 메시지는 stepper 모터의 현재 상태를 보여주는 상태 정보로 G92 명령으로 사용자가 언제든 확인해 볼 수 있는 메시지 이기도 합니다.

문제는 위의 메시지 표시 했듯이, 이 정보에도 B: 구문(Syntax)이 포함되어 있다는 점 입니다. 

Simplify3D는 이 Message를 수신하면, 역시 구문 해석을 통해 B:를 Heating Bed 현재 온도로 인식하여 무려 1200도로 인식을 하게 되는 것 입니다. 

이 Message는 Marlin Firmware의 소스코드를 분석해 보면, report_current_position(); 함수 호출에 의해 뿌려지게 되는데, CoreXY로 설정된 경우, 메시지 형식에 위와 같이 A: B: Z: Count 정보가 추가적으로 포함되게 됩니다. 

따라서, 현제 위의 버그를 잡는 유일한 방법은 Marlin이 뿌려주는 Message구문을 바꾸는 것입니다.  
변경할 소스코드는 marlin/src/module/stepper.cpp 파일이며, 아래와 같이 stepper 클래스의 report_positions() 함수를 찾고, 그 내용 중에 

Marlin Stepper.cpp 소스코드 스샷

SERIAL_PROTOCOLPGM(" B:"); 부분을 주석처리하거나 혹은 Count_B: 로 바꿔주는 것 입니다. 이렇게 처리하면, S3D와 연결되어도 B: 구문 대신 Count_B: 로 표시되게 때문에 B:를 Bed 온도로 오인하는 문제를 바로 잡을 수 있습니다. 

위의 코드를 보면, 해당 메시지는 CoreXY, CoreYZ, Delta, Scara 형식의 3D프린터일 경우에도 뿌려주는 것으로 되어있기 때문에, 해당 프린터에 Marlin을 적용하고 S3D를 사용하는 유저라면 위와 똑같은 버그 현상을 경험할 수도 있을 것이라 판단이 됩니다. 

결론적으로, 위와 같은 현상은 실제로 H/W(온도센서)가 고장나서 발생하는 문제가 아닌 두 S/W 간의 Message 파싱을 고려 하지 않은데 기인한 버그 아닌 버그인 셈입니다. 

혹시, 동일한 증상으로 고민하고 계신 분들이라면 참고하시기 바랍니다. ^^


공유하기 링크
Comments