User Tools

Site Tools


nano_ardule_midi_controller:start

Nano Ardule MIDI Controller: 설계 요약 문서

  • 작성자: 정해영
  • 최초 작성일: 2025년 8월 5일
  • 최종 수정일:Haeyoung Jeong 2025/08/26 08:37

2025년 8월 28일 제작 상태

네임스페이스가 포함하는 하위 정보

목표

별도의 조절 장치를 갖고 있지 않은 GM sound module의 활용도를 높이기 위한 Arduino Nano 기반의 MIDI Controller(Nano Ardule)를 제작한다. Ardule은 Arduino + Module의 합성어이며, 프랑스어로 ‘어려운’(arduous)이라는 뜻도 갖고 있다. 2개 프로그램의 layer/split이 가능하며, 음색 설정을 user program/combi 형태로 microSD 카드에 저장하고 로드할 수 있다. 또한 카드에 저장된 type 0 MIDI 파일을 재생하는 기능도 갖고 있다. 이 프로젝트는 GM 명령어를 공부하고 아두이노 활용의 익히기 위한 목적도 있다.

시스템 구성

  • 주 제어부: Arduino Nano 호환 보드 (CH341 드라이버 필요)
  • 출력 대상: SAM9703 도터보드 장착 사운드 모듈 (GM 사운드 모듈이라면 제한 없음)
  • 저장장치: microSD 카드 (user program, combi, global settings, Type 0 MIDI 파일 저장)
  • 디스플레이: 1602 I2C LCD (백라이트 포함, 파일럿 LED 불필요)
  • 입력 장치:
    • MIDI IN (외부 키보드 컨트롤러에서 입력)
    • Rotary Encoder 1개 (푸시 버튼 내장)
    • 기타 푸시버튼 6개:
      • PART SELECT
      • SPLIT
      • LOAD (+)
      • SAVE (-)
      • PLAY/PAUSE
      • STOP/EXIT
  • 출력 장치:
    • MIDI Activity LED 1개
    • 활성화 파트 표시 LED 3개 (A, B, Drums)
    • MIDI OUT (TX → DIN connector)

기본 작동법

  • 키보드(CH1 출력) → Ardule의 MIDI IN 연결
  • Ardule의 MIDI OUT → GM 사운드 모듈 연결
  • 전원 On 시 PART A LED 점등. 기본 악기는 GM #0 (어쿠스틱 그랜드 피아노)
  • 로터리 인코더를 돌려서 볼륨 조절
  • 인코더 버튼을 누르면 'Program Change' 진입. 인코더를 돌려서 원하는 프로그램을 선택 후 STOP/EXIT 버튼을 눌러 복귀.
    • 변경값은 회전 멈춘 후 0.2초 뒤 전송됨 (LCD에 전송 완료 표시)
  • LOAD 버튼 → 저장된 프로그램 로드. 인코더로 선택, STOP/EXIT으로 복귀
  • PART A 또는 B만 선택된 상태에서 LOAD → UsrPrg## 목록에서만 선택 가능
  • PART SELECT 순환: A → B → A+B → A (A+B 시 LED 동시 점등)
  • PART SELECT 더블클릭: DRUMS 모드(CH10 출력). 한 번 더 누르면 이전 상태로 복귀
  • PLAY/PAUSE + STOP/EXIT 동시 누름 → Transpose 설정 진입

프로그램 편집 및 저장

  • PART A, B, DRUMS 중 하나만 선택된 상태에서 편집 가능
  • 인코더 버튼 반복 누름 → 다음 파라미터 순환:
    • Program Change
    • Bank Select LSB (CC#32)
    • Chorus (CC#93)
    • Reverb (CC#91)
    • Pan (CC#10)
    • Cutoff Frequency (CC#74)
    • Resonance (CC#71)
  • 인코더 회전으로 값 변경, STOP/EXIT으로 복귀
  • 볼륨은 편집 모드에서는 조정 대상 아님, 그러나 저장 시 함께 기록됨
  • 편집 모드에서는 인코더, LOAD(+), SAVE(-), STOP/EXIT만 작동
  • SAVE → UsrPrg00~99 저장. 인코더로 번호 선택, 덮어쓰기 시 확인 메시지 표시
  • PART A와 B 설정 후 A+B 활성화 → UsrCmb00~99로 저장 가능

SPLIT 설정

  • SPLIT 버튼 → 중앙 C 기준으로 A/B 영역 나눔
  • 인코더 조작 순서:
    • Split point 선택
    • Lower octave 조절
    • Upper octave 조절
    • Lower volume
    • Upper volume
  • SAVE 버튼 → 현재 SPLIT 상태를 UsrCmb로 저장
  • STOP/EXIT → 복귀

MIDI 파일 재생

  • PLAY/PAUSE 버튼 → microSD 카드에서 Type 0 MIDI 파일 탐색
  • 파일명: file00.mid ~ file99.mid (최대 100곡)
  • 인코더로 곡 선택, PLAY/PAUSE로 재생 시작
  • 재생 중 PLAY/PAUSE → 일시 정지/재개, STOP → 처음으로 되돌림
  • 다음 곡 자동 재생 여부는 Global Settings에서 설정
  • 재생 중 키보드 입력은 CH14 (PART A), CH15 (PART B), CH10 (DRUMS)로 리매핑
  • STOP 후 다른 버튼 누르면 원래 상태로 복귀. 파트 설정은 복원됨

Global Settings

  • 저장 위치: EEPROM
  • 진입 방법: SPLIT 버튼 누른 상태로 전원 On
  • 설정 방법:
    • 인코더 버튼 → 카테고리 전환
    • 인코더 회전 → 값 조절
  • 설정 항목 (기본값):
    1. Part A default instrument: [0]
    2. Part B default instrument: [48]
    3. Part A channel: [1] (1~9, 11~16)
    4. Part B channel: [2] (1~9, 11~16)
    5. Alternative Part A channel: [14]
    6. Alternative Part B channel: [15]
    7. 인코더 대기 시간(초): [0.2] (0.1~1.0)
    8. MIDI file 정지 시 리와인드: [Y]
    9. MIDI file 연속 재생: [N]
    10. 곡 간 정지 시간(초): [5] (0~10)
    11. Dump settings to microSD card: [N]
  • EXIT 버튼 → 초기 상태로 복귀

회로

아두이노 나노의 핀 연결

74HC595 시프트레지스터 IC를 쓰지 않는 조건으로 설계했기 때문에 아두이노 나노의 모든 핀이 다 쓰이고 있다.

Arduino 핀 기능 설명 또는 역할
D0 MIDI IN (RX) 키보드에서 MIDI 수신
D1 MIDI OUT (TX) GM 음원으로 MIDI 전송
D2 Rotary Encoder CLK 회전 신호 A (인터럽트 가능)
D3 Rotary Encoder DT 회전 신호 B (인터럽트 가능)
D4 Encoder SW (버튼) 로터리 인코더 버튼 입력
D5 SPLIT 버튼 스플릿 기능 진입
D6 STOP/EXIT 버튼 편집 모드/재생 종료
D7 SAVE 버튼 현재 설정 저장
D8 LOAD 버튼 저장된 프로그램 로드
D9 MIDI Activity LED MIDI IN/OUT 동작 표시용
D10 microSD CS SD 카드 선택 신호
D11 microSD MOSI SPI 데이터 출력
D12 microSD MISO SPI 데이터 입력
D13 microSD SCK SPI 클럭
A0 Part A LED Part A 활성 표시
A1 Part B LED Part B 활성 표시
A2 Drums LED Drums 모드 표시
A3 PLAY/PAUSE 버튼 MIDI 재생 제어
A4 LCD SDA I2C LCD 데이터
A5 LCD SCL I2C LCD 클럭
A6 PART SELECT 버튼 파트 선택
  • D0/D1 (RX/TX): MIDI IN/OUT으로 사용할 수 있지만, USB 시리얼 통신과 공유되므로, 업로드 후에는 Arduino가 리셋되거나 통신 충돌이 일어날 수 있음. 사용 시 신중히 처리 필요 (예: 업로드 후 MIDI 회로 자동 연결 또는 점퍼).
  • SPI (D10–D13): microSD 카드에 적합하게 잘 배정됨.
  • A4/A5: I²C LCD에 올바르게 사용됨.
  • A6: 입력 전용 아날로그 핀이므로 버튼용으로 적절. 반드시 풀업 저항을 연결해야 함. 본 프로젝트에서는 10K 사용.

매우 불친절한 실체배선도(2025년 8월 26일 버전). 당연히 오류가 있을 수 있음!

전원 연결 요령

  • USB로 전원을 공급하면 Nano의 5V 핀으로 그대로 전달되는데, PC의 USB 포트 허용치(일반적으로 500mA) 이내로 제한된다.
    • 이 상태에서 Vin에서 뜨는 약 4V의 전압은 역누설 때문에 생기는 '유령 전압'이라서 실제로 전류 공급이 불가하다.
  • 외부 어댑터의 5V를 쓰려면 아두이노 나노의 5V 핀에 넣으면 된다. 단, 안정적인 5V여야 하며, USB와 동시 연결하면 전원이 충돌하거나 역전류가 발생할 수 있으므로 주의해야 한다.
  • 외부 5V 어댑터로 작동하는 경우 어댑터 커넥터 옆의 분배 스타노드에 메인 벌크(470-1000uF 전해)를 두면 전압 안정에 도움이 된다. 각 모듈 근처에는 로컬을 보강하기 위하여 4.7-47uF 전해 + 세라믹 100nF를 연결한다.
  • Vin으로 공급되는 전원은 레귤레이터를 거쳐 5V로 전환된다. 따라서 5V보다는 높아야 하며, 온보드 레귤레이터의 전류 제한에 유의해야 한다.
  • 일반 LED는 저항 포함 시 5~10mA로도 충분히 밝다. 단순 ON/OFF만 한다면 아두이노 나노 출력핀에서 저항을 직렬로 넣은 뒤 LED를 구동해도 좋다. 많은 예제에서 220Ω을 사용하는데, 실내에서 지시등 목적이라면 470 Ω~1 kΩ(2-4mA)로도 충분히 밝다.
    • ATmega328P 권장 핀당 ≤ ~20 mA (절대최대 40 mA)
[5V 안정화 어댑터 or DC-DC Step-down] → (전원 분배)
                                         ├── Arduino Nano 5V 핀
                                         ├── LCD 모듈
                                         ├── microSD 모듈
                                         └── LED, 센서 등

Decoupling capacitor (also reffered to as bypass capacitor)

https://rheingoldheavy.com/bypass-capacitors/

  • 74HC595의 Vcc-GND에 리드를 최대한 짧게 하여 100nF 세라믹 커페시터 배치
  • 전원 안정화 목적의 커패시터 배치 요령은 위에서 설명하였음

인코더 신호 처리

  • 인코더 출력(CLK→D2, DT→D3)은 아두이노 나오의 디지털 입력핀에 직접 넣지 않고 74HC14 슈미트 트리거를 통과하여 넣었다. 남는 게이트의 입력핀은 Vcc로 묶는다.

MIDI IN & OUT schematics

opto-isolator는 PC900을 사용하였다. 아래 회로도에서는 표시하지 않았으나 PC900의 6번핀(+5V)과 그라운드 사이에 바이패스 커패시터를 연결해 놓았다. 스케치 업로드 시에는 RX/TX로 연결되는 회로를 끊어야 PC와 아두이노 나노 사이에 시리얼 통신이 원활하게 진행된다(점퍼 처리).

5핀 DIN MIDI 커넥터에서 실제 신호가 왕복하는 핀은 다음의 두 개이다. 2번 핀은 케이블 쉴드 접지용이고, 1과 3은 쓰지 않는다.

  • Pin 4: MIDI Current Source (+5 V 쪽)
  • Pin 5: MIDI Current Sink (Signal)

2025년 8월 26일 현재 MIDI in 회로가 제대로 작동하지 않는다. 허, 돌아버리겠다. 이미 DREAM SAM9703 도터보드 작동을 위해 만들어서 잘 작동함을 입증한 회로인데…(증거물) 8월 27일, 만능기판 뒤 패드 사이를 잘 긁어내고 에탄올로 세척하여 문제를 해결하였다!

4번 핀에 달린 280Ω 저항은 너무 낮은 값이다?

일부 회로/쉴드(특히 6N138 다알링턴 출력용)에서 220–330 Ω을 쓰는 예가 있지만, PC900은 디지털(오픈콜렉터) 타입이라 그렇게 낮추면 싱크 전류가 과다해져서 동작이 불안정해지거나 스펙을 초과한다고 한다.

  • 수신 옵토가 PC900V, 수신 전원 5V(=VRX), 규격에 충실한 MIDI IN 표준 회로일 때 RD=280Ω 권장. 에지를 빠르게 해 rise/fall을 2µs 이하로 맞추기 쉽다고 한다. 그러나 챗GPT는 이 저항이 너무 낮나고 한다.
  • 280 Ω로도 “될 수는” 있지만, PC900류에겐 전류 여유가 거의 없음
  • 1 kΩ 전후 + 74HC14 구성이 신뢰성과 수명, 호환성 면에서 가장 안전
  • 74HC14를 쓰지 않는다면 2.2 kΩ ~ 4.7 kΩ → 전류도 적당, 파형도 충분히 빠름
  • 만약 6N138이라면 220–330 Ω이 관행이지만, 그 경우도 전류/발열을 반드시 확인해야 함

MIDI IN 신호 처리 회로 점검 가이드

참고

nano_ardule_midi_controller/start.txt · Last modified: by hyjeong