워크숍 환경에서 Arduino 펌웨어의 일부 파라미터만 안전하게 수정하고 업로드하기 위한 최소 웹 인터페이스입니다.
현재 구현은 templates/*.ino 템플릿을 동적으로 읽어, 템플릿별 파라미터를 입력받아 arduino-cli로 compile/upload를 수행합니다.
- 멀티 템플릿 업로드
templates/*.ino자동 인식- 템플릿별 파라미터 UI 자동 생성
- 템플릿 기반 코드 생성
{{PARAM_NAME}}치환
- Arduino 보드 자동 감지
arduino-cli board list --format json결과 기반- 첫 번째 지원 보드 자동 선택
- 웹 UI에서 상태/로그 확인
- 레트로 UI (Game Boy 톤)
MatterMatters-WEBARDU/
├── frontend/
│ └── index.html
├── backend/
│ └── server.js
├── templates/
│ └── blink.ino
├── generated/
├── PROJECT_PLAN.md
├── PROJECT_DEVLOG.md
├── package.json
└── README.md
- Node.js 18+ 권장
arduino-cli가 PATH에서 실행 가능해야 함
예시 확인:
arduino-cli versionUNO 기준 예시:
arduino-cli core update-index
arduino-cli core install arduino:avr프로젝트 루트에서:
npm start서버 기본 주소:
http://127.0.0.1:3000
- Arduino 보드를 USB로 연결
- 브라우저에서
http://127.0.0.1:3000접속 - 템플릿을 선택하고 파라미터를 입력
- 상단
Detected Board에 자동 선택된 보드/포트 확인 - 필요 시
RESCAN클릭 UPLOAD클릭- 하단 로그로 compile/upload 결과 확인
- 감지된 보드 목록과 자동 선택 보드 반환
응답 예시:
{
"ok": true,
"boards": [
{
"port": "/dev/tty.usbmodem1101",
"fqbn": "arduino:avr:uno",
"boardName": "Arduino Uno"
}
],
"selected": {
"port": "/dev/tty.usbmodem1101",
"fqbn": "arduino:avr:uno",
"boardName": "Arduino Uno"
}
}templates/*.ino목록과 각 템플릿의 파라미터 스키마 반환
응답 예시:
{
"ok": true,
"templates": [
{
"id": "blink",
"fileName": "blink.ino",
"name": "Blink",
"description": "LED를 고정 간격으로 점멸합니다.",
"params": [
{
"key": "INTERVAL",
"label": "Blink Interval (ms)",
"type": "int",
"min": 50,
"max": 5000,
"default": 500
}
]
}
],
"selected": {
"id": "blink"
}
}- interval을 검증/보정 후 템플릿 생성 → compile → upload 실행
요청 예시:
{
"templateId": "blink",
"params": {
"INTERVAL": 500
},
"port": "/dev/tty.usbmodem1101",
"fqbn": "arduino:avr:uno"
}참고:
- 서버는 업로드 직전에 보드 목록을 다시 읽고, 유효한 대상이 없으면 실패를 반환합니다.
- 현재 기본 정책은 "자동 첫 보드 선택"입니다.
templates/에 .ino 파일을 추가하면 자동으로 목록에 나타납니다.
권장 형식:
/* @WEBARDU_META
{
"id": "blink",
"name": "Blink",
"description": "LED를 고정 간격으로 점멸합니다.",
"params": [
{
"key": "INTERVAL",
"label": "Blink Interval (ms)",
"type": "int",
"min": 50,
"max": 5000,
"default": 500
}
]
}
*/
int interval = {{INTERVAL}};메모:
key는{{KEY}}플레이스홀더와 동일해야 합니다.params가 없으면 플레이스홀더를 자동 추론해 텍스트 입력으로 노출합니다.- 지원 타입:
int,float,bool,enum,text,code
HOST(기본:127.0.0.1)PORT(기본:3000)ARDUINO_FQBN(기본:arduino:avr:uno)
참고:
- 현재 업로드 포트는 자동 감지로 처리하므로
ARDUINO_PORT설정이 필수는 아닙니다.
- 보드가 감지되지 않음
- 케이블/포트 연결 확인
arduino-cli board list결과 확인
- 업로드 권한 오류
- macOS/Linux의 포트 접근 권한 확인
- 코어 미설치 오류
arduino-cli core install arduino:avr재확인
- 구현 진행 내역:
PROJECT_DEVLOG.md - 기획 문서:
PROJECT_PLAN.md - 개발 : Seungbum Kim with GPT-5.3 Codex OpenCode Zen (2026-04)