Claude Code + Blender MCP로 3D 케이스 4종 제작기
한 세션에서 Claude Code와 Blender MCP를 활용해 실제 사용 가능한 3D 프린트 케이스 4종을 설계·생성한 기록.
TL;DR
- 도구: Blender 5.1 + BlenderMCP addon + Claude Code superpowers skills
- 워크플로우: brainstorming → writing-plans → subagent-driven-development
- 결과물 4종: 스마트팜 분무팁 · Arduino Mega+L298P 케이스 · 5인치 LCD+Pi+릴레이쉴드 케이스 · Raspberry Pi 4B 케이스
- 모든 STL manifold 검증 통과, FDM 프린터(PETG/PLA) 인쇄 준비 완료
사용한 도구 스택
1. Blender 5.1 + BlenderMCP
BlenderMCP addon을 Blender 5.1에 설치하면 외부에서 Python 코드를 보내 메쉬를 생성·편집할 수 있다. 본 작업에서는 Claude Code 세션에서 mcp__blender__execute_blender_code 도구로 bpy API 호출.
[Claude Code 세션] ──MCP/JSON over TCP:9876──> [Blender + BlenderMCP addon]
bpy.ops.* (primitives, booleans, STL export)
2. Claude Code superpowers skills
세 가지 skill을 시퀀스로 사용:
brainstorming → 요구사항 인터뷰 + 디자인 옵션 + spec 문서
↓
writing-plans → 구현 계획 (태스크 8~9개로 분해, TDD 스타일)
↓
subagent-driven-development → 태스크당 새 subagent 디스패치, 2단계 리뷰
각 프로젝트마다 동일 패턴 반복. spec/plan 문서가 git에 함께 commit되어 추후 치수 수정 시 단일 소스로 참조.
3. 검증된 모듈 패턴
모든 케이스 프로젝트가 같은 파일 구조를 공유:
project/
├── docs/
│ ├── specs/YYYY-MM-DD-<name>-design.md
│ └── plans/YYYY-MM-DD-<name>.md
├── src/
│ ├── params.py # 모든 치수 (단일 소스 of truth)
│ ├── geom.py # 공유 Blender 헬퍼 (clear_scene, add_cube, add_cylinder, boolean_*)
│ ├── <component>.py # 각 부품 (shell, lcd_mounts, cutouts, ...)
│ ├── verify.py # bbox + non-manifold edge 검증
│ └── build.py # 오케스트레이터 + STL 익스포트
└── output/
└── *.stl, *.png # 인쇄용 STL + 시각 검증 렌더
params.py만 수정하면 즉시 재빌드되어 새 STL 생성. 치수 조정에 매우 유연.
프로젝트 1: 🌿 Halo Spray Nozzle (스마트팜 분무팁)
개요
5V DC 워터펌프 + 6mm ID 실리콘 호스에 끼우는 360° 안쪽 분무 링. 식물 근권부 균등 급수 용도.
디자인 핵심 결정
- 할로(halo) 형태: 도넛 디스크 내측 림에 6개 노즐, 안쪽으로 분사
- 저압 5V 펌프 최적화: 노즐 6개(많지 않게) × Ø1.5mm(막힘 적게) + 채널 단면적이 노즐 총 단면적의 4.5배 (압력 손실 최소)
- 노즐 -15° 다운틸트: 물이 잎이 아닌 토양으로 향함
단면 구조
┌─ 바브 (호스 6mm 안쪽으로 꽂힘)
│ 외경 8mm / 7.5mm 2단 미늘
▼
━━━━━┓
┌──────────┻──────────┐
│ ┌────────────────┐ │ ◀── 평면 디스크 (안지름 90mm)
│ │ ● ● ● ● ● │ │ ◀── 안쪽 림에 노즐 6개 (60° 간격)
│ │ ● ● │ │
│ │ ┌──┐ │ │
│ │ │식물│ │ │
│ │ └──┘ │ │
│ │ ● ● │ │
│ │ ● ● ● ● ● │ │
│ └────────────────┘ │
└─────────────────────┘
◀────── 외경 114mm ──────▶
치수 요약
| 항목 | 값 |
|---|---|
| 외경 × 안지름 × 높이 | 114 × 90 × 10 mm |
| 노즐 | 6개 × Ø1.5mm, -15° 틸트 |
| 바브 | 8/7.5/8mm 2단 미늘, 높이 15mm |
| 인쇄 | PETG, 100% infill, ~1.5시간 |
렌더
상단 뷰: 도넛 형태 + 12시 바브 + 안쪽 림 6개 노즐
입체 형상
측면: 디스크 + 바브 돌출
STL 다운로드
halo-nozzle-v1.stl (200 KB)
프로젝트 2: 🔋 Arduino Mega + L298P 모터쉴드 케이스
개요
Arduino Mega 2560 + L298P H브리지 모터쉴드(우노 사이즈)를 담는 위 오픈 트레이 케이스. 쉴드 위 점퍼 헤더에 자유롭게 접근하기 위해 윗면 완전 오픈.
디자인 핵심 결정
- 단일 모놀리식 트레이 (위 완전 오픈): 점퍼 접근 + 메가 D22~D53 헤더 자유 접근
- M3 스탠드오프 보스 ×4: 메가 PCB 마운팅 홀 4개 좌표 (15.24/50.8/96.5 등) 정확 매핑
- 사이드 엔트리 모터 터미널: L298P 쉴드 모터 케이블이 측벽 통과
- 통풍 슬릿 11개 (5+6): 짧은 변 + 긴 변에 격자 패턴
- USB-B + DC 잭 컷아웃: 메가 단변
정정 이력 (사용자 사진 박스 표시 기반)
| 버전 | 변경 |
|---|---|
| v1 (잘못) | USB-B/DC 잭 위치 좌우 반대 |
| v1 정정 | USB/DC 좌표 swap |
| v2 정정 | 모터 컷아웃 면 변경 (긴 변 1 → 긴 변 2) + 통풍 슬릿 재배치 |
→ 사진 박스 표시가 가장 정확한 정보. 추정 X.
치수 요약
| 항목 | 값 |
|---|---|
| 외형 (W × D × H) | 111 × 63 × 35 mm |
| 스탠드오프 | M3 × 4, Ø6/Ø2.5, 높이 5mm |
| 컷아웃 | USB-B + DC 잭 + 모터 케이블 + 통풍 슬릿 |
| 인쇄 | PETG, 4 walls, 25% infill, ~3.5시간 |
렌더
상단 뷰: 트레이 + 4코너 보스 + 측면 컷아웃
입체 (정정 후 v2)
STL 다운로드
mega-l298p-case-v1.stl (138 KB)
프로젝트 3: 📺 5인치 DSI LCD + Pi 4 + 릴레이쉴드 케이스 (학습 사례)
개요
Waveshare 5inch DSI LCD (B) + Raspberry Pi 4 + Pi-Sd8R 릴레이쉴드(PA1A 4개 + MAX485)를 담는 landscape 케이스.
디자인 결정 + 7번의 정정 (가장 많은 시행착오)
| 버전 | 변경 |
|---|---|
| v1 | portrait 방향, Pi USB를 아래로 |
| v2 | landscape 회전 + 컷아웃 재매핑 (12핀 단자/Pi USB 위치 정정) |
| v3 | 마운팅 핀 → 내부 보스 컬럼 (잠금 방식 정정) |
| v4 | 불필요한 케이블 통과 슬롯 제거 |
| v5 | STEP 정밀 분석 + 외형 축소 + Pi USB 뒷판 컷아웃 |
| v6 | 뒷판 막힘 + Pi USB 좌측 측면 |
| v7 | 2피스 분리형 (LCD 프레임 + Pi 케이스) |
| v7.2 | LCD 실측 반영 (베젤 128×82, PCB 122×76) |
| 종료 | 본질 구조(클램쉘 결합/Pi 접근/LCD 마운트) 모호 → 처음부터 다시 하기로 |
가장 중요한 교훈
- STEP/CAD 파일은 처음부터 정밀 파싱: R=4 코너원이 “코너 라운드”인지 “보드 가장자리”인지 명확히
- 사용자 실측이 데이터시트보다 정답: 베젤/PCB 사이즈 차이는 측정해야 함
- 본질 구조를 먼저 확정:
- LCD 마운팅 방향 (앞/뒤/측면 나사?)
- Pi 4의 USB 잭이 LCD 외형 안쪽에 있어서 단일 케이스 측면 컷아웃 불가 (LCD 표준 = Pi가 LCD 뒷면 중앙에 매달림)
- 부품 분리/결합 방식
- 2피스 분리형의 결합 구조 (스냅 / 나사 / 끼움) 명확히
정밀 분석으로 추출한 STEP 데이터
LCD 외형 (R=4 코너원 + z=-1.7 outline):
127.7 × 87.4 mm (코너 R4)
LCD 마운팅 홀 (Ø2.0):
LCD 중심에서 (±56.5, ±32.9)
→ 가장자리 인셋: X=7.35, Y=10.8 mm (비대칭)
Pi 4 마운팅 홀 (LCD 뒷면):
LCD 중심에서 (-32.5~25.4, -23.8~25.3)
→ 표준 Pi 4 58×49 패턴, X 방향 -3.55mm 오프셋
결론
이 프로젝트는 본질 구조 결정 없이 외형부터 만들면 끝없이 정정한다는 교훈을 줌. 처음부터 다시 하기로 결정.
프로젝트 4: 🐰 Raspberry Pi 4B 단독 케이스
개요
LCD 케이스 경험을 살려 처음부터 정확히 진행한 표준 클램쉘 케이스. GPIO 미사용 → 윗면 막힘 OK.
디자인 핵심 결정 (정정 없이 한 번에 통과)
- 클램쉘: 본체 트레이 + 윗 뚜껑, 4코너 M3 나사 결합
- 모든 포트 노출: USB-C + microHDMI×2 + AV (단변 1), USB×4 + Ethernet (긴 변), microSD (단변 2)
- 패시브 통풍: 윗 뚜껑에 사각 슬릿 12개 (4×3 격자)
- 책상용: 바닥 4코너 고무발 자국 Ø8 × 0.5mm
단면 구조
┌─────────────────────────────────────┐
│ ┌─┐ HDMI HDMI ┌─┐ ┌─┐ USB-C │ ← 윗 뚜껑 (z=25~30, 5mm 두께)
│ │ │ □ □ │ │ │ │ □ │ 통풍 슬릿 12개
│ └─┘ │ 클램쉘 결합 4코너 관통구
├─ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ─┤ ← 클램쉘 결합부 (z=25)
│ ◯ Pi 4 마운팅 보스 4개 ◯ │ ← 본체 (z=0~25)
│ (Pi 표준 58×49 패턴) │
│ │ 측벽 컷아웃:
│ ◯ ◯ │ USB+Eth (긴 변)
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │ USB-C/HDMI/AV (단변)
└─────────────────────────────────────┘ microSD (반대 단변)
◀────── 92mm ──────▶
치수 요약
| 항목 | 값 |
|---|---|
| 외형 (W × H × D) | 92 × 62 × 30 mm (본체 25 + 뚜껑 5) |
| Pi 마운팅 | 4× M2.5 보스 (Pi 표준 58×49) |
| 클램쉘 결합 | 4× M3 보스 (코너) + 뚜껑 Ø3.2 관통구 |
| 인쇄 | PETG, 4 walls, 25% infill, 본체 ~2h + 뚜껑 ~1h |
| 메쉬 | manifold ✅ (body 0, lid 0) |
렌더
본체 상단: 4코너 클램쉘 보스 + 가운데 Pi 마운팅 보스 + 측면 컷아웃
본체 입체
뚜껑 상단: 4코너 관통구 + 통풍 그릴 12 슬릿
뚜껑 입체
STL 다운로드
- pi4b-case-body.stl (193 KB)
- pi4b-case-lid.stl (51 KB)
워크플로우 패턴 (재사용 가능)
1. Brainstorming 단계
사용자 요구 입력
↓
한 번에 하나씩 multiple-choice 질문
- 케이스 형태? (트레이/클램쉘/슬라이드)
- 노출 포트? (다중 선택)
- 마운팅 방식?
- 거치 방식?
- 냉각?
↓
2-3 접근 방식 제안 + 트레이드오프
↓
디자인 섹션 제시 (치수표 + ASCII 다이어그램)
↓
spec 문서 작성 + 셀프 리뷰
↓
사용자 검토 게이트
2. Writing-plans 단계
spec을 7~9개 태스크로 분해:
Task 1: params + geom + git init
Task 2: shell (외형 박스)
Task 3: mounting bosses (보스 컬럼)
Task 4: cutouts (포트 컷아웃)
Task 5: verify (manifold + bbox)
Task 6: build orchestrator + STL export
Task 7: visual verification (다각도 렌더)
Task 8: README (인쇄/조립 가이드)
각 태스크는 2~5분 단일 동작. 완전한 코드 블록 포함 (placeholder 없음).
3. Subagent-driven-development 단계
각 태스크마다 fresh subagent 디스패치 → 2단계 리뷰 (spec compliance + code quality). 컨텍스트 오염 X.
배운 점 (다음 프로젝트에 적용)
✅ 잘 한 것
- params.py 단일 소스: 치수 한 번 정의, 모든 모듈이 import. 수정 시 한 곳만.
- 검증된 모듈 패턴 재사용: geom.py / verify.py / build.py 같은 boilerplate를 프로젝트마다 복사. 인프라 작업 시간 절약.
- subagent 워크플로우: 한 세션에서 4개 프로젝트 (총 30+ 태스크) 완료. 컨텍스트 폭발 없음.
- 시각 검증 자동화: 매 빌드 후 Blender 렌더로 형태 확인. 보드 미연결 상태에서도 디자인 검토 가능.
❌ 피해야 할 것
- 추정값으로 디자인 진행: LCD 케이스에서 STEP 첫 50줄만 보고 외형 추정 → 5mm 빗나감 → 7번 정정.
- 본질 구조 없이 외형 부터: 결합 방식·마운팅 방향이 모호하면 외형이 맞아도 결국 다시.
- 사용자 실측 무시: 베젤 128 vs PCB 122처럼 두 사이즈가 다른 경우, 사용자가 자로 잰 게 정답.
- 단일 케이스 + Pi USB 측면 노출: Pi가 LCD 뒷면에 매달리면 USB가 항상 LCD 안쪽 → 측면 컷아웃 불가능. 본질적 제약을 처음에 알아야 함.
인쇄 설정 (모든 프로젝트 공통)
| 항목 | 값 |
|---|---|
| 재료 | PETG (1순위, 내열·내구) / PLA 가능 |
| 노즐 | 0.4 mm |
| 레이어 높이 | 0.2 mm |
| 벽 라인 수 | 4 |
| 상/하판 | 4 라인 |
| 인필 | 25% (Halo는 100%) |
| 서포트 | 없음 (모든 디자인이 서포트 불필요) |
코드 예시: params.py 한 곳에서 모든 치수 관리
"""Pi 4B Case dimensions (all in mm)."""
# Pi 4 표준
PI_PCB_W = 85.0
PI_PCB_H = 56.0
PI_MOUNT_HOLES_PCB = [
(3.5, 3.5), (61.5, 3.5), (3.5, 52.5), (61.5, 52.5),
]
# 케이스 외형 (Pi + 측벽 + 마진 = 자동 계산)
WALL = 2.5
PI_BOARD_MARGIN_X = 1.0
OUTER_W = PI_PCB_W + 2 * (WALL + PI_BOARD_MARGIN_X) # 92.0
# 마운팅 보스 (case 좌표 = PCB 위치 + 표준 홀 좌표)
PCB_ORIGIN_X = WALL + PI_BOARD_MARGIN_X # 3.5
PI_BOSS_BL = (PCB_ORIGIN_X + PI_MOUNT_HOLES_PCB[0][0], ...) # (7.0, 6.5)
# ... 모든 컷아웃, 보스, 통풍 등이 단일 파일에
치수 수정 → build.main() 한 번 호출 → 새 STL 자동 생성.
마무리
Claude Code + Blender MCP 조합으로 하루 만에 4개 케이스를 디자인부터 인쇄 준비까지 끝낼 수 있었다. 특히 LCD 케이스의 7번 정정 경험이 이후 Pi 4B 케이스를 한 번에 통과시키는 데 결정적이었음.
3D 프린트 케이스를 만들 때 알게 된 교훈:
- 본질 구조 (마운팅, 결합, 포트 노출) → 외형 치수 → 컷아웃 순서로 고민
- 사용자 실측 우선, 추정 금지
- 단일 소스 of truth (params.py) 가 정정 비용을 줄여줌
다음에 해볼 것: ESP32 케이스, DIN 레일 마운트 컨버터 케이스, VESA 마운트 미디어 PC 케이스.