This is an old revision of the document!
Table of Contents
Arduino Uno-based controller development
1602 LCD 키패드 실드 테스트
알리익스프레스에서 구입한 실드에 핀헤더를 납땜하였다. 보드 아랫쪽에는 핀 설명이 인쇄되어 있지만 윗쪽 7개 핀은 그렇지 않다.
- (위) D12-D12-D11-D3-D2-D1(TX)-D0(RX)
- (아래 왼쪽) RESET-3V3-5V-GND-GND-VIN
- (아래 오른쪽) A1~A5
LCD 및 저항 사다리를 통한 버튼 스위치(4개 방향키 + OK + Reset = 6개)를 위해 쓰인 핀을 제외하면 A1-A5, D0, D1, D2, D3, D11, D12 그리고 D13을 I/O 용도로 사용할 수 있다. 버튼 누름 신호는 A0을 통해 입력된다.
이 실드의 작동 테스트용 코드는 여기에서 입수하였다. Arduino IDE 2.3.8에서 업로드하니 잘 작동하였다.
Sketch uses 2344 bytes (7%) of program storage space. Maximum is 32256 bytes. Global variables use 167 bytes (8%) of dynamic memory, leaving 1881 bytes for local variables. Maximum is 2048 bytes.
UNO ↔ Pi 직렬 통신 개통
간단한 파이썬 스크립트(pi_button_monitory.py)를 이용하여 Pi가 UNO에게 보내는 메시지를 UNO가 1602 LCD에 표시하도록 하고, 반대로 UNO의 버튼 입력을 Pi의 터미널 창에 표시하게 하였다(SELECT 버튼의 long press 포함). 가급적 TFT-LCD에서 많은 상태 정보를 표시하고 싶었으나, SSH가 끊어지거나 또는 전혀 반응하지 않는 일이 생겨서 일단 TFT-LCD는 쓰지 않고 개발을 이어가기로 하였다. TFT-LCD를 쓰지 않으니 SSH가 끊어지는 일은 발생하지 않았다.
몇 가지 해결해야 할 문제가 있다.
- journald persistent 기능이 제대로 돌지 않는다. 이는 systemd-journald 서비스가 로그 데이터를 디스크에 저장하도록 하여 재부팅한 다음 이전에 왜 system crash가 일어났는지 판별하기 위함이었다. 잘 되지 않는다면 Python logging을 파일로 남기는 것도 좋은 시도이다.
- FluidSynth는 기본적으로 systemd로 작동된다. 하지만 USB 오디오 기기가 연결되기 전에 실행되는 것이라서 동작을 예측하기 어려워진다.
- UNO를 꽂을 때 /dev/ttyACM0 또는 /dev/ttyACM1 중 어느 디바이스명이 할당될지 미리 알기 어렵다. 이는 최종적으로 /dev/fluidardule_uno와 같은 udev 규칙으로 고정하는 것이 바람직하다.
장치 이름으로 시리얼 디바이스 찾아 연결하기
ls -l /dev/serial/by-id/ usb-Arduino__www.arduino.cc__Arduino_Uno_123456-if00 -> ../../ttyACM1 # Python 코드 안에서 다음과 같이 포트 지정 PORT = "/dev/serial/by-id/usb-Arduino__www.arduino.cc__Arduino_Uno_123456-if00"
이번 개발 과정과 관련한 ChatGPT 대화 기록.
처음으로 소리를 내 보기
USB audio interface(Behringer UCA 200)과 USB MIDI keyboard controller(Akai MPK Mini MkII)를 연결한 상태에서 라즈베리파이를 부팅한 뒤 fluidardule_state_stage7c_autodac_bootsafe.py를 실행하면 다음을 순차적으로 실행한다.
- 아두이노 우노와 시리얼 통신 수립
- USB DAC가 연결된 것을 확인하고 FluidSynth 실행(SalC5Light2.sf2)
- 건반을 두드리면 소리가 남
- A2에 연결된 pot은 볼륨(CC7)
현재 아두이노 UNO에는 1602 LCD + 키패드 모듈과 pot만 연결된 상태이다. Select 버튼을 길게 누르면 halt/reboot 메뉴로 들어가며, 이 기능이 잘 작동하는 것까지 확인하였다.
- 작업 기록(2026년 3월 24일에 작성한 블로그 글)
- 내가 보유한 다른 USB audio interface(SC-D70, Onyx 2-2) 역시 코드를 수정하지 않고 잘 인식되었다. 그러나 어느 USB 기기를 쓰든지 자동으로 FluidSynth를 띄우고 장치를 연결하여 건반을 눌렀을 때 소리가 나게 하는 데에서 상당한 수준의 최적화가 필요하였다(2026년 3월 24일).
하드웨어 구성 완료 후 개발 진행 상황
로터리 인코더와 3개의 LED를 연결하였다. 회로는 이것 이상으로 달라지지 않을 것이다. 이 사진에서는 보이지 않았지만, Mackie Onyx Producer 2-2 오디오 인터페이스까지 포함해야 Fluid Ardule이라고 부를 수 있다.
- 2026년 3월 27일 - UNO–Pi 통신, UI 상태머신, MIDI 처리의 안정 동작 확보 (baseline milestone), 즉 Fluid Ardule의 기본 동작 루프(입력–처리–출력)가 안정적으로 동작하는 첫 완성 단계로서 '전원을 넣고 건반을 연결하면 피아노 소리가 난다'는 기본 기능을 구현한 상태이다.
- UNO–Pi 시리얼 링크 안정화 (HELLO/HB 기반 keepalive)
- MIDI passthrough 및 panic 처리 신뢰성 개선
- UI 상태 구조 정리 (HOME / MENU / POWER 흐름 확립)
- power 메뉴에서 reset / halt 분기 및 confirm 로직 구현
- LCD 깜빡임 감소 및 상태 표시 안정화
- systemd 기반 Pi 측 실행 구조와 정상 연동 확인
- fluid_ardule_milestone_2026-03-29 - 로터리 인코더 신호를 제대로 처리하기 위하여 사전 테스트를 거쳤다. 테스트용 펌웨어도 이 문서에 포함하였다.
프로그램 테스트 요령
2026년 3월 27일 버전에서는 부팅 후 systemd에 의해서 다음의 두 서비스가 자동적으로 실행된다.
tft-splash.service # 부팅 시 TFT-LCD에 스플래시 이미지를 띄움 fluid_ardule.service
설정 파일은 /etc/systemd/system에 있다. 하지만 이것은 실행 파일이 아니라 설정 파일이다. 실제 각 서비스가 불러오는 스크립트는 /home/pi/scripts에 존재한다(tft-splash.sh, launch_fluidardule.py).
인코더 작동 등 앞으로 추가해 나갈 스크립트 테스트할 때에는 fluid_ardule.service를 끈 상태에서 하는 것이 좋다. 스플래시 이미지는 그대로 두자.
sudo systemctl stop fluid_ardule.service # 즉시 멈춤 sudo systemctl disable fluid_ardule.service # 재부팅 후에도 작동하지 않게 함
systemd 서비스 스크립트를 변경한 경우 'sudo systemctl daemon-reload'를 실행해야 한다.


