User Tools

Site Tools


fluidcanvas_r2pi:raspberry_pi_os_installation_and_optimization

Raspberry Pi OS Installation and Optimization

이 문서의 목적은 FluidSynth 연주용으로 라즈베리파이 3B를 꾸미는 방법을 설명하는 것이다. 데스크톱 환경이 없는 32비트 Raspberry Pi OS Lite를 설치할 것을 추천한다. 왜냐하면 Pi 3B는 메모리가 1GB에 지나지 않아서 64비트 버전의 장점을 활용하기 곤란하며 괜히 커널만 무겁게 돌아간다. USB-serial로 연결된 아두이노 우노를 조작반으로 사용할 것이라서 GUI도 필요하지 않다.

https://www.raspberrypi.com/software/operating-systems/

GUI가 자동으로 시작되지 않도록 하고(desktop environment를 설치하였다면) Wi-Fi를 이용한 SSH 접속만 허용한다. USB 오디오 출력장치는 Roland SC-D70 또는 Behringer UCA200을 사용한다. user id는 'pi'로 하였다.

OS 설치 후에는 다음과 같은 패키지를 추가한다. rsyslog를 설치하지 않으면 /var/log/syslog 파일이 생기지 않아서 디버깅하는데 무척 애를 먹을 것이다.

sudo apt update
sudo apt upgrade
sudo apt install fluidsynth alsa-utils rsyslog
sudo apt install vim  # 나는 nano editor보다 vim이 좋다!
# 추가적으로 필요한 패키지(sudo apt install로 설치)
# python3 python3-serial

/home/pi/sf2에 적당한 SoundFont 파일을 복사한다. USB 드라이브에 복사해서 옮기는 것이 좋으나, 라즈베리파이 OS 데스크톱이 아니면 자동 마운트가 되지 않는 것 같다.

설치 후 설정 변경

sudo raspi-config
  1. Systems Option → Boot / Auto Login에서 Console 선택
  2. Systems Option → Interface Options → SSH Enable ('ssh ID@192.168.1.100')
sudo systemctl disable lightdm   # GUI 서비스 끄기(복원 가능)
sudo ls -l /etc/systemd/system/default.target
sudo systemctl set-default multi-user.target   # 부팅 목표를 콘솔로 설정

불필요한 서비스 끄기

sudo systemctl disable bluetooth
sudo systemctl disable avahi-daemon
sudo systemctl disable triggerhappy  # service does not exist
sudo systemctl disable hciuart       # service does not exist

boot time 확인

systemd-analyze
systemd-analyze blame

기타: gpu_mem=16, hmdi_force_hotplut=1

목표는 부팅 후 10초에 연주 가능 상태가 되는 것이다.

개발이 끝나면 네트워크를 완전히 끄는 것도 좋다(dhcocd, wpa_supplicant, networking 전부 disable).

Wi-Fi 끄는 법

/boot/firmware/config.txt에 다음을 삽입하고 재부팅한다. 그러면 자동적으로 유선랜(DHCP)로 연결될 것이다.

dtoverlay=disable-wifi  

Wi-Fi 수동 설정하기

시스템을 경량화한답시고 서비스와 패키지를 적당히 지웠더니 필요한 때에 Wi-Fi가 자동으로 잡히지 않는 상태가 되었다. wpa_supplicant 서비스가 꼬인 것 같다. 자동으로 잡히지 않으니 번거롭지만 일단 다음과 같이 입력하여 Wi-Fi를 목록을 확인한 뒤 연결하고 싶은 것에 대한 설정 파일을 다시 쓴다.

sudo iwlist wlan0 scan | grep ESSID
sudo wpa_passphrase "SSID" "PASSWORD" | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf

다음 명령을 실행한다.

ip link set wlan0 up
rfkill unblock wifi
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

필요하면 자동 시작 스크립트로 넣어도 좋다.

일반계정 pi에 su 권한 부여하기

visudo를 이용하여 /etc/sudoers 파일을 편집한다. 그래야만 UNO가 보내는 신호에 맞추어서 시스템을 끄거나 재부팅할 수 있다(halt or shutdown). visudo는 기본적으로 vim이 아닌 nano를 에디터로 사용한다.

sudo visudo
# nano가 싫으면 'sudo EDITOR=vim visudo'라고 입력한다. 해당 세션에서먼 유효하다.
# 맨 아래에 다음 줄을 추가한다. 실제 명령어의 경로가 맞는지 확인한 뒤에 넣을 것.
pi ALL=(ALL) NOPASSWD: /usr/sbin/shutdown, /usr//sbin/reboot

SPI 방식 3.5인치 TFT 터치 LCD(480x320p) 설치

이것은 꼭 필요한 일은 아니지만 갖고 있는 부품을 최대한 활용하기 위한 마음에 욕심을 부리는 중이다.

중국산 SPI(Serial Peripheral Interface) 방식의 TFT LCD는 유난히 사용하기가 어렵다. HDMI와 같은 GPU 디스플레이가 아니라 프레임버퍼 방식이라 CPU가 SPI로 계속 픽셀을 밀어 넣어야 하고, 대역폭도 좁으며, 컨트롤러 칩도 제각각이다. 내가 보유한 것은 ILI9486칩을 쓰는 것으로 확인되었다. 그러나 중국산 디스플레이는 라즈베리파이 OS에서 제공하는 공식 드라이버가 없어서 LCD-Show와 같은 비공식 드라이버를 써야 하며, 게다가 터치 드라이버도 별도로 설치해야 한다. 마지막으로 LCD가 뜬 뒤에도 다음과 같이 디바이스가 생성되므로 cmdline.txt 등을 설정해야 콘솔이 LCD로 나오게 된다.

/dev/fb0    HDMI
/dev/fb1    SPI LCD

콘솔의 의미를 되새긴다면, 부팅 메시지가 나온 뒤 맨 끝에 로그인 프롬프트가 나오는 화면을 말한다. 더욱 상황을 어렵게 하는 것은 2023년 이후 커널에서 fbtft 드라이버가 점점 사라지는 것도 문제이다. 즉 시간이 흐를수록 3.5inch RPi DisplaySetting Up a 3.5-inch LCD Touch Display with Raspberry Pi: A Step-by-Step Guide를 따라 하면서 성공할 가능성이 점차 줄어들 것이라는 뜻이다. 현재의 Raspberry Pi OS가 기반을 두고 있는 Bookworm(Debian 12)에서는 디스플레이 구조가 바뀌어 /dev/fdb0 중심에서 DRM/KMS 중심의 /dev/dri로 프레임버퍼가 바뀌었고 fbtft도 점차 퇴장하고 있으며 LCD-show도 안 맞게 되었다는 점도 어려움을 배가시킨다.

Fluid Ardule에서는 RB Pi에 연결한 SPI LCD를 터치 기능까지 살려서 GUI 조작반으로 쓰려는 것이 아니다. 아두이노 우노에 물린 1602 LCD에서 표시하기에 충분하지 않은 상태 메시지를 보이기 위한 보조적인 목적이다.

LCD-show보다 깔끔한 방식이 있다고 한다. Raspberry Pi OS의 dtoverlay + fbtft 드라이버만 사용하고 LCD-show 스크립트를 쓰지 않는 것이다. 다음 섹션에 정리하였다.

Raspberry Pi SPI 3.5″ TFT (ILI9486) 안정 설정 가이드 (LCD-show 없이)

이 문서는 중국산 SPI 3.5″ TFT LCD (ILI9486 계열)를 라즈베리파이에서 LCD-show 없이 안정적으로 사용하는 방법을 설명한다. 목표:

  • OS 업데이트에도 깨지지 않음
  • 최소 설정
  • TFT를 보조 디스플레이로 사용
  • 콘솔은 HDMI 유지

전제 조건

  • Raspberry Pi 3 Model B
  • Raspberry Pi OS (32-bit 권장)
  • SPI 3.5″ TFT (ILI9486)

절차

# 1. OS 업데이트
sudo apt update && sudo apt full-upgrade -y

# 2. SPI 활성화
sudo raspi-config
→ Interface Options → SPI → Enable

# 3. config.txt 수정
sudo nano /boot/firmware/config.txt

# ⚠️ 기존 piscreen 대신 아래 사용 (Bookworm 안정형)

dtparam=spi=on

# DRM/KMS 유지 (중요); 원래는 kms였음
dtoverlay=vc4-fkms-v3d
max_framebuffers=2

# ILI9486 직접 지정 (핵심), 그러나 dtoverlay=ili9486이 실패하여 piscreen으로 바꾸었다.
dtoverlay=piscreen,spi0-0,rotate=90,speed=32000000,fps=30

# (문제 시 대안 rotate 값: 0 / 180 / 270)

# 4. 재부팅
sudo reboot

# 5. SPI 확인 (중요)
ls /dev/spidev*
# → /dev/spidev0.0 있어야 정상

# 6. framebuffer 확인
ls /dev/fb*

# 정상 예:
# /dev/fb0 (HDMI)
# /dev/fb1 (TFT)

# 7. 실패 시 로그 확인 (Bookworm 필수 단계)
dmesg | grep -Ei 'ili|spi|fb'

# 8. LCD 테스트
sudo apt install fbi
sudo fbi -T 1 -d /dev/fb1 --noverbose -a /home/pi/sf2/FluidArdule.png  # q나 Esc로 종료 
# --noverbose 상태줄 보이지 않기, -a 이미지 크기 자동 조정 

# 화면 지우기(자동으로 지워지지 않는다)
sudo dd if=/dev/zero of=/dev/fb1

# 9. 구조 (권장)
HDMI → 콘솔
TFT  → 보조 화면 (상태 표시용)

# 10. 절대 금지
# - LCD-show 사용 ❌
# - cmdline.txt 수정 ❌
# - fbcon=map 사용 ❌

hdmi를 아예 무시하려면 /boot/firmware/config.txt에서 다음과 같이 설정한다.

hdmi_ignore_hotplug=1
disable_splash=1
boot_delay=0

블루투스 서비스도 비활성화하라.

금지 사항

LCD-show 사용 금지, cmdline.txt 수정 금지! 만약 어려움이 있으면 다음 두 설정 파일을 ChatGPT에 밀어넣고 문제점을 찾아보라고 하면 된다.

cat /boot/firmware/config.txt
cat /boot/firmware/cmdline.txt

성공 판단 기순

/dev/spidev0.0   ✔
/dev/fb1         ✔
dmesg에 ili9486  ✔

결론

dtoverlay 방식이 가장 안정적이며 유지보수가 쉽다.

고급 기능

TFT Boot Splash and Status Display Guide - 부팅 시 스플래시 이미지를 TFT LCD에 띄운 뒤 부팅이 완료되면 상태를 화면에 표시하는 방법

사운드 테스트

예전에 작성한 문서인 Music on Linux가 추억처럼 떠오른다!

파일의 단순 재생

SoundFont 패키지를 풀면 데모용으로 ogg 파일이 포함된 경우가 있다. 이를 재생하려면 ogg123과 같은 플레이어가 편리하다.

sudo apt install vorbis-tools

무려 세 개의 USB 오디오 기기를 연결한 뒤 aplay -l을 실행하여 '카드 번호'를 확인한다. 0번은 내장 헤드폰, 1번은 HDMI이다.

aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones]
  Subdevices: 7/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: vc4hdmi [vc4-hdmi], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: CODEC [USB Audio CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 3: SCD70 [SC-D70], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0  
card 4: O22 [Onyx Producer 2-2], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

내가 쓰려는 USB 오디오 기기는 card 2번(Behringer UCA200)이다. 이를 통해서 ogg 파일을 재생해 보자.

ogg123 -d alsa -o dev:plughw:2,0 ~/sf2/demo_MIDIs/audio/Bond.ogg

보다 간단하게는 다음과 같이 입력한다. 좌우 채널로 번갈아 핑크 노이즈가 재생될 것이다.

speaker-test -D plughw:2,0 -c2

카드 번호와 무관하게 무조건 헤드폰으로 출력되게 하는 방법은 다음과 같다.

ogg123 -d alsa -o dev:plughw:CARD=Headphones,DEV=0 ~/sf2/demo_MIDIs/audio/Bond.ogg

MIDI test

먼저 .MID 파일을 재생해 보자. 사운드기기 번호(X,0)은 'aplay -l' 명령으로 미리 확인해 둔다.

fluidsynth -a alsa -o audio.alsa.device=plughw:2,0 ~/sf2/GeneralUser_GS.sf2 /home/pi/sf2/demo_MIDIs/Dance.mid
FluidSynth runtime version 2.4.4
Copyright (C) 2000-2025 Peter Hanappe and others.
Distributed under the LGPL license.
SoundFont(R) is a registered trademark of Creative Technology Ltd.

Type 'help' for help topics.

> fluidsynth: warning: Failed to set thread to high priority

기본 동작 조건에서는 interactive mode로 진입하므로 shell('>')로 들어간 상태가 된다. Interactive mode로 들어가지 못하게 하려면 '-i' 옵션이 필요하다.

경고문은 권한 부족과 관련한 것이라서 테스트 단계에서는 별로 중요하지 않다. 성가시다면 다음과 같이 사용자를 audio 그룹에 할당한 뒤 쓰레드 우선권을 높이고 안정성도 개선도록 한다.

sudo usermod -aG audio $USER
# /etc/security/limits.conf 파일에 다음의 두 줄을 추가한다.
@audio   -  rtprio     95
@audio   -  memlock    unlimited

audio 그룹을 미리 만들지 않아도 된다. 왜냐하면 이미 시스템에 존재하는 경우가 100%이기 때문이다. 다음과 같이 확인해 보라. 이는 Debian/Raspberry Pi OS 계열의 특성이다.

getent group audio
audio:x:29:

레이턴시를 감안하여 몇 가지 파라미터를 조정하고 interactive shell을 비활성화('-i')하는 조건으로 실행해 보자. 키보드 연결을 하여 작동하려면 '-i -s'까지 주어야 한다. '-s'는 server mode(daemon-like)를 의미한다.

fluidsynth \
-i \
-g 0.7 \ # gain [0 < gain < 10, default = 0.2]
-a alsa \
-o audio.alsa.device=plughw:2,0 \
-o audio.period-size=128 \
-o audio.periods=3 \
~/sf2/GeneralUser_GS.sf2 \
~/sf2/demo_MIDIs/Dance.mid

1. 건반 입력을 FluidSynth로 보내기

장치 연결 확인하기

aseqdump -l # or 'aconnect -i
 Port    Client name                      Port name
  0:0    System                           Timer
  0:1    System                           Announce
 14:0    Midi Through                     Midi Through Port-0
 28:0    MPK Mini Mk II                   MPK Mini Mk II MIDI 1

건반 입력 신호 확인하기

aseqdump -p 28:0 # 건반을 눌러서 화면에 표시되는 MIDI 메시지 확인

FluidSynth를 백그라운드로 실행. '-i -s' 옵션을 꼭 넣어야 한다. '-s'(server mode)로 실행해야 입력이 없어도 계속 살아서 서비스처럼 작동한다. 이 설정이 없으면 MIDI(키보드) 입력이 없는 경우 즉시 종료하고 다시 shell prompt로 되돌아온다.

fluidsynth -a alsa -g 0.7 -i -s -m alsa_seq \
-o audio.alsa.device=plughw:2,0 \
-o synth.reverb.active=1 \
-o synth.reverb.room-size=0.48 \
-o synth.reverb.damp=0.22 \
-o synth.reverb.width=0.75 \
-o synth.reverb.level=0.30 \
~/sf2/SalC5Light2.sf2 &

MIDI 입력와 출력 연결

aconnect 28:0 128:0

FluidSynth가 화면으로 뿌리는 온갖 메시지가 성가시다면 다음과 같이 입력한다.

 fluidsynth .... SoundFont.sf2 > /dev/null 2>&1 &

이상의 방법은 FluidSynth를 먼저 실행하여 백그라운드로 돌려 놓은 뒤 aconnect를 이용하여 MIDI IN과 OUT을 연결하는 방식이다. amidi utility를 사용하면 약간 다르게 할 수 있다. 이는 가장 직접적이고 단순한 연결 방식으로서 키보드를 하나만 쓴다면 안정적이다.

amidi -l
# 출력을 먼저 확인하여 키보드 컨트롤러의 번호를 확인한다. 'aconnect -i'에서 보이는 방식과는 다르다.
Dir Device    Name
IO  hw:1,0,0  USB MIDI Keyboard MIDI 1
# fluidsynth 실행
fluidsynth -s -a alsa -m alsa_raw \
  -o midi.alsa.device=hw:1,0,0 \
  ~/sf2/FluidR3_GM.sf2

키보드를 꽂으면 자동으로 FluidSynth로 연결되어 즉시 연주가 가능하게 만드는 명령어는 다음과 같다. '-o midi.autoconnect=1'은 MIDI 시퀀서 포트끼리 자동 연결하는 기능이고, '-o audio.realtime-prio=0'은 'fluidsynth: warning: Failed to set thread to high priority' 경고문(무해함)을 나오지 않게 한다. 어쩌면 이 명령어가 실전에서 가장 유용할 것이다.

fluidsynth -a alsa -m alsa_seq \
  -o audio.realtime-prio=0 \
  -o midi.autoconnect=1 \
  -o audio.alsa.device=plughw:2,0 \
  -o synth.sample-rate=48000 \
  -o audio.period-size=256 \
  -o audio.periods=3 \
  -o synth.gain=0.4 \
  -o synth.cpu-cores=1 \
  ~/sf2/SalC5Light2.sf2

2. 건반 입력을 USB MIDI interface에 연결된 외부 모듈로 보내기

(작성 예정) aconnect로 처리한다.

안정적인 MIDI/FluidSynth 구동을 위한 기타 아이디어

/boot/firmware/cmdline.txt에 다음을 추가하라(autosuspend 끄기)

usbcore.autosuspend=-1

고급 주제

별도 글 목록

FluidSynth DAC Buffer Tuning Guide

Device Stability Recommended Setting Notes
USB Audio CODEC ★★★★★ 256 / 3 Most stable. Suitable as default setting
Mackie Onyx Producer 2-2 ★★★★☆ 256 / 3 Slightly sensitive to USB timing but stable overall
Roland SC-D70 ★★☆☆☆ 512 / 3 Legacy device. Increase buffer if unstable

Parameter Details

Parameter Value
sample-rate 44100
audio.period-size 256 (default), 512 (SC-D70 fallback)
audio.periods 3

Usage Strategy

  • Use 256 / 3 as the default for most devices
  • For SC-D70, switch to 512 / 3 if click/pop occurs
  • Avoid values below 256 on Raspberry Pi 3
  • Keep settings consistent to prevent unstable behavior
-o synth.sample-rate=44100
-o audio.period-size=256
-o audio.periods=3
-o synth.gain=0.4
-o synth.cpu-cores=1
-o synth.reverb.active=0
-o synth.chorus.active=0

GPIO로 ACT LED 미러링

Pi에서 ACT LED는 내부적으로 GPIO에 연결되어 있다. 이걸 외부 LED로 복제 가능하다. 330옴 저항을 사이에 넣을 것.

# /boot/firmware/config.txt에 다음의 두 줄 추가
#dtparam=act_led_gpio=17  # 이동
dtoverlay=act-led,gpio=17  # 복제(두 LED 동시 사용)
dtparam=act_led_trigger=mmc
fluidcanvas_r2pi/raspberry_pi_os_installation_and_optimization.txt · Last modified: by hyjeong