안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊
지난 시간에는 서보 모터를 이용해 원하는 각도로 팔을 움직여보는 실습을 했었죠. 오늘은 여기서 한 단계 더 나아가, 아두이노에 '눈'을 달아주려고 해요. 바로 PIR 센서라는 부품인데요. 이 센서로 주변의 움직임을 감지해서, 사람이 다가오면 저절로 문이 열리는 '스마트 자동문'을 만들어 볼 거예요. 아두이노가 스스로 보고, 판단하고, 행동하게 만드는 아주 재미있는 프로젝트랍니다!
자, 그럼 저와 함께 차근차근 시작해볼까요?
Slide 1 & 2: 프로젝트 개요 - 스마트 자동문 만들기
이번 프로젝트의 목표는 아주 명확해요.
- 입력: PIR 센서가 사람의 움직임을 감지해요. (눈의 역할)
- 판단: 아두이노가 센서 값을 보고 문을 열지 말지 결정해요. (뇌의 역할)
- 출력: 서보 모터가 아두이노의 명령에 따라 문을 열고 닫아요. (팔의 역할)
이 세 가지 과정을 통해 우리는 마트나 건물 입구에서 흔히 볼 수 있는 자동문의 기본 원리를 직접 구현하게 될 거예요.
✅ 준비물 체크!
- 아두이노 우노
- PIR 인체 감지 센서
- 서보 모터 (SG90)
- 작은 브레드보드와 점퍼선
준비물이 모두 갖춰졌다면, 이제 회로를 구성하러 가볼게요!
Slide 3: 스마트 자동문 회로 구성
이번에는 센서와 모터, 두 개의 부품을 동시에 연결해야 해요. 여러 부품에 전원(5V)과 접지(GND)를 연결해야 할 때는 브레드보드의 빨간색(+) 라인과 파란색(-) 라인을 활용하면 아주 편리하답니다.
아래 순서대로 차근차근 연결해보세요.
1. 서보 모터 연결 (디지털 8번 핀)
서보 모터는 3개의 선을 가지고 있어요.
- 갈색 선 ➡️ 아두이노 GND (또는 브레드보드 '-' 라인)
- 빨간 선 ➡️ 아두이노 5V (또는 브레드보드 '+' 라인)
- 주황색 선(신호선) ➡️ 아두이노 디지털 8번 핀
2. PIR 센서 연결 (디지털 2번 핀)
PIR 센서도 3개의 핀을 가지고 있어요. 핀 옆에 VCC, GND, OUT 이라고 친절하게 적혀 있을 거예요.
- VCC ➡️ 아두이노 5V (또는 브레드보드 '+' 라인)
- GND ➡️ 아두이노 GND (또는 브레드보드 '-' 라인)
- OUT(신호선) ➡️ 아두이노 디지털 2번 핀
회로 연결이 끝났다면, 이제 아두이노에 똑똑한 지능을 심어줄 코드를 작성할 차례예요!
Slide 4: 스마트 자동문 소스 코드 (1) - 준비 단계(setup)
모든 아두이노 코드는 setup()과 loop() 함수로 이루어져 있죠. setup() 함수는 아두이노에 전원이 켜졌을 때 딱 한 번만 실행되는 '준비' 단계예요. 우리 자동문이 동작하기 위해 어떤 준비가 필요한지 코드를 살펴볼게요.
| 01 | #include <Servo.h> // 서보 모터 라이브러리(도구함) 불러오기 |
| 02 | |
| 03 | Servo myServo; // 'myServo'라는 이름으로 서보 모터 객체 생성 |
| 04 | |
| 05 | void setup() { |
| 06 | myServo.attach(8); // myServo는 8번 핀에 연결되어 있다고 선언 |
| 07 | pinMode(2, INPUT); // 2번 핀(PIR 센서)은 신호를 입력받는 용도로 설정 |
| 08 | Serial.begin(9600); // 센서 값 확인을 위한 시리얼 통신 시작 |
| 09 | } |
#include <Servo.h>: 서보 모터를 쉽고 편리하게 제어할 수 있도록 도와주는 '도구함(라이브러리)'을 가져오는 명령어예요.Servo myServo;: 앞으로 코드에서 서보 모터를 'myServo'라는 이름으로 부르겠다고 별명을 지어주는 거예요.myServo.attach(8);: 아두이노에게 'myServo'라는 이름의 모터는 디지털 8번 핀에 연결되어 있으니 기억하라고 알려주는 부분이에요.pinMode(2, INPUT);: PIR 센서가 연결된 디지털 2번 핀은 외부의 신호를 받아들이는 '입력(INPUT)' 모드로 사용하겠다고 설정해요.Serial.begin(9600);: PIR 센서가 움직임을 제대로 감지하는지 우리 눈으로 확인하기 위해, 컴퓨터와 통신을 시작하는 명령어예요.
준비가 끝났으니, 이제 계속해서 반복적으로 실행될 핵심 동작을 코딩해볼까요?
Slide 5: 스마트 자동문 소스 코드 (2) - 반복 동작(loop)
loop() 함수는 setup()이 끝난 후 무한히 반복 실행되는 부분이에요. 바로 여기에 '스스로 판단하고 행동하는' 자동문의 핵심 로직이 들어갑니다.
| 01 | void loop() { |
| 02 | // 1. 센서 값 읽기 |
| 03 | int sensorValue = digitalRead(2); // 2번 핀에서 센서 값을 읽어옴 (0 또는 1) |
| 04 | Serial.println(sensorValue); // 읽어온 값을 시리얼 모니터에 출력 |
| 05 | |
| 06 | // 2. 조건 판단 및 동작 |
| 07 | if (sensorValue == HIGH) { // 만약 움직임이 감지되었다면 (값이 1이라면) |
| 08 | myServo.write(90); // 문 열기 (서보 모터를 90도로 이동) |
| 09 | } |
| 10 | else { // 그렇지 않다면 (움직임이 없다면, 값이 0이라면) |
| 11 | myServo.write(0); // 문 닫기 (서보 모터를 0도로 이동) |
| 12 | } |
| 13 | |
| 14 | delay(1000); // 1초 동안 잠시 대기 |
| 15 | } |
코드가 어떻게 동작하는지 자세히 뜯어볼게요.
digitalRead(2): 2번 핀에 연결된 PIR 센서의 상태를 읽어와요. 움직임이 감지되면1(HIGH), 감지되지 않으면0(LOW) 값을 반환합니다. 이 값을sensorValue라는 변수에 저장해요.Serial.println(sensorValue): 방금 읽은 센서 값을 컴퓨터 화면(시리얼 모니터)에 보여줘서 우리가 현재 상태를 알 수 있게 해줘요.if (sensorValue == HIGH): "만약 움직임이 감지되었다면?" 이라고 아두이노에게 묻는 조건문이에요. 여기서 아두이노의 '판단'이 시작되죠.myServo.write(90);: 위 조건이 참(True)일 때, 즉 움직임이 감지되었을 때 서보 모터를 90도 위치로 움직여 문을 열어줍니다.else: "그렇지 않다면?" 이라는 뜻이에요. 즉, 움직임이 감지되지 않았을 때를 의미해요.myServo.write(0);:else에 해당할 경우, 서보 모터를 0도 위치로 움직여 문을 닫습니다.delay(1000): 각 동작이 끝난 후 1초(1000밀리초) 동안 잠시 기다려요. 이 코드가 없으면 문이 너무 정신없이 열리고 닫힐 수 있겠죠?
Slide 6: 스마트 자동문 실행 결과
자, 이제 코드를 모두 작성하고 아두이노에 업로드해 보세요! 그리고 아두이노 IDE의 오른쪽 위 돋보기 모양 아이콘을 눌러 '시리얼 모니터' 창을 열어주세요. 이제 마법 같은 일이 벌어질 거예요.
1. 평소 상태 (움직임 없음)
- 시리얼 모니터에는 계속해서
0이 출력될 거예요. - 서보 모터는 0도 위치를 유지하며 얌전히 문을 닫고 있어요.
2. 움직임 감지 시
- PIR 센서 앞에서 손을 흔들거나 몸을 움직여 보세요.
- 시리얼 모니터의 숫자가
1로 바뀌는 순간! - 서보 모터가 "징~" 하는 소리와 함께 90도로 휙 돌아가며 문을 활짝 열어줄 거예요.
3. 움직임 멈춤 시
- 센서 앞에서 움직임을 멈추고 가만히 있어 보세요.
- 잠시 후 시리얼 모니터의 숫자가 다시
0으로 바뀌고, 서보 모터도 스르륵 0도로 돌아와 문을 닫습니다.
어때요? 우리가 직접 만든 스마트 자동문이 멋지게 작동하나요? 축하합니다! 여러분은 방금 '입력 → 판단 → 출력'이라는 자동 제어 시스템의 핵심 원리를 완벽하게 구현해냈어요!
오늘은 PIR 센서와 서보 모터를 결합해 주변 상황에 반응하는 스마트 자동문을 만들어 보았어요. 단순히 명령한 대로만 움직이는 것을 넘어, 센서로 외부 정보를 받아들이고 if-else 조건문으로 스스로 판단하여 행동하게 만드는 것, 이것이 바로 피지컬 컴퓨팅의 진정한 매력이랍니다!
오늘 배운 내용은 자동문뿐만 아니라 침입 경보기, 스마트 조명 등 정말 다양한 곳에 응용될 수 있어요. 여러분만의 멋진 아이디어를 더해 새로운 프로젝트에 도전해보는 건 어떨까요?
궁금한 점이 있다면 언제든지 댓글로 질문해주세요! 그럼 다음 시간에 더 재미있는 프로젝트로 다시 만나요! 👋
이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초] **-** 페이지에 수록된 내용입니다.