휴대폰이 사람들의 삶의 중심이 되다보니 중요한 메시지는 휴대폰으로 다 모이죠. 한시라도 휴대폰 화면을 보지 못하면 사람들과 세상에서 멀어지는 불안감이 느껴지는걸 보면 생활 패턴을 좀 바꿔야 하지 않나 생각도 듭니다. 그래서 만들어 본 것이 “프린트 봇” – 메시지 로그 프린터 입니다.

“프린트 봇”은 휴대폰과 블루투스로 연결되어, 자신이 미리 설정한 알림이 오면 종이에 출력해줍니다. 조금이나마 아날로그적인 감성을 느끼실 수도 있을겁니다.

가장 핵심이 되는 프린트 기능을 위해 열전사 프린터(thermal printer)를 사용합니다. 카드 영수증 출력해주는 프린터와 유사한데 DIY 용으로 파는게 있어서 어렵지 않게 구할 수 있습니다. 해외에서는 라즈베리파이와 연결해서 즉석 사진 프린터로 만들어 쓰기도 하고 날씨 및 각종 정보를 출력해주는 DIY에 사용하기도 합니다. 조금만 상상력을 발휘하시면 여기 소개된 프로젝트보다 훨씬 재밌는 것도 만들어 보실 수 있을겁니다.

a6

1. 준비물

아래 부품들을 준비하면 됩니다.

  • 아두이노 : 아두이노 레오나르도 보드를 준비합니다. 왜냐면 열전사 프린터가 Serial 통신을 사용하고 블루투스(HC-06) 모듈도 Serial 통신을 사용하기 때문입니다. 두 개의 Serial 통신을 사용해야 하는데, 이 경우는 아두이노 레오나르도 보드가 유리합니다. 아두이노 레오나르도 보드는 PC와의 USB 통신을 Atmega32u4 칩에서 처리해주기 때문에 하드웨어 시리얼(Serial)을 하나 확보할 수 있습니다. 하지만 레오나르도 보드는 사용법이 표준보드인 우노(UNO) 보드와 완전히 다르다는걸 주의하셔야 합니다. 아두이노 우노 보드도 사용할 순 있는데… 디버깅하기가 어렵습니다.
  • 블루투스 모듈(HC-06) : 휴대폰과 블루투스 연결을 위해 HC-06 모듈을 사용합니다. 기본적인 HC-06 모듈 사용법은 링크를 참고하세요.
  • 열전사 프린터 : DIY 용으로 판매되는 열전사 프린터가 필요합니다. 보통 $50~$60 정도에 구매할 수 있습니다. 자세한 사용법은 링크에 있습니다. 주의하실 점은 열전사 프린터는 열로 프린트하기 때문에 반드시 5V-2A 이상을 공급하는 어댑터가 필요하다는 점입니다. 어댑터 용량이 프린터의 속도와 품질을 결정하는데 프린터 구매시 포함되지 않는 경우가 많으니 주의.

2. 연결 방법

열전사 프린터부터 아두이노에 연결합니다. 열전사 프린터 상세 페이지를 참고하세요. 열전사 프린터 뒷면을 보면 전원부 3핀과 데이터 3핀이 있습니다. 전원부 핀은 어댑터에 연결하고 데이터 3핀을 아래와 같이 아두이노에 연결해주면 됩니다.

  •  프린터 ==> 아두이노 레오나르도
  • RX(노란색) ==> D3
  • TX(녹색) ==> D2
  • GND ==> GND

이제 블루투스만 아두이노에 연결해주면 됩니다.

  •  블루투스 ==> 아두이노 레오나르도
  • VCC ==> 5V
  • RX ==> D1
  • TX ==> D0
  • GND ==> GND

아두이노 레오나르도 보드에서는 D0, D1 에 연결된 시리얼 통신을 Serial1 클래스를 통해 사용할 수 있습니다.

3. 스케치 업로드, 앱 설치

열전사 프린터로 글자, 이미지, QR 코드 등을 출력하려면 라이브러리가 있어야 합니다. Adafruit 에서 열전사 프린터용으로 제작한 라이브러리가 있는데 이걸 사용하시면 됩니다. GitHub 에서 Adafruit Thermal Printer Library 를 다운로드 받아서 설치하세요.

아래 깃허브 링크에서 아두이노 소스코드를 다운로드 받으세요.

https://github.com/godstale/MessageLogPrinter

MessageLog.ino 파일을 열고 아두이노에 업로드 해주시면 됩니다. 프린터와 블루투스를 정확히 연결해 뒀다면 별 문제없이 진행될 겁니다. 소스코드 중 메인 loop 함수를 보면 대강의 동작 구조를 알 수 있습니다.

void loop() {
  boolean isReceived = false;
  unsigned long current_time = 0;
  
  // Receive data from remote and parse
  isReceived = receiveBluetoothData();
  
  // Update clock time
  current_time = millis();
  updateTime(current_time);
  
  // Display routine
  onDraw(current_time);
  
  // If data doesn't arrive, wait for a while to save battery
  if(!isReceived)
    delay(200);
}

먼저 블루투스 모듈을 통해 도착한 데이터가 있는지 확인하고 저장해둬야 합니다. receiveBluetoothData() 함수안에서 도착한 데이터를 파싱합니다. 휴대폰에서 전달된 데이터가 모두 도착하면 isReceived 변수에 true를 담아줍니다.

updateTime() 함수는 현재 시각을 처리하는 부분입니다. 아두이노는 현재 시각을 알 수 있는 방법이 없기 때문에 휴대폰에서 보내주는 시간 데이터를 받아 자체적으로 계산해서 사용합니다.

onDraw() 함수가 열전사 프린터를 이용해 메시지를 출력하는 함수입니다. 파싱 완료된 메시지가 있는 경우 프린터로 출력해주도록 되어 있습니다.

휴대폰에도 앱을 하나 설치해줘야 합니다. 앱은 주요한 메시지들을 모아서 아두이노에 보내주는 역할을 합니다. 일전에 아두이노 스마트 워치 DIY 프로젝트 하면서 제작한 RetroWatch 앱이 있는데, 이걸 그대로 사용하시면 됩니다. Google Play Store에서 RetroWatch 로 검색한 뒤 제작자가 tortuga 인 앱을 받으세요. 아이폰용 앱은 아직 없습니다;;;;;;;;;

4. 테스트

프린트 봇에 어댑터로 전원을 넣고, 아두이노에도 전원을 넣어줍니다. 휴대폰의 RetroWatch 앱을 실행시키고 블루투스를 활성화 하세요. 안드로이드 v4.3 이상을 지원하는 앱을 다운로드 받은 경우 우측 상단 [i] 아이콘을 눌러 Notification 수집 권한을 부여해줍니다.

FVCP0TAHRPBJRQ0.MEDIUM

우측 상단의 [눈] 모양 아이콘을 눌러 프린터 봇 블루투스를 찾아 페어링합니다. 페어링이 완료되면 연결되었다고 하단에 초록색 아이콘이 뜰겁니다.

원하는 메시지를 클릭해서 활성화를 해줍니다. 메시지가 활성화되면 이후부터는 같은 계열의 메시지는 자동으로 프린트 봇으로 보내줍니다. 바로 동작을 확인하고 싶으신 경우 메뉴키를 눌러 메시지 전송을 강제로 해주세요.

하드웨어적인 문제가 없다면 프린터 봇이 메시지를 찌익~ 찌익 출력해 줄겁니다.

printbot2

소스코드를 바꿔서 여러가지 용도로 변형해서 활용해보세요.

이 프로젝트는 지난 8월에 개최된 “Nabi Art Center – 2015 H.E.ART Bot 나비 해커톤”에 전시한 “모모토 프로젝트”의 일부입니다.