민선생의 전자공방 ・ 23시간 전
URL 복사 통계
본문 기타 기능
📌 예비 엔지니어를 위한 아두이노 3축 로봇 프로젝트 피지컬 코딩 실무능력 향상 프로젝트 [2/7] — 3일 · 21시간 집중 과정 전 과정 공개 1일차 (7시간) — 아두이노 기초 + 자작 아두이노 부트로더 2일차 (7시간) — PCB 설계 (Altium Designer) 3일차 (7시간) — PCB 제작 + SMD 납땜 + 3축 로봇 완성 이 글은 그 중 2번째 / 7편 입니다. |
피지컬 컴퓨팅 기본기 · 민선생의 전자공방 [피지컬 코딩 실무능력 향상 프로젝트 2/7] 💡 첫 번째 코딩 LED 제어와 RC 서보모터 움직이기 |
| 📖 피지컬 코딩 실무능력 향상 프로젝트 과제 2/7 — 첫 번째 코딩 실습 |
아두이노와 브레드보드, 그리고 부품 몇 가지만 있으면 바로 코딩 실습을 시작할 수 있습니다. 이번 시간에는 가장 기본적인 LED 제어부터 시작해서 RC 서보모터를 움직이는 것까지 직접 코딩하고 동작을 확인해 보겠습니다.
오픈소스 회로 설계 툴인 Fritzing을 활용하면 회로도와 브레드보드 배선을 시각적으로 확인할 수 있습니다. 배선 시 Ctrl을 누르고 선을 움직이면 자연스러운 곡선 배선이 됩니다.
준비물 컴퓨터 (아두이노 IDE 설치), 아두이노 우노 R3, 브레드보드, 배선(점퍼와이어) LED 2~3개, 저항(330Ω, 10kΩ), RC 서보모터(SG90 등), USB 케이블 Fritzing 다운로드: https://fritzing.org |
LED를 켜고 끄는 프로그래밍을 해보겠습니다. 아두이노 피지컬 코딩을 위해서는 LED 구동을 위한 회로 배선이 필요합니다. 브레드보드에 회로를 꾸며 보겠습니다.
LED를 켜고 끄는 프로그래밍을 해보려 합니다. 아두이노 피지컬 코딩을 위해서는 LED를 구동을 위한 회로배선이 필요합니다. 회로배선은 브레드보드에 해보도록 하겠습니다. 회로도와 브레드보드배선을 보여주는 툴로 오픈소스 툴인 frizing을 사용해 보겠습니다.
※ fritzing 배선시 Ctrl을 누르고 선을 움직이면 자연스런 곡선이 됩니다.
💡 왜 330Ω 저항이 필요한가? 아두이노 출력 전압 5V, LED 순방향 전압 약 2V, LED 적정 전류 약 10mA 필요 저항 = (5V - 2V) / 0.01A = 300Ω → 가장 가까운 표준 저항값 330Ω 사용! 저항이 없으면 LED가 타버립니다. 옴의 법칙(V=IR)이 실습에서 쓰입니다. |
LED를 3회 1초 간격으로 깜빡인 뒤, 10회 0.1초 간격으로 빠르게 깜빡이는 동작을 사용자 정의 함수로 구현합니다.
//============================================================ #define led 11
void LED_Blink(int m, int n); // 사용자 정의 함수 프로토타입 선언
void setup() { // 라이브러리 함수 pinMode(led, OUTPUT); // D11 핀을 출력으로 설정 }
void loop() { // 라이브러리 함수 LED_Blink(3, 1000); // LED_Blink 함수 호출, 3회, 1초 깜빡임 delay(5000); // 5초 기다려라 LED_Blink(10, 100); // LED_Blink 함수 호출, 10회, 0.1초 깜빡임 delay(5000); // 5초 기다려라 }
//------------------------------------------ // 사용자 정의 함수 정의 // j: 반복 횟수, k: 깜빡임 간격(ms) //------------------------------------------ void LED_Blink(int j, int k) { int i = 0; for (i = 0; i < j; i++) { digitalWrite(led, HIGH); // LED 켜기 delay(k); digitalWrite(led, LOW); // LED 끄기 delay(k); } } |
💡 사용자 정의 함수(User-Defined Function)란? 반복되는 코드를 하나의 이름으로 묶어 필요할 때 호출하는 방법입니다. LED_Blink(3, 1000) → 함수 이름(반복횟수, 깜빡임간격) 형태로 호출 코드가 간결해지고 나중에 수정할 때 한 곳만 바꾸면 됩니다. |
| ③ 응용 과제 — LED 밝기 제어 (PWM 활용) |
LED를 서서히 밝아지다 서서히 어두워지는 동작을 반복하게 프로그래밍해 봅시다. D11 핀은 PWM 출력이 가능한 핀입니다. analogWrite() 함수를 활용합니다.
// 응용과제: LED 밝기를 서서히 변화시키기 (PWM 제어) #define led 11
void setup() { pinMode(led, OUTPUT); }
void loop() { // 0에서 255까지 서서히 밝아지기 for (int brightness = 0; brightness <= 255; brightness++) { analogWrite(led, brightness); // PWM 출력 (0~255) delay(10); } // 255에서 0까지 서서히 어두워지기 for (int brightness = 255; brightness >= 0; brightness--) { analogWrite(led, brightness); delay(10); } } |
💡 analogWrite(핀, 0~255) — PWM 출력 0 = 완전히 꺼짐(0V), 255 = 완전히 켜짐(5V), 127 = 중간 밝기(약 2.5V 평균) PWM 핀: D3, D5, D6, D9, D10, D11 (~ 표시된 핀) |
RC 서보모터는 전자기기의 출력으로 사용되는 회전운동 장치입니다. 원하는 위치만큼 회전하고 그 위치에서 멈출 수 있습니다. 서보모터에 프로그램으로 위치 값을 주면 해당 위치로 이동해서 그 위치가 변하지 않도록 계속 제어합니다.
자동화 생산 시스템, 로봇, 장난감, 가전제품 등 광범위하게 쓰이며, 보통의 RC 서보모터는 약 0~180도 범위의 회전각을 가집니다. 180도 이상 무리하게 돌리려 하면 서보모터가 파손되므로 주의해야 합니다.
| 선 색깔 | 역할 | 연결 |
| 빨간색 | VCC (+) | 5V 전원에 연결 |
| 검은색 | GND (-) | GND에 연결 |
| 노란색 (주황) | 제어선 | 아두이노 디지털 핀에 연결 (D9) |
서보모터는 약 20ms마다 제어 신호(펄스)를 받아 회전각을 결정합니다. 펄스의 폭(HIGH 유지 시간)에 따라 회전 각도가 결정됩니다.
| 펄스폭 | 회전각 | 설명 |
| 1ms (1,000μs) | 0도 | 완전 왼쪽 |
| 1.5ms (1,500μs) | 90도 | 중간 (정면) |
| 2ms (2,000μs) | 180도 | 완전 오른쪽 |
서보모터를 D9번 핀에 연결하고 배선합니다. 서보모터의 전류 소모가 크므로 브레드보드의 전원 레일을 활용해 배선하는 것이 좋습니다.
서보모터를 D9에 연결하고 0도 → 90도 → 180도로 순서대로 움직이는 프로그램입니다. Servo.h 라이브러리를 사용하면 펄스폭 계산 없이 각도만 지정하면 됩니다.
//============================================================ #include <Servo.h> // 서보모터 라이브러리 포함
Servo myservo; // 서보모터 컨트롤 객체 생성
void setup() { myservo.attach(9); // D9번 핀에 서보모터 연결 }
void loop() { myservo.write(0); // 서보모터 0도로 이동 delay(1000); // 모터 이동 시간 대기 myservo.write(90); // 서보모터 90도로 이동 delay(500); myservo.write(180); // 서보모터 180도로 이동 delay(500); } |
💡 Servo.h 라이브러리 주요 함수 myservo.attach(핀번호) — 서보모터를 연결할 핀 지정 myservo.write(각도) — 0~180 사이의 각도로 이동 #include <Servo.h> 를 반드시 코드 첫 줄에 추가해야 합니다. |
| 응용 과제 — Sweep 동작 (0도 ↔ 180도 왕복) |
서보모터를 D6번 단자에 연결하여 0도에서 180도까지, 다시 180도에서 0도까지 1도씩 부드럽게 왕복하는 Sweep 동작을 프로그래밍해 봅시다.
#include <Servo.h> Servo myservo; int pos = 0; // 회전 각도를 저장하는 변수
void setup() { myservo.attach(6); // D6번 핀으로 변경 }
void loop() { // 0도 → 180도 : 1도씩 증가 for (pos = 0; pos <= 180; pos += 1) { myservo.write(pos); // 서보모터에 회전 각도 전달 delay(15); // 물리적 이동 시간 대기 } // 180도 → 0도 : 1도씩 감소 for (pos = 180; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); } } |
🔑 핵심 질문 — 컴퓨터 연결 없이도 동작하게 하려면? USB를 뽑아도 아두이노가 계속 동작하려면 → 별도 전원(배터리 또는 DC 어댑터)을 연결하면 됩니다! 아두이노에 프로그램을 업로드한 뒤 USB를 빼고 DC 잭(7~12V)이나 VIN 핀에 전원을 공급하면 컴퓨터 없이도 독립적으로 동작합니다. 이것이 임베디드 시스템의 핵심입니다! |
오늘 배운 핵심 내용 ① LED 제어: digitalWrite(HIGH/LOW) + 330Ω 저항 + 사용자 정의 함수 ② PWM 밝기 제어: analogWrite(핀, 0~255) — PWM 핀(D3·D5·D6·D9·D10·D11) ③ RC 서보모터: 3선(VCC·GND·제어선), 펄스폭으로 각도 제어 ④ Servo.h 라이브러리: attach(핀) + write(각도) — 두 줄로 서보모터 제어! ⑤ 임베디드 동작: 프로그램 업로드 후 별도 전원으로 독립 구동 가능 |
📌 다음 편 예고 — 3/7 2,000원짜리 칩으로 나만의 아두이노 만들기 ▸ ATmega328P 마이크로컨트롤러에 부트로더를 직접 굽는 실습 ▸ 아두이노 우노를 ISP 장치로 사용하는 방법 ▸ 브레드보드에서 자작 아두이노 동작 확인까지! |
민선생의 전자공방 · blog.naver.com/hansikmin
아두이노LED제어, RC서보모터, PWM제어, 피지컬코딩, 아두이노코딩, 사용자정의함수, Sweep동작, 민선생전자공방
태그#아두이노LED제어#RC서보모터#PWM제어#피지컬코딩#아두이노코딩#사용자정의함수#Sweep동작#민선생전자공방#define#include 태그수정