디지털 라이프 電子的生活 My Digital Life/잡다한 Linux 관련 것들

openmediavault로 NAS 만들기 #3 - 커스텀 디스플레이

미친도사 2021. 8. 28. 23:12

지난 이야기

openmediavault로 NAS 만들기 #1 - 하드웨어의 선택

openmediavault로 NAS 만들기 #2 - 소프트웨어 설치

 

보통 특정 용도의 시스템을 어플라이언스(appliance)라고 한다. 이런 경우에 전면에 상태 디스플레이 같은 게 있는 경우 좀 더 폼이 나기도 하고, 유용한 정보를 볼 수 있어 편하기도 하다. NAS에 이런 디스플레이가 없는 경우, 이 NAS의 IP 주소를 알 수 없는 경우 접근이 쉽지 않을 수도 있다. 그래서, 전면에 작은 디스플레이를 달아 보자는 것에서 작업이 시작되었다.

현재로 LCD 디스플레이 혹은 OLED 디스플레이를 컨트롤하는 제일 쉬운 방법은 아두이노(Arduino)라 생각한다. 취미로 시작했지만, 그 활용 범위가 넓어서 업무용으로도 종종 사용하고 있는 마이크로 프로세서 개발 환경이다. 이것으로 디스플레이를 컨트롤하고, 이 아두이노를 PC(혹은 서버)에 USB로 연결하면 시리얼 장치로 인식하여 시리얼 통신으로 데이터를 주고 받을 수 있게 된다.

보통 아두이노 프로그램은 전용 개발 툴이 제공되며 이는 C 언어 기반이다. 그리고, OMV5가 설치된 리눅스 환경과 아두이노와의 시리얼 통신은 파이썬이 가장 쉽게 할 수 있었다.

구현한 구성을 그림으로 간단히 그려보면 다음과 같다.

OLED 디스플레이 <- (i2c) -> 아두이노 나노 <- (USB) -> OMV5 메인보드

동작 시나리오는 다음과 같다

  1. OMV5에서 리눅스 쉘 스크립트를 이용하여 필요한 센서 정보 등을 수집한다
  2. 1에서 수집한 정보를 파이썬으로 작성한 툴을 통해 아두이노로 시리얼 전송한다
  3. 아두이노에서는 2에서 받은 정보를 분석하여 OLED 디스플레이에 표시한다
  4. 몇 초간의 딜레이를 두고 1-3을 반복한다

각 단계에서 구현하고자 한 것들을 정리해 본다.

  1.  쉘 스크립트를 통해서는 다음의 정보들을 수집하여 각 값들을 쉼표를 두어 출력한다.
    • 시스템 정보: 호스트명, IP 주소
    • 온도: sensors 명령어로 CPU의 온도, smartctl 명령어를 통해서는 4개의 데이터 드라이브의 각각의 온도
    • 팬: sensors 명령어에서 CPU 팬 속도, 시스템 팬 속도
    • 사용량: CPU 사용량, 메모리 사용량, 드라이브 사용량
    • 네트워크: 업로드/다운로드 속도
    • 드라이브: 읽기/쓰기 속도
  2. 파이썬 툴에서는 다음의 작업을 처리한다.
    • 아두이노의 USB 시리얼 포트 인식 및 초기화
    • 1의 쉘스크립트를 수행하고 그 결과값을 수집
    • 수집된 결과 값을 시리얼 통신을 통해 아두이노로 전송
    • 약간의 딜레이를 주며 반복
  3. 아두이노에서는 다음과 같은 작업을 처리한다.
    • 그래픽 디스플레이 타입 지정
    • 시리얼 통신을 통해 전송되는 쉼표로 분류된 데이터를 각 센서를 나타내는 변수에 저장
    • 디스플레이에 보기 좋게 배치 

디스플레이는 표현할 정보에 따라 자유롭게 선택하면 되겠는데, 이번에는 모노 그래픽 디스플레이를 사용하기로 했다. 준비 중인 개발 프로젝트에서 사용할 예정이라 예행 연습이라 생각하고 해보려 했다. 아두이노에서 쓸 수 있는 그래픽 디스플레이는 크기별로 굉장히 다양하게 있는데, SPI 방식의 노키아 5110 LCD 디스플레이로 설계를 시작했다. 다양한 그래픽 디스플레이에 따라 내장된 컨트롤러 역시 다양한데, u8glib이라는 통합 그래픽 디스플레이 라이브러리를 사용하여 소스의 앞쪽에서 필요한 라이브러리만 정의하면 소스의 큰 변동 없이도 쓸 수 있어 편리하다.

최초 테스트로 구현한 모습은 다음과 같다.

아두이노 마이크로를 사용했고, 아두이노 진영에서 제일 흔하게 소개되는 SPI 방식의 노키아 5110 LCD 디스플레이를 사용해서 최초로 구현을 해본 화면이다. 이 디스플레이는 80x48 픽셀의 그래픽 디스플레이로 CPU, 드라이브, 메모리 등을 아이콘을 만들어 표현해 보았다. 작은 그림 표현이 예전엔 막연히 어렵다 생각했는데, 그 원리를 알고 나니 어렵지 않아서 자주 쓰게 될 것 같다.

그런데, 이 디스플레이로는 필요한 정보를 다 표현하기 좀 부족하여서 128x64 픽셀은 되어야 할 것 같았다. 구입해둔 1.3인치 디스플레이로 기능을 어느 정도 구현한 후에 테스트 구동한 화면이다.

 

시스템이 부팅해서 관련 스크립트가 동작하기 전까지는 초기 로고 화면을 띄우게 했고, 이후에는 상단에 IP 주소와 호스트명이 번갈아 가면서 나오고, 나머지 영역에는 센서와 각종 정보가 나오게 했다.

테스트한 OLED 디스플레이는 NAS 전면에 넣기엔 조금 큰 것 같아서 예전에 사둔 0.91인치짜리 i2c 방식의 OLED 디스플레이를 사용하기로 했다.

 

아래와 같이 생긴 전면 베젤에 연필로 디스플레이를 넣을 자리를 연필로 표시했다.

 

드릴로 테두리 근처에 구멍을 내고, 니퍼로 잘라내고 줄질해서 정리하고 뒷면에 아래와 같이 디스플레이 고정했다.

 

전면에서 바라보면 이런 모습이다.

 

리눅스에서 데이터를 받아서 디스플레이에 뿌려줄 역할을 하는 아두이노는 크기가 작은 아누이노 나노를 사용하였다.

 

전면의 USB 포트 하나를 디스플레이 때문에 없앴기 때문에 남는 메인 보드의 USB 헤더에 아두이노를 직접 연결했다.

 

동작시킨 모습은 다음과 같다.

 

사진으로 보면 그닥 이상하지 않은데, 전면 베젤의 두께가 꽤나 두꺼워서 디스플레이가 상당히 안쪽으로 들어가 보인다.

이 부분을 좀 개선해 보고자 작업을 또 했다.

디스플레이가 마운트되는 테두리를 표시를 했다.

이 안쪽을 일정한 두께로 평평하게 깎아내어 디스플레이가 고정되는 부분의 베젤을 얇게 만들고자 한다.

그러기 위해서 평면 면취팁을 구입했는데, 그대로 작업하기엔 균일하게 평탄화하기 어려워서 3D 프린터도 작은 보조물을 만들어서 일정한 두께로 깎아낼 수 있게 했다.

 

실제 작업 중에 한 컷.

 

사진은 좀 거칠어 보일 수도 있는데, 실제로는 꽤 균일하게 잘 깎여나갔다. 움핫핫핫!

 

디스플레이도 딱맞게 잘 들어간다.

 

전면에서 바라봐도 적당한 깊이로 마운트되었다.

 

디스플레이 부분을 잘 보이게 하고, 주변의 나사 구멍은 가리는 겸해서 얇은 프레임을 하나 만들어 붙여주었다.

프레임은 절연 시트로 많이 쓰던 PC 시트를 쓰려 했는데, 굴러다니던 걸 다 써서 일단은 3D 프린트해서 양면테이프로 붙였더니 살짝 이질감이 있다. 나중에 PC 시트 구해서 다시 만들어 붙이려 한다.

이렇게 해서 새로운 나만의 NAS를 OMV 기반으로 만들었다.

아두이노 프로그램과 리눅스 프로그램에 대한 이야기는 다음으로 이어서...

반응형