2026년 7월 9일 목요일

Fluid Ardule의 3.5인치 화면에서 리눅스 콘솔을 만나다

Fluid Ardule을 다른 사람도 만들어 쓸 수 있도록 배포하려면 어떻게 해야 할까? 요즘 이런 생각을 조금씩 하고 있다. GitHub에는 소스 코드와 설치 문서를 올려 두었지만, 실제로 Raspberry Pi OS부터 설치해서 시스템을 구성하려면 제법 많은 수고가 필요하다. 특히 Wi-Fi 설정은 사용자마다 다를 수밖에 없다.

현재 Fluid Ardule은 부팅 시간을 줄이기 위해 NetworkManager를 사용하지 않는다. 실제로 systemd-analyze blame으로 확인했을 때 NetworkManager 서비스가 부팅 과정에서 13초 이상을 차지한 적이 있었다. 전원을 켜고 빨리 악기를 사용하고 싶은 시스템에서 13초는 결코 짧은 시간이 아니다.

그래서 Fluid Ardule은 wpa_supplicantdhcpcd를 이용하는 비교적 단순한 네트워크 구성을 사용한다. 문제는 새로운 Wi-Fi를 등록할 때이다. 내가 사용하는 집 Wi-Fi와 휴대전화 핫스팟 정도만 미리 등록해 두면 별 문제가 없지만, 배포판을 사용하는 사람은 자신의 SSID와 비밀번호를 입력해야 한다. 내가 공개한 문서에서는 SSH로 연결한 터미널 창에서 명령어를 넣어서 설정을 입력하는 방법을 소개해 두었다. 그러나 아무래도 불편하지 않을 수 없다.

처음에는 여러 방법을 생각했다.

Fluid Ardule의 인코더를 돌려 ASCII 문자를 선택하게 할까? SSID는 스캔 목록에서 고르고 비밀번호만 입력하면 된다. 그러나 90개가 넘는 printable ASCII 문자를 인코더로 돌려 고르는 장면을 상상하니 썩 내키지 않았다.

Raspberry Pi를 잠시 무선 AP로 만들어 휴대전화에서 접속하게 하는 방법도 있다. 이른바 captive portal 방식이다. 편리하기는 하지만 AP 모드, DHCP, 간단한 웹 서버와 설정 페이지까지 필요하다. Wi-Fi 비밀번호 하나를 입력하기 위해 또 하나의 작은 시스템을 만드는 셈이다.

USB 키보드를 연결하게 할까? 이것도 나쁘지 않다. 하지만 그러려면 Fluid Ardule의 전용 UI 안에 텍스트 입력 기능을 새로 넣어야 한다.

이쯤에서 생각을 바꾸었다.

Fluid Ardule은 상용 전자악기가 아니다. Raspberry Pi에 운영체제를 설치하고 Arduino 펌웨어를 올리며 MIDI 장치를 연결하는 DIY 프로젝트이다. 그렇다면 사용자에게 Raspberry Pi OS와 SSH에 대한 기본적인 숙련을 요구하는 것이 그렇게 부당한 일일까?

최초 Wi-Fi는 Raspberry Pi Imager에서 설정하면 된다. 새로운 네트워크가 필요하면 SSH로 접속하여 설정 파일을 수정할 수 있다. 아무도 요구하지 않은 captive portal을 만들다가 또 며칠을 보내는 것보다는 이 편이 훨씬 낫다.

그래서 설치 문서와 네트워크 문서에 이 원칙을 명시했다. Fluid Ardule은 DIY Raspberry Pi synthesizer project이며, Raspberry Pi OS와 SSH에 대한 기본적인 숙련을 권장한다고 말이다.

여기서 오늘의 이야기가 끝났어야 했다.

그런데 문득 이런 생각이 들었다.

“Fluid Ardule 서비스를 잠시 끄고 3.5인치 TFT를 그냥 리눅스 모니터처럼 쓸 수는 없을까?”

현재 Fluid Ardule의 TFT는 /dev/fb1이라는 framebuffer 장치이다. 운영 스크립트는 Pillow로 화면을 렌더링하고 그 결과를 framebuffer에 직접 출력한다. Raspberry Pi의 Linux 콘솔은 기본적으로 다른 framebuffer를 사용하고 있다.

확인해 보았다.

$ cat /proc/fb
0 vc4drmfb
1 fb_ili9486

framebuffer 0은 HDMI 쪽이고 framebuffer 1은 ILI9486 SPI TFT이다.

Linux console의 framebuffer 연결 상태도 확인했다.

$ con2fbmap 1
console 1 is mapped to framebuffer 0

그렇다면 console 1을 framebuffer 1로 바꾸면 어떻게 될까?

SSH로 접속한 상태에서 Fluid Ardule 서비스를 멈추고 다음 명령을 실행했다.

sudo systemctl stop fluid_ardule.service
sudo con2fbmap 1 1
sudo chvt 1

놀랍게도 3.5인치 TFT에 진짜 Linux console이 나타났다.

Fluid Ardule의 메뉴도 아니고 Pillow로 렌더링한 운영 화면도 아니다. Raspberry Pi의 텍스트 콘솔이다. USB 키보드를 연결하면 명령어를 직접 입력할 수 있다. raspi-config도 실행할 수 있다.

다만 화면은 정확히 180도 뒤집혀 있었다.

사실 당연한 결과였다. Fluid Ardule의 TFT 설정에는 다음과 같은 항목이 있다.

dtoverlay=piscreen,spi0-0,rotate=90,speed=32000000,fps=30

여기서 rotate=90은 ILI9486의 기본 세로 방향 framebuffer를 Fluid Ardule이 사용하는 480×320 가로 화면으로 바꾸기 위한 것이다.

그런데 실제 Fluid Ardule에서는 케이스 내부의 커넥터와 케이블 배치를 편하게 하기 위해 TFT를 반대 방향으로 장착했다. 따라서 가로 화면은 맞지만 실제 사람이 보는 방향에서는 180도 뒤집혀 있다. Fluid Ardule 운영 스크립트는 Pillow로 렌더링한 화면을 다시 180도 회전하여 이를 보정한다.

Linux console은 당연히 이런 사정을 모른다.

그래서 /boot/firmware/cmdline.txt에 다음 커널 파라미터를 추가했다.

fbcon=rotate:2

재부팅 후 다시 console을 TFT에 연결했다.

이번에는 정상 방향이었다.


3.5인치 화면에 raspi-config를 띄워 보았다. 화면이 너무 작지 않을까 걱정했지만 의외로 아무 문제가 없었다. 메뉴를 읽고 조작하기에 충분했다.

그리고 다시 Fluid Ardule로 돌아오는 것도 간단했다.

sudo con2fbmap 1 0
sudo systemctl start fluid_ardule.service

잠시 뒤 익숙한 Fluid Ardule 화면이 다시 나타났다.

오늘은 Wi-Fi 설정 방법을 고민하다가 시작했다. 결론은 “굳이 모든 것을 Fluid Ardule UI 안에서 해결하려 하지 말자”였다.

그런데 그 과정에서 더 재미있는 가능성을 발견했다.

Fluid Ardule의 3.5인치 TFT는 악기 화면으로만 사용할 필요가 없다. 평소에는 Pillow 기반의 전용 악기 UI를 표시하다가, 필요할 때 서비스를 멈추고 Linux console로 전환할 수 있다. 설정이나 진단이 끝나면 다시 악기 UI로 돌아오면 된다.

이제 운영 스크립트에 필요한 것은 Wi-Fi 설정을 위한 복잡한 암호 입력 화면이 아닐지도 모른다. 단지 “Console Mode”로 들어가는 문 하나면 된다.

악기 UI는 악기답게 단순하게 유지하고, 시스템 관리는 Linux에게 맡긴다.

오늘은 기능 하나를 더 만든 날은 아니다. 오히려 만들지 않아도 될 기능을 찾아 헤매다가, 이미 시스템 안에 있던 다른 문 하나를 발견한 날이다.

댓글 없음: