RGB LED 사이드퀘스트 💡
Source: Dev.to
다시 돌아온 나의 여정 From Dust to Droid Dreams
드로이드를 만드는 주요 경로는 장기적인 미션이지만, 때때로 “신경계”의 기본을 마스터하기 위해 사이드 퀘스트를 해야 할 때가 있다.
오늘의 미션: 멀티‑LED 색상 블렌딩과 시리얼 디버깅의 숨겨진 함정.
RGB LED가 있다는 것을 발견하고, 기존의 빨강, 파랑, 초록 LED를 재배선하면서 노란 LED는 그대로 두기로 했다. 목표는 펄스‑폭 변조(PWM)를 사용해 빨강, 초록, 파랑 사이에 부드러운 전환을 만들고, 빨강과 초록 채널이 겹칠 때 빛나는 전용 노란 LED를 구현하는 것이었다.
“까다로운” 하드웨어
첫 번째 사이드‑퀘스트 교훈: 물리 세계는 지저분합니다.
RGB LED 설정은 매우 까다롭습니다—배선이 쉽게 교차하고, 신호를 깨끗하게 유지하고 부품을 안전하게 보호하려면 저항을 매우 신중하게 적용해야 합니다.
“지연” 몬스터와 마주하기
LED를 동기화한 뒤, 실시간으로 값이 변하는 모습을 모니터링하고 싶었습니다. 하지만 예상과 다르게 동작했습니다. 갑자기 동기화가 사라지고—노란색 LED가 끊기기 시작했으며 제때 켜지지 않았습니다.
문제 코드
void updateLEDs() {
analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
analogWrite(BLUE, blueValue);
// Serial output inside the main update loop
Serial.print("R: "); Serial.print(redValue);
Serial.print(" | G: "); Serial.print(greenValue);
Serial.print(" | B: "); Serial.print(blueValue);
Serial.print(" | Y-LED: "); Serial.print(yellowBright);
// ... this was slowing everything down!
}
기본 9600 baud 설정에서는 Serial 통신이 비교적 느립니다. 코드가 이 print 문들에 도달할 때마다 데이터를 전송하기 위해 루프가 일시 정지됩니다. 이로 인해 PWM 신호에 “끊김”이 발생하고 LED가 깜박이며 타이밍이 “어색”하게 느껴집니다.
최적화 수정
지연을 해결하고 부드러운 페이드를 되찾기 위해 두 가지 핵심 수정을 적용했습니다:
- 보드레이트 증가 – 9600에서 115200으로 속도를 높였습니다(코드와 IDE 설정 모두에서 업데이트).
- 시간 기반 출력(논블로킹) – 매 루프마다 출력하는 대신 타이머(
millis())를 사용해 100 ms마다 Serial 출력을 업데이트했습니다. 이렇게 하면 프로세서가 LED 펄스에 집중할 수 있습니다.
void updateLEDs() {
analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
analogWrite(BLUE, blueValue);
int yellowBright = (redValue 100) {
Serial.print("R:"); Serial.print(redValue);
Serial.print(" G:"); Serial.print(greenValue);
Serial.print(" B:"); Serial.print(blueValue);
// Added a small offset (+5) so the yellow line is visible on the plotter
Serial.print(" Y-LED:"); Serial.println(yellowBright + 5);
lastPrintTime = millis();
}
}
새로운 도구 사용 해제: 시리얼 플롯터
저는 Arduino IDE의 시리얼 플롯터(Tools > Serial Plotter)를 가지고도 약간의 시간을 보냈습니다. 색상 변수들이 파동처럼 진동하는 모습을 시각화하는 데 정말 훌륭한 도구입니다.
노란 선이 제대로 표시되도록 몇 차례 반복해야 했습니다. 값이 빨강이나 초록 선과 동일했기 때문에 그 뒤에 가려졌었습니다. print 문에 작은 오프셋(+5)을 추가하니 마침내 노란 선이 보이게 되었습니다!
작은 미스터리: 플롯터에서 선 색상이 제가 출력하는 RGB 색상과 실제로 일치하도록 만드는 방법을 아직 찾지 못했습니다. IDE가 변수의 순서에 따라 자동으로 색상을 할당하는 것 같습니다. 혹시 이를 해결할 수 있는 해킹 방법이 있다면 댓글로 알려 주세요! 색상이 일치하지 않더라도 실시간으로 파동이 겹치는 모습을 보는 것만으로도 로직 디버깅에 큰 도움이 됩니다.
Droid 빌드를 위한 주요 요점
- Communication Overhead: 마이크로컨트롤러가 얼마나 많은 “대화”를 하고 있는지 고려하세요—그 대화가 “생각” 속도를 늦추고 있을 수 있습니다.
- Visualization over Text: 데이터는 스크롤되는 숫자 벽보다 파형 형태로 보는 것이 훨씬 이해하기 쉽습니다.
- Timing: (여기에 메모를 계속 작성하세요…)
모든 것
delay()에만 기본값을 두지 마세요. millis()는 멀티태스킹을 가능하게 하고, delay()는 사실상 Arduino Uno를 대기 상태로 만듭니다.
즐거운 제작 되시고, 여러분의 LED가 언제나 부드럽게 블렌딩되길 바랍니다!


