User Tools

Site Tools


fluidcanvas_r2pi:arduino_uno-based_controller_development

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를 실행하면 다음을 순차적으로 실행한다.

  1. 아두이노 우노와 시리얼 통신 수립
  2. USB DAC가 연결된 것을 확인하고 FluidSynth 실행(SalC5Light2.sf2)
  3. 건반을 두드리면 소리가 남
  4. A2에 연결된 pot은 볼륨(CC7)

현재 아두이노 UNO에는 1602 LCD + 키패드 모듈과 pot만 연결된 상태이다. Select 버튼을 길게 누르면 halt/reboot 메뉴로 들어가며, 이 기능이 잘 작동하는 것까지 확인하였다.

  • 내가 보유한 다른 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 - 로터리 인코더 신호를 제대로 처리하기 위하여 사전 테스트를 거쳤다. 테스트용 펌웨어도 이 문서에 포함하였다.

I2C 2004 LCD로 교체

2026년 4월 4일, 조작성을 높이기 위해서 I2C 2004 LCD 모듈과 별도의 5버튼 키패드를 달았다. 키패드의 저항 조건을 알아내고 인코더 동작을 안정화하느라 약간 어려움이 있었다. 모든 부품을 나무판 위에 임시로 고정하였다.

Version 1.3으로 하드웨어 구성 전면 변경

프로그램 테스트 요령

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'를 실행해야 한다.

fluidcanvas_r2pi/arduino_uno-based_controller_development.txt · Last modified: by hyjeong