킥스타터에서 주문했습니다. 2016년 7월에 주문했는데, 해를넘겨 2017년 1월에 배송됐네요.
이렇게 패키징 되어 있었습니다.
비닐을 벗겨내고 다시 한 번 샷.
보시다 시피 조립하는 부품들이 모두 컴포넌트화 되어 있습니다.
모두 메탈바디로 되어 있어 꽤나 묵직하고 아주 튼튼해 보입니다. [ 조립설명서 다운로드 ]
조립 설명서를 보면서 따라해 보면 총 10단계로 간단히 조립이 끝납니다.
나사는 모두 육각나사로 되어 있고, 육각봉과 핀셋이 함께 동봉되어 있어 아무것도 없이 조립을 완료할 수 있습니다.
조립 완성! 30분이 채 걸리지 않았습니다.
배선은 모두 커넥터가 색상 별로 구분되어 있어서 보드에 색깔맞춰 연결만 시켜주면 됩니다.
완성된 외양을 보시면 우선 아주 튼튼합니다. 그리고 베드가 너무 작네요. (120x125x125 입니다.)
베드는 플라스틱(?) 재질로 히트베드가 아닙니다.
위쪽에 불 들어온 부분이 보드구요, 여기에 SD 카드를 꽂을 수 있습니다.
LCD 가 없습니다.!!!!!!! 카드를 꽂으면 어떻게 파일을 선택해서 프린트 하지???? 걱정했는데,
SD카드를 꽂으니까 알아서 프린트를 시작합니다.... 이 부분은 뒷부분에서 다시 설명하죠.
프린트 되는 동영상을 타임랩스로 다 찍고 싶었으나... 촬영도중에 전화가 와서 여기까지만...
출력 결과는 이렇습니다.
출력물 입니다. 이게 데모 출력물 입니다. 역시.. 끝까지 출력하고 싶었으나, 중간에 코드를 잘못 뽑아서 멈춰버렸네요. 암튼, 퀄리티는 매우 좋습니다. 오히려 사진이 실물보다 못나와 보이네요.
Z축 레벨링을 하지 않은 상태라서 간격이 매우 컸는데, 라프트가 받쳐줘서 잘 나오네요.
Thingiverse 에 있는 프린터 테스트용 모델을 출력해 봤습니다.
슬라이싱은 포럼에서 받은 설정으로 Simplify3D 를 사용했는데, top 면이 빈 틈이 좀 보이는게 약간 수정이 필요할 듯 합니다.
보시면 베드에 금이 그어져 있는 것이 특이한데요, 출력을 몇 번 해보니 그 용도를 알게 됐습니다.
첫 레이어용 필라멘드를 뿌리면 저 틈새에도 들어가면서 출력물이 좌우로 흔들리거나 떨어지지 않게 잡아주는 역할을 하게 됩니다. 그래서 출력하고 나면 출력물 바닥면에 틈새에 들어가서 굳은 격자무늬가 보입니다.
일단, 이 프린터는 무조건 라프트(Raft)를 설정해서 뽑아야 할 것 같습니다.
이 프린터는 슬라이서 프로그램을 따로 지원하고 있습니다.
Pango 라는 프로그램인데 별로 좋아보이진 않습니다.
USB 케이블을 연결해서 프린트 할 수 있구요, SD카드에 담아서 프린트 할 수 있습니다. (전 LCD가 없으니 못하네요)
이 프로그램으로 Z 오프셋을 설정할 수 있습니다. 오프셋 설정하고 나서는 이 프로그램 쓸 일이 없어 보입니다. 슬라이서는 제가 주로 사용하는 Simplify3D 를 사용할 예정입니다. Kodama 의 포럼 사이트에서 Simplify3D 용 설정 파일을 찾을 수 있었습니다.
SD카드에 autoprint.gcode 라는 파일명으로 저장해 놓으면 SD카드를 꽂았을 때 자동으로 프린트 됩니다.
데모 프린트 파일은 autoprint.pcode 라는 파일로 저장되어 있었습니다. gcode, pcode 모두 지원하고 있습니다. (pcode 는 paladin 펌웨어용 머신 코드 입니다.)
동봉되는 SD카드에는 autoprint.pcode 와 함께, 조립 메뉴얼(pdf), Pango 슬라이서 (윈도우용, 맥용) 가 들어 있습니다. 또 샘플용 나사뭉치 모델 파일(stl)파일도 있습니다.
이 프린터의 특징은 익스트루더 뭉치를 레이저 장치로 바꿀 수 있다는 건데요. 그래서 2-in-1 이라는 것이 컨셉이죠. 그 외에도 히드베드나 LCD, 케이스 등등 모두 컴포넌트화 되어서 부속별로 별도로 판매되고 있습니다.
저는 가장 기본 패키지만 구매해서 레이저나 히드베드, LCD 등이 없습니다. 히드베드나 케이스, 레이저는 아직 없어도 될것 같고, LCD 패널은 당장 사야할 것 같습니다.
기본 사양을 정리해 보면 이렇습니다.
Bed Size : 120 x 125 x 125 (y axis reversed)
Filament : 1.75mm (ABS, PLA, wood, aluminum, bronze, PC, flex and many others)
File format : gcode, pcode
Slicer : Pango
Max. Temp: 255 degrees
firmware : Paladin
총 평입니다.
1. 컴포넌트화 되어 있는 퀄리티가 높고 하드웨어 구성이 인상적이다. 2. 베드가 너무 작아 아쉽다. 3. 풀메탈 바디라 정말 견고하다. 흔들림, 뒤틀림 없고 심지어 프린트 중에 들어 옮겨도 잘 출력된다. 4. 출력물 퀄리티는 매우 만족스럽다. (productivity quality 가 광고 문구 였음) 5. 출력할 때는 Raft를 해야 한다.
크기가 작은 고퀄리티 출력물을 원하거나
작은 레이터 커팅기와 프린터를 모두 원한다면 선택할만 합니다.
여담으로, 배송이 너무 느렸는데, 그동안 담당자와 계속 메일도 주고받고, 사이트에 소식도 보면, 공장이나 배송 체계에서 문제가 있었던 모양입니다. 스타트업이라 그 부분이 정착되지 않았었는데, 이제 마무리 되어 밀린 주문을 해결 중이라고 합니다. 이제 부터 구매한다면 저처럼 많이 기다리지는 않겠네요. LCD 패널을 미리 확인하지 못하고 구매하지 못해 아쉽습니다. 이 리뷰를 마치고 바로 주문해야 겠어요. 전원 스위치가 없드라구요! 끄려면 아답타 코드를 뽑아야 합니다. 스위치 달린 멀티탭도 하나 사야겠네요.
리모콘으로 부터 입력받은 키를 시리얼 모니터에 출력합니다.
IRRemote.hpp 를 사용하는데, 아래 코드를 사용하면 됩니다.
<IrRemote.hpp>
#include <IRremote.h>
#define Unkown 0x0
#define CHm 0xFFA25D
#define CH 0xFF629D
#define CHp 0xFFE21D
#define REW 0xFF22DD
#define FF 0xFF02FD
#define PLAY 0xFFC23D
#define Minus 0xFFE01F
#define Plus 0xFFA857
#define EQ 0xFF906F
#define NUM0 0xFF6897
#define p100 0xFF9867
#define p200 0xFFB04F
#define NUM1 0xFF30CF
#define NUM2 0xFF18E7
#define NUM3 0xFF7A85
#define NUM4 0xFF10EF
#define NUM5 0xFF38C7
#define NUM6 0xFF5AA5
#define NUM7 0xFF42BD
#define NUM8 0xFF4AB5
#define NUM9 0xFF52AD
#define _CHm 0xE318261B
#define _CH 0x511DBB
#define _CHp 0xEE886D7F
#define _REW 0x52A3D41F
#define _FF 0xD7E84B1B
#define _PLAY 0x20FE4DBB
#define _Minus 0xF076C13B
#define _Plus 0xA3C8EDDB
#define _EQ 0xE5CFBD7F
#define _NUM0 0xC101E57B
#define _p100 0x97483BFB
#define _p200 0xF0C41643
#define _NUM1 0x9716BE3F
#define _NUM2 0x3D9AE3F7
#define _NUM3 0x6182021B
#define _NUM4 0x8C22657B
#define _NUM5 0x488F3CBB
#define _NUM6 0x449E79F
#define _NUM7 0x32C6FDF7
#define _NUM8 0x1BC0157B
#define _NUM9 0x3EC3FC1B
class IRRemote {
private:
long _lastValue = 0;
bool use_repeat = true;
IRrecv *irrecv;
decode_results results;
public:
IRRemote(int signalPin) {
irrecv = new IRrecv(signalPin);
}
~IRRemote() {
delete irrecv;
}
/**
IR센싱 시작
*/
void start() {
irrecv->enableIRIn();
}
/**
버튼을 누르고 있는 동안 값을 전달할지 여부 결정 (기본값 : true)
@param repeatable 반복키 사용여부
*/
void useRepeat(bool repeatable) {
use_repeat = repeatable;
}
/**
IR센서값 읽기
@return 값 입력 여부
*/
bool receive() {
int received = irrecv->decode(&results);
if (received) {
irrecv->resume();
adjustValue(&results);
//if (results.decode_type == UNKNOWN) return false;
if (!isValid(results.value)) return false;
if (!use_repeat && results.value == 0xFFFFFFFF) {
_lastValue = Unkown;
return false;
}
parseValue();
}
return received ? true : false;
}
/**
입력된 센서값 조회
@return 센서값
*/
long value() {
return _lastValue;
}
/**
입력된 센서값을 텍스트로 반환
@return 눌려진 버튼 텍스트
*/
const char* toString() {
switch (_lastValue) {
case CHm : return "CH-";
case CH : return "CH";
case CHp : return "CH+";
case REW : return "|<<";
case FF : return ">>|";
case PLAY : return ">||";
case Minus : return "-";
case Plus : return "+";
case EQ : return "EQ";
case NUM0 : return "0";
case p100 : return "100+";
case p200 : return "200+";
case NUM1 : return "1";
case NUM2 : return "2";
case NUM3 : return "3";
case NUM4 : return "4";
case NUM5 : return "5";
case NUM6 : return "6";
case NUM7 : return "7";
case NUM8 : return "8";
case NUM9 : return "9";
}
return "";
}
protected:
void adjustValue(decode_results *recv) {
long value = recv->value;
switch (value) {
case _CHm : recv->value = CHm; break;
case _CH : recv->value = CH; break;
case _CHp : recv->value = CHp; break;
case _REW : recv->value = REW; break;
case _FF : recv->value = FF; break;
case _PLAY : recv->value = PLAY; break;
case _Minus : recv->value = Minus; break;
case _Plus : recv->value = Plus; break;
case _EQ : recv->value = EQ; break;
case _NUM0 : recv->value = NUM0; break;
case _p100 : recv->value = p100; break;
case _p200 : recv->value = p200; break;
case _NUM1 : recv->value = NUM1; break;
case _NUM2 : recv->value = NUM2; break;
case _NUM3 : recv->value = NUM3; break;
case _NUM4 : recv->value = NUM4; break;
case _NUM5 : recv->value = NUM5; break;
case _NUM6 : recv->value = NUM6; break;
case _NUM7 : recv->value = NUM7; break;
case _NUM8 : recv->value = NUM8; break;
case _NUM9 : recv->value = NUM9; break;
}
}
long parseValue() {
long value = results.value;
if (value == 0xFFFFFFFF) { //repeat
return _lastValue;
}
_lastValue = value;
return value;
}
bool isValid(long value) {
switch (value) {
case CHm :
case CH :
case CHp :
case REW :
case FF :
case PLAY :
case Minus :
case Plus :
case EQ :
case NUM0 :
case p100 :
case p200 :
case NUM1 :
case NUM2 :
case NUM3 :
case NUM4 :
case NUM5 :
case NUM6 :
case NUM7 :
case NUM8 :
case NUM9 :
case 0xFFFFFFFF:
return true;
}
_lastValue = Unkown;
return false;
}
};
키를 한 땀 한 땀 입력하면서 얻은 값을 바탕으로 만들었습니다.
같은 키인데도 여러경우의 값이 나타나게 되서 두가지 케이스만 적어 넣었습니다.
입력 각도가 기울어지거나 거리가 멀어지면 쓰레기값이 입력되거나
엉뚱한 값이 나오게 -값이 중간에 잘리거나 하는 것 같습니다- 되어 인식률이 빠릿빠릿 하진 않습니다.