안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊
지난 시간에는 가변 저항을 돌려 컴퓨터 화면(시리얼 모니터)에 숫자가 0부터 1023까지 변하는 것을 확인해 봤죠? 오늘은 바로 그 숫자를 이용해서 LED의 밝기를 내 마음대로 조절하는 '무드등'을 만들어 볼 거예요. 이제 여러분도 손끝으로 빛을 조종하는 마법사가 될 준비, 되셨나요? 그럼 힘차게 시작해 봐요!
Slide 1: 밝기 조절되는 무드등 만들기
오늘의 프로젝트 목표는 바로 '밝기 조절되는 무드등 만들기' 입니다. 가변 저항이라는 센서를 통해 아날로그 신호를 읽고, 그 값을 이용해 LED의 밝기를 섬세하게 제어하는 방법을 배울 거예요. 이론으로만 알던 센서의 활용법을 직접 체험해 보는 아주 흥미로운 시간이 될 겁니다!
Slide 2: 무드등 회로 구성
가장 먼저 하드웨어를 연결해야겠죠? 바로 회로 구성 단계입니다.
⚙️ 준비물
- 아두이노 UNO
- 가변 저항
- LED (원하는 색상으로!)
- 저항 (220Ω)
- 작은 브레드보드
- 점퍼선
🔌 연결 방법
슬라이드의 회로도를 보면서 차근차근 따라 해 보세요. 글로도 친절하게 설명해 드릴게요.
- 가변 저항 연결하기
- 가변 저항은 다리가 3개예요. 양쪽 끝 다리는 각각 아두이노의 5V와 GND에 연결해 주세요. 어느 쪽에 5V를 연결하든 상관없지만, 보통 왼쪽을 GND, 오른쪽을 5V에 연결해요.
- 가장 중요한 가운데 다리! 이 다리가 바로 신호를 보내주는 역할을 해요. 아두이노의 아날로그 입력 핀인 A0에 연결해 주세요.
- LED 연결하기
- LED는 다리 길이가 다르죠? 긴 다리(+)가 플러스, 짧은 다리(-)**가 마이너스입니다.
- 긴 다리(+)는 저항(220Ω)을 거쳐서 아두이노의 디지털 9번 핀에 연결해 주세요.
- 짧은 다리(-)는 아두이노의 GND에 연결하면 끝!
💡 멘토's Tip!
왜 하필 9번 핀일까요? 아두이노 핀 번호 옆에 물결무늬(~) 표시가 있는 핀들이 있어요. 이 핀들이 바로 PWM(Pulse Width Modulation) 기능이 있는 핀인데요,analogWrite()함수를 통해 LED의 밝기를 조절하거나 모터의 속도를 제어하는 등 아날로그적인 출력을 흉내 낼 수 있답니다. 우리 무드등의 핵심 기능이죠!
Slide 3: 무드등 제어 코드 (1) - 기본 설정과 값 읽기
회로를 다 만들었다면 이제 아두이노에 생명을 불어넣을 코드를 살펴볼 차례예요. 코드는 크게 setup()과 loop() 두 부분으로 나뉘는 것, 다들 기억하시죠?
📌 핀 모드 설정: void setup()
아두이노가 켜질 때 딱 한 번 실행되는 setup() 함수에서는 각 핀의 역할을 정해줍니다.
| 01 | void setup() { |
| 02 | pinMode(A0, INPUT); // 가변 저항은 '입력' 장치 |
| 03 | pinMode(9, OUTPUT); // LED는 '출력' 장치 |
| 04 | Serial.begin(9600); // 컴퓨터와 통신 시작 (값 확인용) |
| 05 | } |
pinMode(A0, INPUT);: 가변 저항이 연결된 A0 핀에서 값을 읽어 들일 것이므로INPUT으로 설정해요.pinMode(9, OUTPUT);: LED가 연결된 9번 핀으로는 신호를 내보내서 불을 켤 것이므로OUTPUT으로 설정합니다.Serial.begin(9600);: 잠시 후 시리얼 모니터로 값이 어떻게 변하는지 눈으로 확인하기 위해 통신을 시작하는 명령어예요.
📌 값 읽기 및 변환: void loop()
loop() 함수는 아두이노가 켜져 있는 동안 무한 반복되는 부분이죠.
| 01 | void loop() { |
| 02 | int sensorValue = analogRead(A0); // 1. 가변 저항 값 읽기 (0~1023) |
| 03 | |
| 04 | // ... (이후 코드는 다음 슬라이드에서!) |
| 05 | } |
analogRead(A0): A0 핀으로 들어오는 아날로그 신호(전압)를 0부터 1023까지의 정수 값으로 읽어와요.int sensorValue = ...: 읽어온 값을sensorValue라는 이름의 변수에 저장합니다.
그런데 여기서 문제가 하나 있어요. 가변 저항 값은 0~1023 범위인데, 우리가 LED 밝기를 조절할 때 사용하는 analogWrite() 함수는 0~255 범위의 값만 사용하거든요. 이 두 개의 범위를 어떻게 맞춰줄 수 있을까요? 바로 이럴 때 마법 같은 함수 map()이 등장합니다!
Slide 4: 무드등 제어 코드 (2) - LED 제어와 모니터링
이제 loop() 함수의 나머지 부분을 완성하며 무드등을 동작시켜 봅시다!
| 01 | void loop() { |
| 02 | // 1. 가변 저항 값 읽기 (0~1023) |
| 03 | int sensorValue = analogRead(A0); |
| 04 | |
| 05 | // 2. 범위 변환 (0~1023 -> 0~255) |
| 06 | int outputValue = map(sensorValue, 0, 1023, 0, 255); |
| 07 | |
| 08 | // 3. 변환된 값으로 LED 밝기 조절 |
| 09 | analogWrite(9, outputValue); |
| 10 | |
| 11 | // 4. 변환 과정을 눈으로 확인하기 |
| 12 | Serial.print("sensor = "); |
| 13 | Serial.print(sensorValue); |
| 14 | Serial.print("\t output = "); |
| 15 | Serial.println(outputValue); |
| 16 | |
| 17 | // 안정적인 동작을 위해 아주 잠깐 대기 |
| 18 | delay(2); |
| 19 | } |
💡 LED 밝기 제어
int outputValue = map(sensorValue, 0, 1023, 0, 255);: 바로 이 코드가 핵심이에요!map()함수가sensorValue(0~1023)를 0~255 범위의 값으로 비례하게 변환해서outputValue라는 변수에 저장해 줘요.analogWrite(9, outputValue);: 변환된outputValue값을 이용해 9번 핀에 연결된 LED의 밝기를 조절합니다.outputValue가 0이면 LED는 꺼지고, 255면 가장 밝게 켜지겠죠?
🖥️ 모니터 출력
Serial.print(...): 이 부분은 필수는 아니지만, 값이 어떻게 변환되는지 눈으로 직접 보면 이해가 훨씬 쉬워요. 시리얼 모니터에 "sensor = (원래 값) output = (변환된 값)" 형태로 출력해 줍니다.\t: 이건 '탭(Tab)' 키를 누른 것처럼 일정한 간격을 띄워주는 특수문자예요. 덕분에 출력이 깔끔하게 정렬된답니다.delay(2);: 0.002초 동안 아주 잠깐 멈추는 코드예요. 아두이노가 너무 빠르게 동작하면 값이 불안정해질 수 있어서, 안정적인 동작을 위해 넣어주는 센스!
이제 이 코드를 업로드하고 가변 저항을 돌려보세요! LED가 서서히 밝아졌다가 어두워지는 것을 볼 수 있을 거예요. 동시에 시리얼 모니터를 켜면 숫자 값이 비례해서 변하는 것도 확인할 수 있답니다.
Slide 5: 핵심 문법! map() 함수 정복하기
이번 프로젝트의 주인공, map() 함수에 대해 조금 더 자세히 알아볼까요?
map() 함수는 어떤 값의 범위를 다른 범위로 똑똑하게 바꿔주는 마법사 같은 함수예요. 예를 들어 "0점부터 100점까지의 시험 점수를 0점부터 5점 만점의 등급으로 환산하고 싶어!" 같은 상황에서 아주 유용하죠. 일일이 계산할 필요 없이 이 함수 하나면 끝!
📘 함수 형식
map(변환할값, 현재최소, 현재최대, 목표최소, 목표최대);
🧩 매개변수 설명
- 변환할값: 범위를 바꾸고 싶은 숫자 (우리 코드에서는
sensorValue) - 현재최소 / 현재최대: 원래 값이 가지는 범위 (0, 1023)
- 목표최소 / 목표최대: 바꾸고 싶은 새로운 범위 (0, 255)
🚀 사용 예시
map(sensorValue, 0, 1023, 0, 255);
이 코드를 우리말로 풀어서 설명하면 이렇습니다.
>"sensorValue야, 너는 원래 0부터 1023 사이의 숫자였지? 이제부터는 0부터 255 사이의 숫자로 비율에 맞게 변신해!"
만약 가변 저항을 딱 중간까지 돌려서 sensorValue가 512(0~1023의 거의 절반)가 되었다면, map() 함수는 127(0~255의 거의 절반)이라는 값을 돌려줄 거예요. 정말 편리하죠?
어떠셨나요? 오늘은 가변 저항을 이용해 아날로그 값을 읽고, map() 함수로 값의 범위를 변환한 뒤, analogWrite() 함수로 LED의 밝기를 조절하는 '무드등'을 만들어 보았습니다.
단순히 LED를 켜고 끄는 것을 넘어, 이제 우리는 빛의 세기를 자유자재로 다룰 수 있게 되었어요! 오늘 배운 내용을 응용하면 모터의 속도를 조절하거나, 소리 센서 값에 따라 불빛이 변하는 멋진 작품도 만들 수 있답니다.
직접 만든 무드등을 켜놓고 잠시 감상하는 시간을 가져보는 건 어떨까요? 여러분의 상상력이 더해지면 훨씬 더 근사한 프로젝트가 탄생할 거예요. 다음 시간에도 더 재미있는 주제로 돌아오겠습니다! 수고 많으셨어요! 😄
이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초] **-** 페이지에 수록된 내용입니다.
댓글 없음:
댓글 쓰기