센서 값 실시간으로 읽기: 로봇 코딩의 첫걸음
페이지 정보

본문
센서 값 실시간으로 읽기: 로봇 코딩의 첫걸음
이 가이드는 아두이노(Arduino)를 사용하여 가장 흔히 쓰이는 디지털 센서와 아날로그 센서의 값을 실시간으로 읽어들이는 방법을 자세히 설명합니다.
1. 센서, 디지털과 아날로그의 차이
센서가 값을 출력하는 방식은 크게 두 가지로 나눌 수 있습니다.
디지털 센서 (Digital Sensor):
출력: 0 또는 1 (LOW 또는 HIGH)의 이산적인 값을 출력합니다. 마치 '켜짐/꺼짐', '있음/없음'처럼 이분법적인 정보를 제공합니다.
예시: 버튼(눌렸다/안 눌렸다), 라인 센서(검은선 감지/안 감지), PIR 인체 감지 센서(움직임 감지/안 감지).
아두이노 함수: digitalRead()
아날로그 센서 (Analog Sensor):
출력: 0에서 1023 사이의 연속적인 값을 출력합니다 (아두이노 우노 기준). 밝기, 온도, 거리 등 '얼마나 많은지' '어느 정도인지'를 나타내는 정보를 제공합니다.
예시: 조도 센서(밝기 정도), 가변저항(돌려진 정도), 초음파 센서(거리).
아두이노 함수: analogRead()
2. 센서 값 실시간으로 읽는 방법 (아두이노 예시)
준비물:
아두이노 우노 R3 호환 보드: 1개
USB 케이블: 1개
브레드보드: 1개
점퍼 케이블: 여러 개
디지털 센서 예시: 버튼 (1개), 10kΩ 저항 (1개)
아날로그 센서 예시: 조도 센서 (1개), 10kΩ 저항 (1개)
(선택 사항) LED 1개, 220Ω 저항 1개 (센서 값에 따른 반응 확인용)
2.1. 디지털 센서 (버튼) 값 읽기
배선:
아두이노 5V 핀 → 브레드보드 전원(+) 라인 연결.
아두이노 GND 핀 → 브레드보드 접지(-) 라인 연결.
버튼의 한쪽 다리 → 브레드보드 전원(+) 라인 연결.
버튼의 다른 쪽 다리 → 브레드보드의 비어있는 열에 연결.
버튼의 다른 쪽 다리와 연결된 열 → 10kΩ 저항 한쪽 다리 연결.
10kΩ 저항의 다른 쪽 다리 → 브레드보드 접지(-) 라인 연결.
버튼의 다른 쪽 다리와 10kΩ 저항이 만나는 지점 → 아두이노 디지털 핀 2 연결.
풀다운 저항: 10kΩ 저항은 '풀다운 저항(Pulldown Resistor)'으로, 버튼이 눌리지 않았을 때 핀 2가 안정적으로 LOW (0V) 상태를 유지하도록 해줍니다.
아두이노 코드:
cpp
const int buttonPin = 2; // 버튼을 핀 2에 연결
void setup() {
pinMode(buttonPin, INPUT); // 버튼 핀을 입력으로 설정
Serial.begin(9600); // 시리얼 통신 시작 (컴퓨터로 값 출력용)
}
void loop() {
int buttonState = digitalRead(buttonPin); // 버튼 핀의 디지털 값 읽기 (HIGH/LOW)
Serial.print("Button State: ");
Serial.println(buttonState); // 시리얼 모니터에 값 출력
// (선택 사항) 버튼이 눌리면 LED 켜기 예시
// if (buttonState == HIGH) { // 버튼이 눌리면 (HIGH 값)
// digitalWrite(13, HIGH); // 13번 핀에 연결된 LED 켜기 (아두이노 내장 LED)
// } else {
// digitalWrite(13, LOW); // LED 끄기
// }
delay(100); // 0.1초마다 값 읽기
}
코드 업로드 후 테스트: 아두이노에 코드를 업로드하고 시리얼 모니터를 엽니다. 버튼을 누르면 Button State: 1이, 떼면 Button State: 0이 출력되는 것을 확인할 수 있습니다.
2.2. 아날로그 센서 (조도 센서) 값 읽기
배선:
아두이노 5V 핀 → 브레드보드 전원(+) 라인 연결.
아두이노 GND 핀 → 브레드보드 접지(-) 라인 연결.
조도 센서의 한쪽 다리 → 브레드보드 전원(+) 라인 연결.
조도 센서의 다른 쪽 다리 → 10kΩ 저항 한쪽 다리 연결. 이 연결 지점 → 아두이노 A0 아날로그 핀 연결.
10kΩ 저항의 다른 쪽 다리 → 브레드보드 접지(-) 라인 연결.
전압 분배 회로: 조도 센서와 10kΩ 저항이 '전압 분배 회로'를 구성하여, 빛의 밝기에 따라 아날로그 핀에 걸리는 전압이 변하고, 아두이노는 이 전압을 0부터 1023 사이의 디지털 값으로 변환하여 읽어들입니다.
아두이노 코드:
cpp
const int lightSensorPin = A0; // 조도 센서를 A0 아날로그 핀에 연결
void setup() {
Serial.begin(9600); // 시리얼 통신 시작
}
void loop() {
int lightValue = analogRead(lightSensorPin); // A0 핀의 아날로그 값 읽기 (0-1023)
Serial.print("Light Value: ");
Serial.println(lightValue); // 시리얼 모니터에 값 출력
// (선택 사항) 조도 센서 값에 따라 LED 밝기 조절 예시
// analogWrite(3, map(lightValue, 0, 1023, 0, 255)); // 핀 3은 PWM 핀이어야 함
// map 함수: 0-1023 값을 0-255 값으로 비례 변환
delay(100); // 0.1초마다 값 읽기
}
코드 업로드 후 테스트: 아두이노에 코드를 업로드하고 시리얼 모니터를 엽니다. 조도 센서를 손으로 가리거나 밝은 빛을 비추면 Light Value가 변하는 것을 확인할 수 있습니다 (어두울수록 낮은 값, 밝을수록 높은 값 - 센서 연결 방식에 따라 반대일 수 있음).
3. 센서 값 읽기의 핵심 팁
배선 확인: 센서가 제대로 작동하지 않으면 가장 먼저 VCC, GND, Signal 핀이 올바르게 연결되었는지 확인합니다. 특히 GND(접지)는 모든 부품이 공통으로 연결되어야 합니다.
시리얼 모니터 활용: 아두이노의 Serial.begin()과 Serial.print() 함수를 사용하여 센서 값을 컴퓨터의 시리얼 모니터로 출력해보세요. 로봇이 어떻게 환경을 인지하고 있는지 직접 눈으로 확인할 수 있습니다. 이는 디버깅(오류 찾기)에 매우 효과적입니다.
센서의 동작 방식 이해: 각 센서가 어떤 방식으로 정보를 출력하는지(디지털/아날로그, HIGH/LOW의 의미, 값의 범위 등) 미리 이해하면 코딩과 문제 해결이 훨씬 쉬워집니다.
지연(delay) 활용: loop() 함수에서 센서 값을 너무 빠르게 읽으면 시리얼 모니터 출력이 혼란스러울 수 있습니다. 적절한 delay() 함수를 사용하여 읽는 속도를 조절해 주세요.
임계값(Threshold) 조정: 아날로그 센서를 사용하는 경우, '밝다/어둡다', '가깝다/멀다'를 판단하는 기준이 되는 임계값(threshold)은 주변 환경이나 센서 배치에 따라 달라질 수 있습니다. 시리얼 모니터로 실제 센서 값을 확인하면서 가장 적절한 임계값을 찾는 것이 중요합니다.
센서 값을 실시간으로 읽어들이는 것은 로봇에게 '외부 세상과 소통하는 능력'을 부여하는 것과 같습니다. 이 첫걸음을 통해 로봇이 단순히 정해진 동작만을 반복하는 기계를 넘어, 환경에 반응하고 스스로 판단하는 '지능적인 존재'로 발전하는 신비로운 과정을 경험할 수 있을 것입니다.
- 이전글로봇 만들 때 생기는 흔한 오류 & 해결 꿀팁 25.11.20
- 다음글로봇에게 '움직여!' 명령하기: 모터 제어의 기초 25.11.20
댓글목록
등록된 댓글이 없습니다.
