젠 가든 CNC 엔드 테이블: 나만의 스마트 가구 만들기
부품 및 소모품
| 부품 |
수량 |
| Arduino UNO |
1 |
| OpenBuilds 12V/29A 파워 서플라이 |
1 |
| OpenBuilds NEMA 17 스테퍼 모터 |
2 |
| SparkFun A4988 스테퍼 모터 드라이버 보드 |
2 |
| 가변 출력 리니어 레귤레이터 (LM317) |
1 |
| 아날로그 조이스틱 (범용) |
1 |
| 화이트 LED 스트립 |
1 |
| RF 리모컨 |
1 |
| 커패시터 220µF |
2 |
| 브레드보드 (범용) |
1 |
| SparkFun 스내퍼블 프로토보드 |
1 |
| 2020 알루미늄 익스트루전 |
필요량 |
| 8mm 리니어 모션 스무스 로드 |
4 |
| 8mm 리니어 샤프트 가이드 마운트 |
8 |
| 3D 프린터 부품 (벨트, 베어링 등) |
필요량 |
| Kreg 포켓 홀 지그 |
1 |
| 1/4인치 판유리 (강화유리 아님) |
1 |
| 3/4인치 볼 베어링 |
1 |
| 25lb 흰색 놀이용 모래 |
1 |
| 매끄러운 강돌 2봉지 |
2 |
| 네오디뮴 원형 베이스 자석 |
1 |
| 플라스틱 콘듀트 2홀 스트랩 |
여러 개 |
| 목재 (4x4, 셀렉트 파인, 1/4인치 자작나무 합판, 1/8인치 MDF) |
필요량 |
앱 및 온라인 서비스
프로젝트 소개
저는 메이커입니다. 밤에 가족과 TV 앞에 앉아 몰스킨이나 프로젝트 노트에 아이디어를 스케치하며 보냅니다. 많은 대화가 "~~하면 멋지지 않을까?"로 시작하죠. 대부분의 아이디어는 노트에서 나오지 않지만, 이 프로젝트는 실현되었습니다. 저는 이 결과물이 정말 멋지다고 생각합니다. 엔드 테이블에 내장된 밀폐형 젠 가든입니다. 움직임은 CNC나 3D 프린터에서 영감을 받았고, 처음에는 램프 1.4(3D 프린터 아두이노 실드)를 사용하려 했으나 훨씬 더 쉬운 제작 방법을 고안했습니다.
최종 결과물이 평온함을 표현하길 원했습니다. 거실에 선(禪)의 분위기를 더하고 싶었죠. 저는 성공했다고 봅니다.
제가 만드는 것들은 대개 예쁘지 않습니다. 그게 현실이죠. 이 프로젝트를 진행하며 아내에게 정확히 무엇을 만드는지 설명하지 않았습니다. 그저 "우리 집에 두고 자랑스러워할 만큼 예쁜 가구"가 될 거라고만 약속했죠. 아내는 제 가장 친한 친구이자 모든 것을 공유하는 사이지만, 이 프로젝트만큼은 최종 결과물만 보여주기로 했습니다. 아내는 엔드 테이블이라는 것만 알았습니다. 그래서 아내가 거실에 두고 자랑스러워할 만큼 정말 멋지게 만들기 위해 더 열심히 노력했습니다.
3D 프린터도 만들어봤고, 간단한 가구(책장, 벤치 등)도 만들었지만, 기술과 가구를 결합한 것은 처음이었습니다. 정말 재미있는 프로젝트가 될 거라 확신했습니다.
이 테이블 아이디어는 약 6개월 전부터 구상했습니다. '테이블 및 책상 콘테스트'(그리고 탐나는 검정-노랑 공구들)가 이 프로젝트 시작의 계기가 되었습니다.
1단계: 설계 및 아이디어
혼자 두거나 소파 옆에 두고 스탠드를 올릴 수 있는 엔드 테이블을 만들고 싶었습니다. 단순한 가구보다는 '예술'에 가깝게, 기술이 나무에 스며든 형태를 원했습니다. 나무 갈퀴가 있는 돌정원을 보며 항상 평화롭다고 느꼈습니다. 그게 바로 이 제작의 목표였습니다. 평화로운 기술 융합 예술.
이를 위해 Z축 없는 3D 프린터 같은 갠트리 구조를 생각했습니다. 이렇게 하면 자석을 이용해 볼 베어링을 모래 같은 매체 속에서 움직일 수 있습니다. 또한 그림이나 패턴을 스스로 '프린트'하도록 프로그래밍할 수도 있습니다.
아두이노에 스테퍼 모터 드라이버 2개와 간단한 코드를 사용할 계획입니다. 코드에 고정된 공간을 프로그래밍하는 대신, X/Y축 최소/최대 위치에 엔드스톱을 설치해 0,0과 최대값에서 모터가 멈추게 했습니다. 이렇게 하면 프로그래밍이 훨씬 쉬워집니다.
2단계: 필요한 부품 및 자재
제가 사용한 부품 목록입니다. 반드시 같은 부품을 써야 하는 건 아니고, 대략적인 참고용입니다.
- 목재: 트리하우스에서 회수한 4x4, 아내가 창문 몰딩용으로 산 셀렉트 파인(나중에 더 사주기로 약속), 가지고 있던 큰 목재 조각들, 몇 년 전 다른 프로젝트용으로 산 1/4인치 자작나무 합판.
- 1/8인치 MDF: 상판과 베이스 사이에 끼워 접착 면을 확보하려 했으나, 돌이켜보면 생략해도 됐을 것 같습니다. 다시 한다면 안 쓸 겁니다.
- 2020 알루미늄 익스트루전: 갠트리 프레임 제작용.
- 스테퍼 모터 2개 ($12.99): X, Y축 이동용.
- Arduino UNO: 갠트리 제어용.
- 아두이노 조이스틱 모듈: 수동 제어용.
- 8mm 리니어 모션 스무스 로드 x4, 8mm 리니어 샤프트 가이드 마운트 x8
- 3D 프린터 부품: 벨트, 스무스 로드, 베어링 등 기존 제작에서 남은 부품 활용.
- Kreg 포켓 홀 지그: 필수는 아니지만 가구 제작을 훨씬 쉽게 해줍니다. 상판과 상판-베이스 결합에 사용.
- 1/4인치 판유리: 지역 유리/페인트 가게에서 구매. 강화유리가 아니어서 깨지면 위험한 파편이 생기지만, 강도와 두께를 위해 선택.
- 화이트 LED 스트립 & RF 리모컨
- LM317 전압 컨버터
- A4988 스테퍼 모터 드라이버 x2
- 220µF 16V 커패시터 x2
- 12V 5A 파워 서플라이
- 3/4인치 볼 베어링
- 25lb 흰색 놀이용 모래
- 매끄러운 강돌 2봉지
- 네오디뮴 원형 베이스 자석
- 브레드보드, 퍼마보드 솔더 브레드보드
- 플라스틱 콘듀트 2홀 스트랩: 갠트리를 트랩 도어에 고정용.
3단계: 갠트리 조립
대략적인 도면을 그리고 갠트리를 제작했습니다. 가장 효율적인 방법은 아닐 수 있습니다. 다른 프로젝트에서 남은 부품을 활용하려다 보니 이렇게 됐습니다. 2020 알루미늄 익스트루전 여유분이 있어 갠트리 프레임으로 썼습니다. 코너 브래킷은 직접 설계해 3D 프린팅했고, 파일도 첨부했습니다.
X/Y축 레이저 컷 부품도 포함했습니다. 사진을 자세히 보며 캐리지와 각 축 조립 방식을 확인하세요. 제 캐리지 조립법이 최선은 아닐 수 있지만, 여러 프로젝트에서 검증된 방식이라 신뢰성 있게 작동합니다.
첨부 파일: FTY8AKAIVO3T4X1.dxf, FZUAWWRIVO3T4WZ.cdr, FVXPPAIIVO3T86T.stl
4단계: 회로 조립
먼저 브레드보드에 회로를 구성해 동작을 확인한 뒤, 솔더 보드로 옮겼습니다. 프리칭 다이어그램을 첨부하니 조립에 참고하세요.
5단계: 코드
코드는 매우 단순합니다. X/Y축 최소/최대 모두에 엔드스톱을 달았기 때문에, 코드에 갠트리 크기를 하드코딩하지 않았습니다. 덕분에 여러분의 설계가 제 것보다 작거나 커도 코드 수정 없이 그대로 쓸 수 있습니다. 코드는 .TXT와 .INO 형식으로 제공됩니다.
첨부 파일: F5577MZIW6PMIF4.cpp, FKOB89KIW6PMIF6.h, FO9WJRBIW6PMIFY.ino, F1K7N72IW6PMIGQ.zip, FVI0A1ZIW6PMIGS.txt, F9BIZS5IW6PMIGV.txt, FGBWKEAIW6PMIGW.txt
6단계: 움직임 테스트
코드 업로드 후 철저히 테스트했습니다. 대각선 이동 시 수평→수직→수평 순으로 움직이게 했는데(에치어스케치 스타일), 잘 작동합니다. 이제 아두이노 연결을 솔더링해 영구적으로 만들고 테이블에 설치할 차례입니다.
7단계: 실제 테이블 제작
머릿속 구상을 어떻게 구현할지 고민했습니다. 2단 박스 구조로 하부에는 메커니즘을 숨기고, 조이스틱은 하단 모서리 아래에 숨기려 했습니다. 그 외엔 구체적 계획이 없었죠.
목재 더미에서 다른 프로젝트용으로 회수한 4x4와 품질 좋은 셀렉트 파인을 발견했습니다. 아내에게 "쓸 만큼 다시 사주겠다" 약속하고 작업실로 가져와 제작을 시작했습니다.
8단계: 2단 박스 제작
1/4인치 합판을 재단해 모서리에 핫글루로 골판지를 붙여 접착제가 마르는 동안 고정했습니다. 이 방법이 꽤 잘 작동했습니다. 상/하부 구획을 만들고 수평을 맞춘 뒤, 피아노 힌지를 달아 갠트리를 담을 하부가 아래로 열리게 했습니다.
9단계: 테이블 다리 제작
아이들 놀이방에 있던 플레이하우스에서 회수한 파인 4x4를 재활용했습니다. 나사/못/스테이플을 제거하고 25인치 4등분 했습니다. 대패로 여러 번 통과시켜 페인트를 벗기고 표면을 정리했습니다. 직각자와 클램프로 임시 지그를 만들어 원형톱을 테이블쏘처럼 써서 L자형 다리 4개를 만들었습니다.
10단계: 측면 패널 설치
다리 부착 후 측면 패널을 설치했습니다. 틈새를 최소화하기 위해 신중하게 치수를 재고, 접착제로 고정한 뒤 2단 박스 하부에서 나사로 고정했습니다.
11단계: 샌딩, 샌딩, 그리고 더 샌딩
형태가 중요한 작업에서는 아낌없는 샌딩을 추천합니다. 80-120 그릿으로 시작해 200 그릿 이상으로 마무리합니다. 결점을 샌딩으로 제거하는 시간이 완성도에서 보상받습니다.
12단계: LED 조명 설치
상판 위치가 정해지면 1/8인치 MDF를 상판과 베이스 사이에 끼웁니다. 위치를 표시한 뒤 뒤집어 LED 스트립을 아래면에 케이블 타이와 핫글루로 고정했습니다. 발열체가 핫글루만으로 고정되는 건 위험하니, 전원선 통과용 구멍을 뚫어 2단 박스 하부로 뺐습니다. 처음에는 스테퍼 모터와 같은 12V로 LED를 구동하려 했으나, LED 때문에 모터가 웅웅거리는 문제가 생겨 LED용 별도 12V 파워 서플라이를 썼습니다.
13단계: 상판 설치
마이터 컷 경험이 많지 않지만, 시행착오 끝에 그럴듯한 상판을 만들었습니다. 앞서 언급한 Kreg 지그로 상판 네 면을 결합했는데 놀라울 정도로 잘 작동했습니다.
상판 부품 치수 재단 시 넉넉하게 자르고 나중에 다듬는 게 안전합니다. 부품들이 잘 맞는지 확인한 뒤, 유리가 플러시하게 들어갈 깊이로 라우터 작업을 합니다. 제 경우 유리가 1/4인치였습니다.
상판을 접착/나사 결합한 뒤, Kreg 지그로 다리 뒤쪽(안 보이는 곳)에서 베이스에 고정했습니다.
지역 자동차 유리 수리점에 1/4인치 판유리를 개구부보다 1/16인치 작게 주문하고 모서리 연마를 요청했습니다. 아크릴로 유리를 고정하지 않은 건, 나중에 돌을 재배치할 수 있게 유리를 탈착 가능하게 하기 위함입니다.
14단계: 컨디셔너 → 스테인 → 폴리 → 샌딩 → 폴리 반복
소나무는 흡수율이 높아 얼룩덜룩해질 수 있으니 프리스테인 컨디셔너로 균일하게 만들었습니다. 민왁스 내추럴 체리 폴리스테인을 바르고 건조시킨 뒤, 다음 날 320 그릿으로 가볍게 샌딩하고 한 번 더 칠했습니다. 다시 한다면 스테인과 폴리를 따로 칠할 겁니다. 폴리스테인은 드립 자국 등이 생겨 작업이 악몽이었습니다. 더 진하게 하고 싶어도 덧칠로 진해지지 않아 여러 번 샌딩하고 다시 칠했습니다. 폴리스테인은 다시 안 쓸 것 같습니다.
15단계: 전자부품 설치
하부에 트랩 도어를 만들어 갠트리 전체를 트랩 도어에 장착하고, 유지보수/업그레이드 시 아래로 내릴 수 있게 했습니다. 플라스틱 콘듀트 2홀 스트랩으로 2020 익스트루전을 트랩 도어에 고정했습니다.
아두이노와 브레드보드 위치를 여러 번 고민하다, 트랩 도어 중앙에 구멍을 뚫고 케이블을 통과시킨 뒤 전자부품을 테이블 하부에 장착했습니다.
조이스틱 마운트도 한참 고민하다, 테이블 상판 아랫입술에 그냥 접착했습니다. 케이블도 구석으로 밀어 넣고 핫글루로 고정했습니다. 가장 우아한 해결책은 아니지만, 기어다니지 않는 이상 안 보이니 만족합니다.
하부에는 작은 나사로 보드들을 고정하고 최대한 깔끔하게 정리했습니다. 전원 플러그도 뒤쪽 다리 뒤편에 고정했습니다.
16단계: 툴헤드 '마그넷헤드'
자석을 볼트에 어떻게 고정할지 고민했습니다. 볼트를 쓰면 Z축 조절이 쉬울 것 같았습니다. 3/4인치 나무 원통을 1-1.5인치 길이로 자르고 볼트 구멍을 뚫은 뒤, 위쪽에 자석을 나사로 고정했습니다. 이제 아래쪽 너트를 풀어 위아래로 조절할 수 있습니다.
17단계: 돌정원 꾸미기
전자부품 설치 후 돌정원을 만들었습니다. 모래 양을 몰라 25lb 박스를 샀는데, 돌이켜보면 5-10lb면 충분했을 겁니다. 대부분 모래가 남았습니다. 모래를 펴고 볼을 굴려 바닥이 보이지 않는 깊이를 찾았습니다.
가장자리에 매끄러운 강돌 2봉지를 골고루 펼쳤습니다. 돌을 접착할까 하다가, 나중에 재배치할 수 있게 그냥 두기로 했습니다.
18단계: 테이블 작동
드디어 테이블이 움직입니다. 작동시키자마자 한참을 멍하니 볼이 모래를 밀고 다니는 걸 지켜봤습니다. 쇠구슬이 모래를 헤치는 모습이 묘한 만족감을 줍니다. 상상했던 대로 움직이는 테이블을 보니 긴 여정의 보람이 느껴집니다.
19단계: 완성
길고 힘든 프로젝트였지만, 정말 즐거웠습니다.
코드
/*
* Simple demo, should work with any driver board
* Connect STEP, DIR as indicated
* Copyright (C)2015 Laurentiu Badea
* MIT 라이선스 하에 재배포 가능
* Ernest E Garner가 StepperDriver 라이브러리에서 수정
* Date: 20-Nov-2016
* Ernest James Garner가 Instructables.com용 젠 테이블로 제작한 기본 X/Y 갠트리 제어 코드
*/
#include <Arduino.h>
#include "BasicStepperDriver.h"
//#define DEBUG
#define X_MOTOR_STEPS 200
#define Y_MOTOR_STEPS 200
#define STEP_FORWARD 1
#define STEP_REVERSE -1
#define X_DIR_HOME STEP_FORWARD
#define Y_DIR_HOME STEP_FORWARD
#define X_MAX_PIN 6
#define X_HOME_PIN 7
#define X_DIR_PIN 8
#define X_STEP_PIN 9
#define X_ANALOG_PIN A0
#define Y_MAX_PIN 5
#define Y_HOME_PIN 10
#define Y_DIR_PIN 11
#define Y_STEP_PIN 12
#define Y_ANALOG_PIN A2
#define MICROSTEPS 1
BasicStepperDriver x_stepper(X_MOTOR_STEPS, X_DIR_PIN, X_STEP_PIN, X_HOME_PIN, X_MAX_PIN);
BasicStepperDriver y_stepper(Y_MOTOR_STEPS, Y_DIR_PIN, Y_STEP_PIN, Y_HOME_PIN, Y_MAX_PIN);
int x_position = 0, x_analog, y_position = 0, y_analog;
void setup() {
#ifdef DEBUG
Serial.begin(9600);
#endif
x_stepper.setRPM(100);
y_stepper.setRPM(100);
x_stepper.setMicrostep(MICROSTEPS);
y_stepper.setMicrostep(MICROSTEPS);
}
void loop() {
x_analog = analogRead(X_ANALOG_PIN);
if (x_analog < 472) x_stepper.move(-40);
else if (x_analog > 552) x_stepper.move(40);
#ifdef DEBUG
Serial.print("X: "); Serial.print(x_analog);
#endif
y_analog = analogRead(Y_ANALOG_PIN);
if (y_analog < 472) y_stepper.move(-40);
else if (y_analog > 552) y_stepper.move(40);
#ifdef DEBUG
Serial.print(" Y: "); Serial.println(y_analog);
#endif
}
커스텀 파트 및 인클로저
- FTY8AKAIVO3T4X1.dxf (코너 브래킷)
- FZUAWWRIVO3T4WZ.cdr (레이저 컷 부품)
- FVXPPAIIVO3T86T.stl (3D 프린트 부품)
회로도
회로도 이미지 참조