XOD로 아두이노 커스텀 LCD 메뉴 만들기 - 코딩 없이 드래그 앤 드롭으로
부품 및 소모품
아두이노 우노
1개
DFRobot 아두이노 LCD/키패드 실드 (16x2)
1개
소프트웨어
XOD 비주얼 프로그래밍 환경 (xod.io)
프로젝트 배경
아두이노 프로젝트가 복잡해질수록 사용자 인터페이스가 필요해집니다. 전용 버튼/스위치는 한계가 있고, 메뉴 기반 인터페이스가 필수적입니다. 하지만 C/C++로 메뉴 시스템을 짜면 학습 곡선이 가파르고 수정도 어렵습니다. 이 프로젝트는 XOD의 그래픽 프로그래밍 환경에서 **드래그 앤 드롭만으로 메뉴 시스템을 빠르게 프로토타이핑**할 수 있는 라이브러리를 만드는 것이 목표입니다.
시스템 구조
1. 메뉴 컨트롤러 섹션 (우측)
아날로그 입력 노드 : LCD 실드의 키패드는 A0 핀에 연결되며, 버튼별로 다른 전압을 출력합니다.
키패드 디코더 노드 : 전압을 읽어 업/다운/좌/우/셀렉트 펄스로 변환. 디바운스 타임아웃 조절 가능.
메뉴 컨트롤러 노드 : 펄스 입력을 받아 메뉴 트리 탐색, 선택, 파라미터 변경 로직 처리. 스플래시 화면용 문자열 입력 2개, 외부 파라미터 입력(아날로그 값 등) 1개 수용.
LCD 디스플레이 노드 : XOD 표준 라이브러리의 16x2 LCD 노드. 다른 디스플레이로 쉽게 교체 가능.
2. 메뉴 트리 섹션 (좌측 상단)
트리 형태의 노드 조합으로 메뉴 계층 정의:
리프(Leaf) 메뉴 : 최종 메뉴, 파라미터 변경이나 액션 실행. 주황색 입력 포트 없음.
브랜치(Branch) 메뉴 : 하위 메뉴 그룹. 입력/출력 포트 모두 있음. 'Invoke' 시 하위 메뉴로 진입.
콘캣(Concat) 메뉴 : 여러 서브 메뉴를 묶어 브랜치 입력으로 전달.
서브-서브 메뉴 등 다중 계층 가능. 메모리 한계 내에서 자유롭게 확장.
3. 출력 섹션
각 리프 메뉴의 펄스 출력을 플립플롭에 연결해 디지털 핀 토글. 릴레이, LED 등 외부 장치 제어에 활용. 버퍼 노드에 파라미터 저장 후 다른 노드로 라우팅도 가능.
알려진 이슈 및 제한사항
최소 하나 이상의 브랜치 메뉴가 있어야 컴파일됨.
'최상위 메뉴로 돌아가기' 기능 미구현 (차기 버전 예정).
4라인 디스플레이 지원하지만 4라인 리프 메뉴 노드는 미완성.
상수 문자열이 RAM을 많이 차지함 → 플래시 문자열(Flash-string) 노드로 우회. 노드 내부 C++ 코드에서 문자열 수정 필요.
ID 입력 포트 미구현.
두 번째 예시: 파라미터 입력/저장/표시
카운터 노드 값을 메뉴 컨트롤러의 파라미터 입력으로 넣고, 리프 메뉴 'A' 선택 시 현재 값을 버퍼에 저장. 저장된 값은 1번 줄에, 현재 입력값은 2번 줄에 표시. 버퍼 출력을 다른 장치 제어에 연동 가능.
라이브러리 설치 및 사용
XOD IDE에서 File → Add Libraries... 선택
bitrex/xod-menu-system 검색 후 추가
제공되는 .xodball 파일을 열거나 라이브러리 노드 사용
라이브러리 링크: https://xod.io/libs/bitrex/xod-menu-system-11
향후 계획
ARM 기반 보드(ESP32, STM32 등) 테스트
더 다양한 입력/출력 노드 타입 추가
컴파일 타임 메타프로그래밍으로 플래시 메모리 활용 극대화, RAM 오버헤드 감소