민선생의 전자공방 ・ 2026. 10. 5. 11:02
URL 복사 통계
본문 기타 기능
📌 예비 엔지니어를 위한 아두이노 3축 로봇 프로젝트 피지컬 코딩 실무능력 향상 프로젝트 [7/7] — 3일 · 21시간 집중 과정 전 과정 공개 1일차 (7시간) — 아두이노 기초 + 자작 아두이노 부트로더 2일차 (7시간) — PCB 설계 (Altium Designer) 3일차 (7시간) — PCB 제작 + SMD 납땜 + 3축 로봇 완성 이 글은 그 중 7번째 / 7편 🏁 최종편! |
피지컬 컴퓨팅 기본기 · 민선생의 전자공방 [피지컬 코딩 실무능력 향상 프로젝트 7/7] 🤖 자작 아두이노 3축 로봇 완성! 코딩부터 PCB · 납땜까지 — 드디어 로봇이 움직입니다 |
| 🏁 3일차 오후 — 드디어 로봇이 움직입니다! |
6편에서 PCB를 가공하고 SMD 납땜으로 완성된 전자회로 보드를 만들었습니다. 이제 마지막입니다. 이 보드에 프로그램을 올려 3축 로봇을 완성하고 직접 동작시켜 봅니다.
3일 전 아무것도 없던 상태에서 시작해 아두이노 코딩, 자작 아두이노 제작, PCB 설계, 기판 가공, SMD 납땜까지 마쳤습니다. 이제 마지막 한 단계 — 프로그램을 올리면 로봇이 살아 움직입니다!
준비물 완성된 자작 아두이노 3축 로봇 보드, USB FTDI UART 모듈 RC 서보모터 3개, 건전지 박스, 레이저포인터, 노트북 양면테이프, 로봇 구조물 재료 (나무·폼보드 등) |
| 💻 STEP 1 — 자작 아두이노에 프로그램 업로드하기 |
3편에서 배운 USB FTDI UART 모듈을 사용해 완성된 자작 아두이노 보드에 프로그램을 업로드합니다. 이제 아두이노 우노 보드가 필요 없습니다. 우리가 만든 보드가 바로 아두이노입니다!
로봇 조립 전 서보모터·레이저포인터 연결 후 프로그램 작성 화면
FTDI 모듈로 프로그램 업로드하는 설정 1. 툴 → 보드 → Arduino Duemilanove or Diecimila 선택 2. 툴 → 포트 선택 (포트 번호는 컴퓨터마다 다름) 3. 툴 → 프로그래머 → AVR ISP 선택 4. 프로그램 작성 후 업로드(→) 클릭! |
3축 로봇의 동작은 배열(Array)로 정의합니다. 배열에 각 축의 회전 각도와 레이저 ON/OFF 값을 넣어두고, 스위치를 누르면 순서대로 동작을 실행합니다. 이 방식은 나중에 4축·5축 로봇으로 확장할 때도 배열에 데이터만 추가하면 되는 유연한 구조입니다.
⚠ 코드 주석 수정 — 실제 핀 번호 servo0.attach(5) → D5핀 (주석: D0핀 → D5핀으로 수정!) servo1.attach(4) → D4핀 (주석: D1핀 → D4핀으로 수정!) servo2.attach(3) → D3핀 (SW2 스위치와 핀 충돌 주의!) SW2 스위치 → D3핀 (INPUT 모드) 레이저포인터 → D13핀 (OUTPUT 모드) |
다음은 3축 로봇의 완성 코드입니다. 원고 그대로 유지하되 주석의 핀 번호만 수정했습니다.
😊 소스코드입니다.
첨부파일
_3axial-robot.ino
파일 다운로드
#include <Servo.h> #define SW2 3 // D3 → SW2 스위치 (입력)
Servo servo0; // 서보 컨트롤 객체 선언 Servo servo1; Servo servo2;
// 로봇 구동 데이터: x축, y축, z축 회전각, 레이저 ON/OFF int Move[10][4]= { {90, 180, 65, 0}, // 동작 0 {180, 90, 180, 1}, // 동작 1 {90, 180, 120, 0}, // 동작 2 {135, 135, 0, 1}, // 동작 3 {90, 90, 180, 1}, // 동작 4 {45, 0, 0, 0}, // 동작 5 {0, 100, 180, 1}, // 동작 6 {180, 90, 90, 0}, // 동작 7 {135, 45, 45, 1}, // 동작 8 {90, 90, 90, 0}, // 동작 9 };
//------ Setup 함수 ------ void setup() { pinMode(SW2, INPUT); // D3 핀을 입력 핀으로 설정 servo0.attach(5); // servo0 신호선 → D5핀 servo1.attach(4); // servo1 신호선 → D4핀 servo2.attach(3); // servo2 신호선 → D3핀 pinMode(13, OUTPUT); // 레이저 구동신호 → D13핀
// 초기 자세 (모터 90도 위치) servo0.write(90); delay(500); servo1.write(90); delay(500); servo2.write(90); delay(2000);
// 초기화 동작 확인 (0도 → 170도 → 10도 왕복) for(int a=10; a<=170; a++) { servo0.write(a); delay(30); } for(int a=170; a>=10; a--) { servo0.write(a); delay(30); } }
//------ 로봇 동작 사용자 정의 함수 ------ void Robot_Action(int i) { servo0.write(Move[i][0]); // x축 회전 servo1.write(Move[i][1]); // y축 회전 servo2.write(Move[i][2]); // z축 회전 digitalWrite(13, Move[i][3]); // 레이저 ON/OFF }
//------ Loop 함수 ------ void loop() { Robot_Action(9); // 대기 자세 (90, 90, 90) if(digitalRead(SW2)){ // SW2 누르면 동작 시작 // 정방향: 동작 0→9 순서대로 for(int a=0; a<10; a++) { Robot_Action(a); delay(1000); // 각 동작마다 1초 대기 } delay(1000); // 역방향: 동작 10→0 반대로 for(int a=10; a>=0; a--) { Robot_Action(a); delay(500); } } } |
로봇 조립전 가 조립상태에서 프로그램 동작 확인
| 📖 스케치 해설 — 배열로 로봇 동작을 정의한다 |
이 코드의 핵심은 2차원 배열 Move[10][4]입니다. 10개의 동작을 배열로 정의하고, Robot_Action(i) 함수 하나로 i번째 동작을 실행합니다.
| 동작 | Move[][0] x축 | Move[][1] y축 | Move[][2] z축 | Move[][3] 레이저 | 설명 |
| 0 | 90° | 180° | 65° | OFF | 초기 준비 자세 |
| 1 | 180° | 90° | 180° | ON | 레이저 ON + 최대 회전 |
| 2 | 90° | 180° | 120° | OFF | 중간 자세 |
| 3~9 | ... | ... | ... | ... | 다양한 조합으로 자유롭게 수정 가능! |
배열 방식의 장점 — 확장이 쉽습니다! 4축 로봇으로 업그레이드? → Move[10][5]로 열 하나만 추가! 동작을 20개로 늘리려면? → Move[20][4]로 행만 늘리면 됩니다! 로봇의 동작 시나리오가 아무리 복잡해도 배열 데이터만 수정하면 됩니다. |
Robot_Action(i) 하나의 함수 호출로 3개의 서보모터와 레이저가 동시에 제어됩니다. 이것이 사용자 정의 함수의 힘입니다. loop() 함수 안의 코드가 얼마나 간결해지는지 보세요
for(int a=0; a<10; a++) { Robot_Action(a); // 단 한 줄로 3축 + 레이저 동시 제어! delay(1000); } → 10단계 동작을 4줄 코드로 완성! |
프로그램이 완성되면 로봇의 외형 구조물을 만들어 조립합니다. 오늘은 양면테이프를 활용해 간이 3축 로봇을 만들어 봅니다. 추후 나무나 3D 프린터로 제작한 body를 조립해 최종 완성할 수 있습니다.
3축 로봇 조립 방법 ① 1번 서보모터 (Base, 회전축): 가장 아래 → 좌우 회전 (D5핀) ② 2번 서보모터 (Arm, 팔): 1번 모터 위 → 앞뒤 회전 (D4핀) ③ 3번 서보모터 (Head, 머리): 2번 모터 위 → 상하 회전 (D3핀) ④ 레이저포인터: 3번 서보모터 앞 → D13핀으로 ON/OFF → 양면테이프로 각 서보모터를 고정하면 간이 3축 로봇 완성! |
레이저포인터 및 구조물 제작용 테이프
3축 로봇의 구조 (1축·2축·3축 서보모터 배치도)
자작 아두이노로 만든 완성된 3축 로봇!
그때 촬영한 동영상 파일을 찾지 못했습니다. 동작은 잘 됩니다. ^^
📁로봇바디 3D 프린터 출력 파일
로봇 바디를 공유합니다. 출력하여 사용하시면 됩니다. ^^
첨부파일
Robot_body.stl
파일 다운로드
Robot_body
첨부파일
Robot_end.stl
파일 다운로드
Robot_end
첨부파일
Robot_mid.stl
파일 다운로드
Robot_mid
로봇이 완성되면 프로그램을 업로드하고 동작을 확인합니다. SW2 스위치를 누르면 배열에 정의된 10단계 동작이 순서대로 실행됩니다.
배열 Move[10][4]의 숫자를 바꾸면 완전히 다른 로봇 동작이 만들어집니다. 각 숫자의 의미를 이해하고 자신만의 동작 시나리오를 만들어 보세요!
| Move[][0] | Move[][1] | Move[][2] | Move[][3] | 동작 설명 |
| 0~180° | 0~180° | 0~180° | 0 또는 1 | 각 축 회전각(°) + 레이저 OFF/ON |
| 90° | 90° | 90° | 0 | 정중앙 대기 자세 (기본값) |
| 0° | 0° | 0° | 0 | 모두 최소 각도 (좌측 최하단) |
| 180° | 180° | 180° | 1 | 모두 최대 각도 + 레이저 ON |
💡 동작 시나리오 확장 아이디어 delay(1000) 값을 줄이면 → 더 빠른 동작! Move 배열을 Move[20][4]로 늘리면 → 20단계 복잡한 동작! 레이저 대신 LED·버저를 D13에 연결하면 → 표정이 있는 로봇! 블루투스 모듈을 추가하면 → 스마트폰으로 원격 제어! |
| ✅ 시리즈 완결 정리 — 3일 21시간의 여정 |
3일간의 피지컬 코딩 완전정복 프로젝트를 마칩니다. 처음 아두이노를 만난 순간부터 직접 설계한 PCB 위에서 로봇이 움직이는 이 순간까지 — 모든 과정을 직접 경험했습니다.
| 편 | 제목 | 핵심 내용 |
| 1/7 | 아두이노 기초 | 아두이노란? · 4가지 장점 · 스케치 구조 · 라이브러리 함수 |
| 2/7 | 첫 번째 코딩 | LED 제어 · PWM 밝기 · RC 서보모터 · Sweep 동작 |
| 3/7 | 자작 아두이노 | ATmega328P · 부트로더 · ISP 굽기 · 서보모터 제어 |
| 4/7 | PCB란? | PCB 종류 · SMD 패키지 · SMT 생산공정 · 불량 유형 |
| 5/7 | PCB 설계 | Altium · 회로도 · Footprint · PCB 배선 · 거버파일 |
| 6/7 | 납땜 실습 | 기판 가공 · SMD 납땜 · 조립 검사 · Rework |
| 7/7 | 로봇 완성! 🏁 | 프로그램 업로드 · 배열로 동작 정의 · 구조물 조립 · 완성! |
한 번의 완벽한 경험이 필요합니다 코딩만 할 줄 아는 사람이 아니라, 하드웨어까지 만들 줄 아는 엔지니어로 아이디어 → 회로도 → PCB → 납땜 → 프로그래밍 → 완성 이 모든 과정을 한 번 경험한 사람은 앞으로 무엇이든 만들 수 있습니다. 이후는 조금 더 정교하고, 조금 더 복잡해지는 일만 남은 것이니까요! |
짧은 시간에 너무 많은 것을 넣었지만, 학생들이 이 모든 전 과정을 한 번쯤 완벽히 경험해 앞으로 실습하면서 이것이 왜 중요한 요소인지 느끼게 해주고 싶었습니다.
아마 블로그에 이미 올렸던 콘텐츠가 곳곳에 보일 것입니다. 기판의 모습은 제가 아두이노를 쉽게 배울 수 있도록 만든 에듀메이커보드의 모양입니다. ^^
이 시리즈가 여러분이 피지컬 코딩의 세계로 첫 발을 내딛는 데 작은 도움이 되기를 바랍니다. 엔지니어가 되기 위한 첫걸음을 함께 떼어드릴 수 있어서 즐거웠습니다!
감사합니다! — 민선생의 전자공방 궁금한 점은 댓글로 남겨주시면 성실하게 답변드리겠습니다 😊 blog.naver.com/hansikmin |
민선생의 전자공방 · blog.naver.com/hansikmin
아두이노3축로봇, 자작아두이노, ATmega328P, 서보모터제어, 배열프로그래밍, 피지컬코딩완전정복, PCB납땜, 로봇완성, 민선생전자공방