05. 감각 불어넣기: 센서로 세상 읽기

아두이노에게 빛을 느끼는 눈과, 거리를 가늠하는 귀를 달아줍니다.

1. 세상의 빛을 느끼다: 조도 센서 (CDS Cell)

조도 센서는 주변이 밝으면 저항이 작아지고, 어두우면 저항이 커지는 특별한 부품입니다. 이 저항의 변화를 전압의 변화로 바꾸어 아두이노의 아날로그 핀(A0)으로 읽어 들입니다.

☀️ 밝을 때: 값 증가 (ex. 800) 🌙 어두울 때: 값 감소 (ex. 200)
▲ 조도 센서(CDS)의 원리. 빛의 양에 따라 변하는 저항값을 아날로그 데이터로 읽어옵니다.

⚠️ 반드시 10kΩ 고정 저항이 필요합니다!

버튼에서 플로팅 현상을 막기 위해 저항을 썼던 것 기억하시나요? 조도 센서도 마찬가지로, 전압을 정확히 나누어 아두이노에 전달하기 위해 한쪽 다리에 10kΩ 저항(풀다운 저항)을 연결하고 GND로 빼주어야 합니다.

💡 실습 1: 어두워지면 켜지는 가로등

void setup() {
    Serial.begin(9600);   // 컴퓨터와 통신 시작
    pinMode(13, OUTPUT);  // 13번 내장 LED 출력 설정
}

void loop() {
    int light = analogRead(A0); // 조도 센서 값 읽기 (0 ~ 1023)
    
    Serial.print("현재 빛의 밝기: ");
    Serial.println(light);
    
    // 센서 값이 300보다 작으면 (어두워지면)
    if (light < 300) {
        digitalWrite(13, HIGH); // 가로등(LED) 켜기
    } else {
        digitalWrite(13, LOW);  // 밝으면 끄기
    }
    
    delay(100);
}

2. 박쥐처럼 거리를 재다: 초음파 센서 (HC-SR04)

초음파 센서는 사람의 귀에 들리지 않는 높은 주파수의 소리(초음파)를 발사하고, 그 소리가 물체에 부딪혀 되돌아오는 시간을 측정하여 거리를 계산합니다.

T R 장애물 Trig 핀: 야~ (초음파 발사) Echo 핀: 메아리 수신
▲ 초음파 센서 원리: 초음파를 쏘는 입(Trig)과 듣는 귀(Echo)로 나뉘어 있습니다.

💡 거리 계산 공식 (물리 시간!)

소리의 속도는 1초에 약 340m(34,000cm)를 이동합니다. 1마이크로초(us)로 환산하면 0.034cm가 되죠. 거리는 '속력 × 시간'이므로, 초음파가 날아간 시간에 0.034를 곱합니다. 단, 왕복한 시간이므로 반드시 2로 나누어 주어야 합니다.
거리(cm) = 측정된 시간(us) × 0.034 / 2

🎯 실습 2: 후방 감지 센서 만들기

초음파 센서의 Trig를 9번 핀에, Echo를 10번 핀에 연결하고 물체와의 거리를 cm 단위로 측정해 봅시다.

int trigPin = 9;
int echoPin = 10;

void setup() {
    Serial.begin(9600);
    pinMode(trigPin, OUTPUT); // 입(쏘는 쪽)은 출력
    pinMode(echoPin, INPUT);  // 귀(듣는 쪽)는 입력
}

void loop() {
    // 1. 초음파 발사 (아주 짧은 시간 동안 HIGH 신호 주기)
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    // 2. 되돌아온 시간 측정 (pulseIn 함수 사용)
    // 초음파가 돌아와 Echo 핀이 HIGH로 머문 시간을 마이크로초(us) 단위로 반환
    long duration = pulseIn(echoPin, HIGH);

    // 3. 거리를 cm로 계산 (거리 = 시간 * 속력 / 2)
    long distance = (duration * 0.034) / 2;

    Serial.print("장애물과의 거리: ");
    Serial.print(distance);
    Serial.println(" cm");

    delay(500); // 0.5초마다 갱신
}