[아두이노] CdS 조도 센서의 ‘비선형성’과 감도 설계, 그리고 선형화까지

조도 센서를 쓰다 보면 이런 느낌을 받습니다. “어느 구간은 잘 반응하는데, 어느 구간은 거의 안 변한다…” 이건 센서 문제가 아니라, 👉 전압 분배 회로 자체가 ‘비선형’이기 때문 입니다. 1. 기본 원리 (수식 깨짐 방지 버전) CdS 센서는 빛에 따라 저항이 변합니다. 밝을 때 → 저항 ↓ 어두울 때 → 저항 ↑ 아두이노는 전압만 읽기 때문에 전압 분배 회로를 사용합니다. 전압 분배 공식 Vout = Vin × (Rsensor / (Rfixed + Rsensor)) 2. 핵심: 이 식은 비선형이다 이 식은 직선이 아니라 “곡선”입니다. 즉, 입력: 센서 저항 출력: 전압 👉 둘 사이 관계는 비선형 그래서 나타나는 현상: 초반 → 민감 (전압 많이 변함) 후반 → 둔감 (전압 거의 안 변함) 3. 감도의 정체 감도는 단순 전압 차이가 아니라: 👉 저항 변화 대비 전압 변화량 즉, 감도 ≈ ΔV / ΔR 4. 가장 중요한 포인트 Rsensor ≈ Rfixed 일 때 감도 최대 이 구간이 가장 가파른 영역입니다. 5. 왜 저항 선택이 중요할까 고정 저항은 단순 부품이 아닙니다. 👉 “어디 구간을 민감하게 볼지 결정하는 장치” Case 1: Rfixed = 1kΩ 밝은 영역 → 감도 좋음 어두운 영역 → 거의 변화 없음 이유: Rsensor >> Rfixed → Vout ≈ Vin 👉 전압이 5V 근처에 붙어버림 Case 2: Rfixed = 10kΩ 전체 영역에서 고르게 변화 👉 가장 일반적인 선택 6. 감도 분포 개념 감도는 일정하지 않습니다. 👉 특정 구간에서만 높고, 나머지는 낮습니다. 그래서: 고정 저항을 바꾸는 것 = 감도 위치를 이동시키는 것 7. 그럼 선형으로 만들 수 있을까? 가능합니다. 3가지 방법이 있습니다. 8. 방법 1: 소프트웨어 선형화 (추천) 센서 값 → 보정해서 사용 예시: int raw = analogRead(A0); // 간단한 로그 보정 예시 float corrected = log(raw + 1); 또...

[아두이노] V=IR은 어떻게 만들어졌을까? 그리고 전압 분배는 왜 성립할까?

전자회로를 배우다 보면 너무 당연하게 등장하는 공식이 있습니다. V = IR 그리고 바로 이어서 배우는 것이 전압 분배 공식입니다. Vout = Vin × (R2 / (R1 + R2)) 많은 사람들이 이렇게 생각합니다. “이거 그냥 편의상 만든 공식 아닌가?” 하지만 실제로는 전혀 다릅니다. 이 두 공식은 모두 👉 실험 + 수학 + 물리학이 결합된 “필연적인 결과”입니다. 1. 시작은 관찰이었다 (옴의 법칙) 초기 전기 실험에서 발견된 사실: 전압을 2배 → 전류도 2배 전압을 3배 → 전류도 3배 즉, 전류 ∝ 전압 이 관계를 정리한 사람이 게오르크 옴(Georg Ohm)입니다. 그래서 나온 식이 바로: V = IR 여기서 중요한 포인트는: R은 처음부터 “저항”이라는 개념이 아니라 👉 단순한 비례상수였다는 점입니다. 즉, “이 물질은 전류가 덜 흐르네?” → 그걸 숫자로 표현한 것이 R 2. 왜 이런 관계가 생길까? (물리적 의미) 나중에 물리학이 발전하면서 이유가 밝혀집니다. 전류의 본질은 전자의 이동입니다. 그런데 전자는 자유롭게 날아가지 않습니다. 전기장이 전자를 밀어냄 전자는 가속됨 하지만 원자와 계속 충돌 결과: 계속 빨라지는 것이 아니라 일정한 평균 속도로 움직임 (drift velocity) 이때: 전압 ↑ → 전기장 ↑ 전자 속도 ↑ → 전류 ↑ 그래서 자연스럽게: 전류 ∝ 전압 → V = IR 3. “다 무시하고 단순화”의 의미 실제 물리 세계는 매우 복잡합니다. 양자역학 격자 구조 열 진동 충돌 확률 하지만 이런 걸 다 고려하면 회로 설계는 불가능합니다. 그래서 엔지니어링에서는 이렇게 합니다: 👉 결과만 남기고 나머지는 버린다 그 결과가 바로: V = IR 즉, 옴의 법칙은 👉 “진리”가 아니라 👉 “잘 동작하는 단순 모델”입니다 4. 전압 분배 공식은 어떻게 나왔을까? 이제 핵심 질문...

[아두이노] 왜 어떤 센서는 저항만 있고, 어떤 센서는 전압을 바로 줄까?

아두이노로 센서를 다루다 보면 이런 의문이 한 번쯤 생깁니다. 서미스터나 조도센서는 왜 저항만 덩그러니 있고 LM35DZ 같은 센서는 왜 전압을 바로 출력할까? 겉보기에는 둘 다 “온도 센서”인데, 내부는 완전히 다른 세계입니다. 1. 저항형 센서: “날것의 재료” 대표적인 예: 서미스터 (Thermistor) 조도 센서 (LDR) 이 센서들의 본질은 아주 단순합니다. 👉 물리량 → 저항 변화 예를 들어: 온도가 올라가면 저항이 줄어든다 (NTC) 빛이 밝아지면 저항이 줄어든다 하지만 여기서 중요한 포인트: ❗ 이 센서들은 전압을 만들어내지 못합니다 📌 그래서 반드시 필요한 것: 전압 분배 회로 아두이노는 “전압”만 읽을 수 있기 때문에 저항을 전압으로 바꿔줘야 합니다. 이때 등장하는 것이 바로 전압 분배 공식 입니다. V o u t = V i n ⋅ R 2 R 1 + R 2 V_{out} = V_{in} \cdot \frac{R_2}{R_1 + R_2} ​ ​ R 1 R_1 : 고정 저항 R 2 R_2 : 센서 (가변 저항) 👉 센서 저항이 변하면 → 출력 전압이 변함 → 아두이노가 읽음 🔧 PLC 비유 이건 딱 이런 느낌입니다: 무전압 접점 단순 가변 저항기 👉 스스로 신호 못 만듦 👉 외부에서 “회로 구성”을 해줘야 의미 있는 데이터가 됨 2. LM35DZ: “이미 요리된 완제품” LM35DZ temperature sensor 같은 센서는 완전히 다릅니다. 겉은 단순해 보여도 내부는… 👉 정밀 아날로그 IC 📌 내부에서 무슨 일이 벌어질까? LM35DZ 안에는: 트랜지스터 배열 기준 전압 회로 증폭기 (Op-Amp) 같은 것들이 들어 있습니다. 그 결과: 👉 온도 → 전압으로 바로 변환해서 출력 📌 핵심 특징 가장 중요한 공식은 이것 하나입니다: V o u t = 10   mV × T ( ∘ C...

[아두이노] 저항형 센서를 읽는 법: 전압 분배(Voltage Divider)의 본질

1. 왜 “저항”을 “전압”으로 바꿔야 할까? 아두이노의 analogRead() 는 전압만 측정 할 수 있다. 하지만 우리가 사용하는 많은 센서는 이런 식이다: LDR (조도 센서) → 빛에 따라 저항 변화 서미스터 (온도 센서) → 온도에 따라 저항 변화 FSR (압력 센서) → 압력에 따라 저항 변화 👉 문제는 이거다: “저항은 직접 측정 못하는데… 그럼 어떻게 읽지?” 그래서 등장하는 게 바로 👉 전압 분배 회로 (Voltage Divider) 2. 전압 분배 회로의 구조 가장 기본 구조는 이거다: Vcc (5V) | [R1] ← 고정 저항 | +----→ 아날로그 핀 (A0) | [R2] ← 센서 (변하는 저항) | GND 여기서 핵심은: 👉 중간 지점의 전압을 측정한다는 것 3. 전압 분배 공식 (핵심 수식) V o u t = V i n ⋅ R 2 R 1 + R 2 V_{out} = V_{in} \cdot \frac{R_2}{R_1 + R_2} ​ ​ V o u t V_{out} : 아두이노가 읽는 전압 R 1 R_1 : 고정 저항 R 2 R_2 : 센서 저항 4. 직관적으로 이해해보자 이 공식이 의미하는 건 간단하다: 👉 전체 전압이 저항 비율대로 나눠진다 센서 저항 ↑ → V o u t ↑ V_{out} ↑ 센서 저항 ↓ → V o u t ↓ V_{out} ↓ 즉, “저항 변화 → 전압 변화 → 아두이노가 읽음” 이게 핵심 흐름이다. 5. 아두이노에서 실제로 읽히는 값 아두이노는 전압을 이렇게 변환한다: 0V → 0 5V → 1023 즉: V o u t = a n a l o g R e a d ( ) 1023 × 5 V V_{out} = \frac{analogRead()}{1023} \times 5V 6. 센서 저항을 역으로 계산하기 전압을 읽었으면, 다시 저항으로 바꿀 수도 있다. 공식 변형하면: R 2 = R 1...

[아두이노] 아날로그 온도 센서 완벽 가이드 (TMP36 vs LM35DZ)

이미지
아두이노로 온도를 측정할 때 가장 많이 사용하는 센서인 LM35DZ 와 TMP36 . 겉모양은 거의 동일한데, 왜 코드 속 계산식은 다를까요? 핵심은 바로 전압 스케일링 + 오프셋(Offset) 입니다. 1. 하드웨어 이해 (TO-92 패키지) 두 센서 모두 동일한 형태입니다. 👉 평평한 면을 정면으로 봤을 때: 왼쪽 : VCC (5V) 가운데: OUTPUT 오른쪽: GND 센서 스펙 차이 LM35DZ 측정 범위: 0°C ~ 100°C 특징: 음수 온도 측정 불가 (기본 상태에서는) TMP36 측정 범위: -40°C ~ 125°C 특징: 영하 온도 측정 가능 2. 1단계: ADC 값을 전압으로 변환 아두이노는 전압을 직접 읽지 못하고 0 ~ 1023 범위의 디지털 값 으로 변환합니다. 공식 (블로그 안전 버전) Voltage(mV) = Reading × (5000.0 / 1024.0) 의미 5000.0 → 5V를 mV로 변환 1024.0 → ADC 분해능 (10비트) 1 step ≈ 4.88mV 즉, 👉 ADC 값 × 4.88mV = 실제 전압 3. 2단계: 전압 → 온도 변환 두 센서 모두 공통점: 10mV = 1°C 하지만 차이는 여기서 발생합니다: 👉 0°C 기준점 (Offset) 4. LM35DZ (기준점 = 0V) 특성 0°C → 0mV 완전히 비례하는 직선 공식 Temperature(°C) = Voltage(mV) / 10.0 장점 계산이 매우 단순 단점 음수 온도 측정 불가 (아두이노는 음전압 측정 못함) 5. TMP36 (Offset = 500mV) 핵심 개념: 오프셋(Offset) 0°C → 500mV 일부러 기준점을 위로 올려둠 이유 👉 영하에서도 전압이 0V 아래로 떨어지지 않게 하기 위해 예: -10°C → 400mV 공식 Temperature(°C) = (Volta...

[아두이노] RGB LED 핀 구별법: 공통 단자(Common) 완벽 정리

이미지
DIY 프로젝트나 회로 설계에서 자주 사용되는 4핀 RGB LED 는 처음 보면 핀 구별이 어렵게 느껴질 수 있습니다. 하지만 몇 가지 핵심 포인트만 알면 빠르고 정확하게 판별할 수 있습니다. 1️⃣ 외형으로 구별하기 (핀 길이 + 내부 구조) 가장 직관적인 방법은 핀 길이와 내부 금속 구조 를 확인하는 것입니다. 가장 긴 다리 → 이 핀이 바로 공통 단자 (Common) 입니다. 내부 금속판 (컵 형태) → LED 내부를 보면 특정 금속판이 유독 넓은데, 이 부분이 가장 긴 다리와 연결된 공통 단자 입니다. 핀 배열 (일반적인 형태) → 가장 긴 핀을 왼쪽에서 두 번째에 두었을 때 👉 Red - Common - Green - Blue 순서가 일반적입니다. ⚠️ 단, 제조사에 따라 다를 수 있으니 참고용으로만 활용하세요. 2️⃣ 구동 방식에 따른 분류 (Anode vs Cathode) RGB LED는 공통 단자의 극성에 따라 두 가지 타입으로 나뉩니다. 구분 Common Cathode Common Anode 공통 단자 GND (-) VCC (+) 제어 방식 HIGH(1) → 점등 LOW(0) → 점등 특징 아두이노 등에서 많이 사용 일부 드라이버 회로에서 사용 👉 핵심은 긴 다리가 +인지 -인지 입니다. 이것에 따라 회로 구성 방식이 완전히 달라집니다. 3️⃣ 멀티미터로 10초 만에 확인하는 방법 데이터시트가 없을 때 가장 확실한 방법입니다. 멀티미터를 다이오드 모드 로 설정 검정색 리드선(COM) 을 가장 긴 다리에 연결 빨간색 리드선 을 나머지 핀에 하나씩 접촉 💡 LED가 켜진다면 → Common Cathode (GND 공통) ❌ LED가 안 켜진다면 → 리드를 반대로 연결해서 다시 테스트 💡 그때 켜진다면 → Common Anode (VCC 공통) ⚠️ 설계 시 주의사항 (Engineering Tip) ✔ 전류 제한 저항은 필수 RGB LED는 색상마다 특성이 다릅니다. Red: 약 2.0V Green / Blue: 약 3.0 ~ 3.2V 따...

[아두이노] 스위치 노이즈, 디바운싱(Debouncing) 가이드

스위치를 한 번 눌렀는데 LED가 켜졌다가 바로 꺼지거나, 혹은 아예 반응하지 않는 경험. 처음엔 “내 코드가 잘못됐나?” 싶지만, 사실 문제는 코드가 아니라 물리 세계 에 있습니다. 버튼은 우리가 생각하는 것처럼 “딱 한 번” 눌리지 않습니다. 접점이 닿는 순간, 내부에서는 금속이 튕기며 수십 번 ON/OFF를 반복 합니다. 인간에게는 한 번의 클릭이지만, 마이크로컨트롤러에게는 이게 하나의 신호가 아니라 노이즈 덩어리 로 보입니다. 이 현상을 바운싱(Bouncing) 이라고 하고, 이를 해결하는 기술이 바로 디바운싱(Debouncing) 입니다. 🔧 해결의 핵심: “잠깐 기다렸다가 다시 보자” 디바운싱의 핵심 아이디어는 단순합니다. “변화가 감지되면, 바로 믿지 말고 잠깐 기다렸다가 다시 확인하자.” 접점이 안정되는 데 걸리는 시간은 보통 몇 ms 수준입니다. 그래서 약 5ms 정도 지연 후 다시 읽으면 , 훨씬 신뢰할 수 있는 값을 얻을 수 있습니다. 🧠 함수로 만드는 이유 이 로직을 loop() 안에 직접 써도 되지만, 그렇게 하면 코드가 점점 지저분해집니다. 그래서 우리는 이 동작을 함수로 캡슐화 합니다. 💻 전체 코드 (생략 없음) const int LED = 9 ; // LED를 9번 핀에 연결 const int BUTTON = 2 ; // 버튼을 2번 핀에 연결 boolean lastButton = LOW ; // 이전 버튼 상태 저장 변수 boolean currentButton = LOW ; // 현재 버튼 상태 저장 변수 boolean ledOn = false ; // LED의 현재 상태 (ON/OFF) void setup () { pinMode ( LED , OUTPUT ); pinMode ( BUTTON , INPUT ); // 입력 모드 설정 (풀다운 저항 필요) } /* * 디바운싱 함수 (Debouncing Function) ...