중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

미니프린터-열전사 프린터 사용

2014-08-12 17:22:48

개요


아두이노에 연결할 수 있는 장치들 중 하나인 열전사 프린터를 아두이노로 제어해보자.
이 손바닥만한 프린터는 간단한 문구나 바코드를 인쇄할 수 있고 글씨에 밑줄과 폰트 변경 등 약간의 효과를 줄 수 있다.

아래 사진은 아두이노로 제작한 3D프린터 이다. 왼쪽 모니터에 구현된 사물을 프린터가 구현하는 모습이다.




현재 아두이노로 3D프린터를 활발히 개발 중이고 Item의 Lifecycle이 빠른 주기로 바뀌는 이 시점에서 나온지 좀 된 열전사 방식의 이 프린터는 메리트가 없다고 느낄 지 모르겠지만 아직까지 바코드나 소형 메모가 필요한 도서관 등지에서는 유용하게 쓰이고 있고 또 막상 사용해본다면 소형프린터를 사용해본다는 호기심과 매력에 끌려 충분히 재미를 느낄만한 물건이라고 생각한다.

 

 

부품 목록

 

NO
부품명
수량
상세정보
1 아두이노 1  오렌지 보드
2 미니 프린터  1  
3 5~9V 어댑터 1  
4 케이블 3  

 

 

부품명 아두이노  미니프린터 5~9V 어댑터 케이블
부품사진   

 

 

하드웨어 making

전자 회로도 

 

 

 

브레드 보드


 

 

 

소프트웨어 coding

 

/*
 Example 38.2 - Sparkfun Thermal Printer Test II (COM-10438)
 http://tronixstuff.com/tutorials > chapter 38
 Based on code by Nathan Seidle of Spark Fun Electronics 2011
 */
#include <SoftwareSerial.h>

SoftwareSerial Thermal(2, 3);
int zero=0;
int heatTime = 80;
int heatInterval = 255;
char printDensity = 15; 
char printBreakTime = 15;
void setup() 
{
 Serial.begin(57600); //시리얼 통신 설정
 Thermal.begin(19200); //프린터와의 통신 설정
 initPrinter();
}

//프린터의 초기 설정값 구현
void initPrinter()
{
 //프린터 dots, Heating time, heating interval시간 설정
 Thermal.write(27);
 Thermal.write(55);
 Thermal.write(7); //Default 64 dots = 8*('7'+1)
 Thermal.write(heatTime); //Default 80 or 800us
 Thermal.write(heatInterval); //Default 2 or 20us
 //프린터 density, breakTime설정
 Thermal.write(18);
 Thermal.write(35);
 int printSetting = (printDensity<<4) | printBreakTime;
 Thermal.write(printSetting); //Combination of printDensity and printBreakTime
 Serial.println();
 Serial.println("Printer ready"); 
}
void loop()
{
 // 밑줄 1pixel로 사용
 Thermal.write(27);
 Thermal.write(45); 
 Thermal.write(1);
 Thermal.println("Underline - thin");
 Thermal.println("01234567890123456789012345678901"); 
 Thermal.write(10);
// 밑줄 2pixel로 사용
 Thermal.write(27); 
 Thermal.write(45);
 Thermal.write(2); 
 Thermal.println("Underline - thick");
 Thermal.println("01234567890123456789012345678901"); 
 Thermal.write(10);
// 밑줄 사용 X
 Thermal.write(27); 
 Thermal.write(45);
 Thermal.write(zero);
 delay(3000);
 Thermal.write(10);
// bold체 사용
 Thermal.write(27); 
 Thermal.write(32);
 Thermal.write(1);
 Thermal.println(" #### Bold text #### ");
 Thermal.println("01234567890123456789012345678901"); 
 delay(3000);
// bold체 사용 X
 Thermal.write(27); 
 Thermal.write(32);
 Thermal.write(zero);
 Thermal.write(10); //Sends the LF to the printer, advances the paper
 delay(3000);
// 글자 크기 확대
 Thermal.write(29); 
 Thermal.write(33);
 Thermal.write(255);
 Thermal.println("ABCDEF");
 Thermal.println("012345"); 
 delay(3000);
// 기본설정으로 다시 세팅
 Thermal.write(29); 
 Thermal.write(33);
 Thermal.write(zero);
 delay(3000);
Thermal.write(10);
 Thermal.println("back to normal");
 Thermal.write(10);
 Thermal.write(10); 
 do { } while (1>0); // do nothing
}

내용은 소스코드이기 보다 기존에 있는 프린터 관련 소스를 돌려보는것에 가깝다.

 

소스 출처

위의 소스는 위 링크에서 가져온 소스로 프린터에 관련한 폰트나 굵기 밑줄관련하여 여러가지를 출력해보는 예제 소스이다.
프린터 자체가 출시된지 오래되었기 때문에 기존에 잘 돌아갔던 소스임에도 컴파일과정에서 버전차이등으로 인해 오류가 뜨는 경우가 있다.

통신은 SoftwareSerial라이브러리를 사용하여 디지털2번핀(Tx)에 녹색선 연결, 디지털3번핀(Rx)에 노란색선을 연결하여 시리얼통신을 한다.  
프린터는 Thermal이라는 객체를 생성하여 프린터를 제어한다. 
write()함수를 통해 프린터를 제어하는데 write함수안에 들어가는 매개변수 명령어set은 양이 많아 따로 매뉴얼에 나와있으니 참고하길 바란다.

메뉴얼 링크 (command set에서 Decimal 부분을 참조)


많이쓰는 몇가지만 보면 write(10)은 라인피드(줄바꿈)를 나타내고 write(27); write(50);은 줄간격의 초기화를 나타낸다.



위 소스에서 또 write(27); write(45);는 밑줄을 사용한다는 명령어를 나타낸다. write(45)밑의 write();은 굵기를 나타냄으로 zero가 들어갈 경우 밑줄을 삭제하고 1-2사이는 밑줄의 굵기를 나타내게 된다. 이런 명령어set을 숙지한다면 자신이 원하는 문구또한 폰트나 디자인을 지정하여 인쇄가 가능하다.
 

write(27); write(32);는 bold체를 사용할 것인지 여부에 대한 명령어set으로 그 다음에 오는 write함수의 매개변수가 write(1)면 bold체를 사용하고 write(0)이면 사용하지 않게 된다.

 


 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

열전사 프린터, 아두이노, 오렌지보드