도트 매트릭스 프린터로 시작하는 아침: 2024
스마트폰 중독과 멘탈 건강 악화를 줄이기 위해 80년대 도트 매트릭스 프린터와 라즈베리 파이를 활용해 나만의 맞춤형 '아침 신문' 출력 시스템을 구축한 프로젝트입니다. PHP 스크립트를 이용해 날씨, 주식, 뉴스, 레딧 게시물 등을 수집하고 프린터로 자동 출력하도록 설정했습니다. 오픈소스로 공개되어 있어 누구나 이 아이디어를 참고해 자신만의 디지털 디톡스 도구를 만들 수 있습니다.
한동안 나는 하루를 시작할 때마다 스마트폰 잠금을 해제하고 다양한 뉴스와 소셜 미디어 사이트를 스크롤하며 세상 돌아가는 상황을 확인했습니다. 이는 내 멘탈 건강에 그다지 좋지 않았고, 꽤 오랫동안 화면 사용 시간을 줄이려고 노력해 왔습니다. 하지만 여전히 최신 소식을 접하고 싶었고, 특히 아침에 일어난 직후에는 더욱 그랬습니다. 최근에 eBay에서 도트 매트릭스 프린터(dot matrix printer)를 하나 구매했는데, 매일 아침 나를 위해 맞춤형 '1면'을 출력해 두는 멋진 핑계거리가 될 것 같았습니다. 그래서 그걸 직접 만들어보기로 했습니다! 아래 영상에서 프린터가 내는 ASMR 소리를 들어보세요 👇 이 글에서는 내가 어떤 부품을 사용했고, 어떻게 설정했으며, 모든 것을 작동시키는 PHP 스크립트는 어떻게 구성되어 있는지 자세히 설명하겠습니다. 전체 소스 코드가 궁금하신가요? GitHub 저장소에서 확인해 보세요!
하드웨어 구매하기 이 프로젝트에 필요한 부품 목록은 아주 적었고, 프린터를 제외한 대부분의 부품은 Amazon이나 다른 온라인 쇼핑몰에서 쉽게 찾을 수 있습니다.
- 도트 매트릭스 프린터
- Raspberry Pi Zero W [링크]
- 시리얼(Serial) to USB 어댑터 [링크]
- 전원 공급 장치
내가 구매한 프린터는 80년대 중반으로 보이는 Star NP-10 모델이었습니다. 100% 확신할 수는 없지만, 시리얼 포트가 있는 도트 매트릭스 프린터라면 아마 무엇이든 잘 작동할 것입니다. 가격은 대략 80~120달러 정도였지만, '작동 여부 불확실'이라고 표시되어 있던 덕분에 절반 가격인 약 40달러에 구입할 수 있었습니다. 잉크 리본 카트리지(타자기 같아서 정말 멋지지 않나요!)를 조금 닦고 조정해야 했지만, 그 후에는 바로 켜졌고 테스트 페이지 출력도 문제없이 진행되었습니다.
그 후 모든 것을 연결했습니다. 라즈베리 파이(Raspberry Pi)는 집 Wi-Fi에 연결하고, USB를 통해 프린터의 시리얼 포트와 연결했습니다. 프린터를 켜고 Pi에 SSH로 접속한 후, 프린터가 /dev/usb/lp0 경로에서 정상적으로 인식되는 것을 확인했습니다. 자, 이제 어떻게 이 녀석을 인쇄하게 만들 수 있을까요?
프린터 제어 코드 파악하기 프린터가 lp0에서 사용 가능하기 때문에, 단순히 원시 텍스트(raw text)를 echo 명령어로 보내면 프린터에서 출력되는지 확인해 보고 싶었습니다. 그래서 다음 명령어를 실행했습니다:
echo "Hello, world!" > /dev/usb/lp0
그랬더니 파일에 접근할 수 없다는 에러가 발생했습니다. 아쉽게도 권한(permission) 문제였습니다. 하지만 chmod 명령어를 사용하면 쉽게 해결할 수 있었습니다:
sudo chmod 666 /dev/usb/lp0
이보다 더 좋은 처리 방법이 있을 수도 있지만, 이 명령어 덕분에 echo가 전달되었고 프린터에서 텍스트가 인쇄되는 것을 볼 수 있었습니다! 훌륭합니다. 이 파일을 통해 프린터로 원시 데이터를 보낼 수 있게 되었으니, 이제 이를 더 확장할 방법을 찾아봅시다.
나는 일상적으로 PHP를 주 언어로 사용하며, 이번 프로젝트도 예외는 아니었습니다. fopen()을 통해 파일에 접근하고 텍스트를 기록하는 기본적인 PHP 스크립트를 작성했습니다. 몇 문장과 공백, 그리고 유니코드 아트(unicode art)를 몇 가지 시도해 보았지만, 프린터가 내가 보낸 만큼의 문자를 모두 지원하지는 않는다는 것을 금방 깨달았습니다.
그래서 이 프린터가 실제로 어떻게 작동하는지 파고들어야 할 때라고 생각했습니다. 인터넷 수집가들의 노력과 헌신 덕분에, 나는 이 프린터의 전체 매뉴얼이 스캔되어 PDF로 업로드된 것을 찾을 수 있었습니다. 알고 보니, 프린터의 오래된 연식 때문이거나 아니면 단순히 제조사의 결정 때문인지, 이 프린터는 매우 특정한 문자 세트(character set)만을 허용했습니다. IBM PC의 코드 페이지 437(Code Page 437)을 느슨하게 기반으로 하며, 대부분의 표준 알파벳 및 숫자 문자로 구성되어 있지만, 소수의 특수 기호, 선 및 상자 그리기 기호도 포함되어 있었습니다. 정말 멋지네요!
이러한 문자를 프린터로 보내는 것은 아주 간단합니다. PHP에서 다음과 같이 16진수(hex) 값을 echo로 출력하기만 하면 됩니다:
$horizontalDouble = "\xCD"; $deg = "\xF8"; echo str_repeat($horizontalDouble, 24); echo '78' . $deg . 'F' . PHP_EOL;
훌륭합니다. 이제 프린터에 텍스트를 문제없이 출력할 수 있고, 약간의 특수 문자 및 디자인 기호도 포함할 수 있게 되었습니다. 이제 매일 아침 내가 어떤 것을 보고 싶은지 결정할 차례입니다.
데이터 수집하기 나는 나만의 맞춤형 1면을 위해 네 가지의 뚜렷한 섹션을 원한다는 것을 알고 있었습니다. 날씨, 주식, 주요 뉴스 헤드라인, 그리고 인기 레딧(reddit) 게시물 몇 가지입니다. 결국, 이것들이 내가 아침마다 스마트폰에서 주로 확인하는 것들이기 때문입니다. 또한, 이것은 실험적인 프로젝트이기 때문에...