빛을 따라가는 로봇: CDS 센서 활용법 > 초보자를 위한 로봇 프로젝트

본문 바로가기
사이트 내 전체검색

초보자를 위한 로봇 프로젝트

빛을 따라가는 로봇: CDS 센서 활용법

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 282회 작성일 25-11-20 14:31

본문

빛을 따라가는 로봇: CdS 센서 활용법

빛을 따라 움직이는 로봇은 마치 해바라기처럼 빛의 방향을 감지하고 그쪽으로 나아가는, 매우 직관적이고 흥미로운 로봇 프로젝트입니다. 이러한 로봇을 만들 때 핵심적인 역할을 하는 것이 바로 **CdS 센서(황화카드뮴 광센서)**입니다.


1. CdS 센서, 빛의 세기를 어떻게 감지할까요? (작동 원리)

CdS 센서는 빛의 세기에 따라 전기 저항값이 변하는 특성을 가진 센서입니다. 


빛이 강할 때 (밝을 때): 센서의 저항값이 낮아집니다.

빛이 약할 때 (어두울 때): 센서의 저항값이 높아집니다.

아두이노와 같은 마이크로컨트롤러는 이 저항값의 변화를 직접 읽을 수 없으므로, 전압 분배 회로를 구성하여 저항값 변화를 전압값 변화로 바꿔 아날로그 핀을 통해 읽어들입니다. 아날로그 핀은 0에서 1023 사이의 값을 출력하는데, CdS 센서를 이용한 전압 분배 회로에서는 보통 밝을수록 높은 값, 어두울수록 낮은 값을 출력합니다.


2. 빛을 따라가는 로봇의 '원리' 이해하기

빛을 따라가는 로봇은 CdS 센서를 이용하여 빛의 방향을 인지하고, 그에 맞춰 로봇의 진행 방향을 조절합니다.


인지 (CdS 센서): 로봇 앞쪽에 두 개 이상의 CdS 센서를 나란히 부착합니다 (예: 왼쪽, 오른쪽).

판단 (컨트롤러/코드): 아두이노가 왼쪽 센서와 오른쪽 센서로부터 각각 빛의 세기 값을 읽어들입니다.

왼쪽 센서 > 오른쪽 센서: 로봇의 왼쪽에 빛이 더 강하다. → 왼쪽으로 회전.

왼쪽 센서 < 오른쪽 센서: 로봇의 오른쪽에 빛이 더 강하다. → 오른쪽으로 회전.

왼쪽 센서 ≈ 오른쪽 센서: 빛이 정면에 있다. → 앞으로 직진.

행동 (모터): 아두이노의 판단에 따라 모터 드라이버가 로봇의 바퀴 모터를 제어하여 로봇을 움직입니다.

3. CdS 센서 연결하기

CdS 센서는 두 개의 다리를 가진 저항체이므로, LED와 유사하게 연결하면 됩니다. 아두이노의 아날로그 핀에 연결하려면 반드시 저항과 함께 전압 분배 회로를 구성해야 합니다. (예: 10kΩ 저항)


배선 예시 (2개의 CdS 센서 기준):


전원 공급: 아두이노 5V 핀을 브레드보드 + 라인에, GND 핀을 브레드보드 - 라인에 연결.

왼쪽 CdS 센서:

CdS 센서의 한쪽 다리 → 아두이노 5V (브레드보드 + 라인)

CdS 센서의 다른 쪽 다리 → 10kΩ 저항 한쪽 다리와 연결. 이 연결 지점 → 아두이노 A0 아날로그 핀 연결.

10kΩ 저항의 다른 쪽 다리 → 아두이노 GND (브레드보드 - 라인)

오른쪽 CdS 센서:

CdS 센서의 한쪽 다리 → 아두이노 5V (브레드보드 + 라인)

CdS 센서의 다른 쪽 다리 → 10kΩ 저항 한쪽 다리와 연결. 이 연결 지점 → 아두이노 A1 아날로그 핀 연결.

10kΩ 저항의 다른 쪽 다리 → 아두이노 GND (브레드보드 - 라인)

4. 아두이노로 CdS 센서 값 읽고 빛 따라가기 (코딩 꿀팁)

cpp



// CdS 센서 핀 정의

const int leftSensorPin = A0;  // 왼쪽 CdS 센서를 아날로그 A0 핀에 연결

const int rightSensorPin = A1; // 오른쪽 CdS 센서를 아날로그 A1 핀에 연결


// 모터 제어 핀 (L298N 모터 드라이버 기준)

const int motor1_in1 = 8;

const int motor1_in2 = 9;

const int motor2_in1 = 10;

const int motor2_in2 = 11;

const int motor1_ena = 5; // 왼쪽 바퀴 속도 (PWM)

const int motor2_enb = 6; // 오른쪽 바퀴 속도 (PWM)


// 모터 속도

const int base_speed = 150; // 기본 전진 속도

const int turn_speed = 100; // 회전 속도


// 센서 값 차이 임계값 (이 값 이상 차이나면 회전)

const int light_difference_threshold = 50; // 환경에 따라 조절 필요


void setup() {

  // 모터 제어 핀들을 출력으로 설정

  pinMode(motor1_in1, OUTPUT); pinMode(motor1_in2, OUTPUT);

  pinMode(motor2_in1, OUTPUT); pinMode(motor2_in2, OUTPUT);

  pinMode(motor1_ena, OUTPUT); pinMode(motor2_enb, OUTPUT);


  Serial.begin(9600); // 시리얼 통신 시작 (센서 값 확인용)

}


void loop() {

  int leftLight = analogRead(leftSensorPin);   // 왼쪽 센서 값 읽기

  int rightLight = analogRead(rightSensorPin); // 오른쪽 센서 값 읽기


  Serial.print("Left: "); Serial.print(leftLight);

  Serial.print(" / Right: "); Serial.println(rightLight);


  // 빛의 세기를 비교하여 로봇의 행동 결정

  if (abs(leftLight - rightLight) < light_difference_threshold) {

    // 양쪽 센서 값이 비슷하면 (빛이 정면에 있으면)

    moveForward(); // 앞으로 직진

    Serial.println("-> Forward (Light Straight)");

  } else if (leftLight > rightLight) {

    // 왼쪽 센서 값이 더 크면 (왼쪽에 빛이 더 강하면)

    turnLeft(); // 왼쪽으로 회전

    Serial.println("-> Turn Left (Light on Left)");

  } else { // rightLight > leftLight

    // 오른쪽 센서 값이 더 크면 (오른쪽에 빛이 더 강하면)

    turnRight(); // 오른쪽으로 회전

    Serial.println("-> Turn Right (Light on Right)");

  }


  delay(50); // 짧은 지연 (너무 빠르면 센서 값 변화를 감지하기 어려울 수 있음)

}


// 로봇 주행 제어 함수들 (이전 프로젝트들과 동일)


void moveForward() {

  digitalWrite(motor1_in1, HIGH); digitalWrite(motor1_in2, LOW);

  analogWrite(motor1_ena, base_speed);


  digitalWrite(motor2_in1, HIGH); digitalWrite(motor2_in2, LOW);

  analogWrite(motor2_enb, base_speed);

}


void turnLeft() { // 제자리 좌회전 (왼쪽 바퀴 후진, 오른쪽 바퀴 전진)

  digitalWrite(motor1_in1, LOW); digitalWrite(motor1_in2, HIGH);

  analogWrite(motor1_ena, turn_speed);


  digitalWrite(motor2_in1, HIGH); digitalWrite(motor2_in2, LOW);

  analogWrite(motor2_enb, turn_speed);

}


void turnRight() { // 제자리 우회전 (왼쪽 바퀴 전진, 오른쪽 바퀴 후진)

  digitalWrite(motor1_in1, HIGH); digitalWrite(motor1_in2, LOW);

  analogWrite(motor1_ena, turn_speed);


  digitalWrite(motor2_in1, LOW); digitalWrite(motor2_in2, HIGH);

  analogWrite(motor2_enb, turn_speed);

}


void stopRobot() { // 로봇 정지 (모든 모터 정지)

  digitalWrite(motor1_in1, LOW); digitalWrite(motor1_in2, LOW);

  analogWrite(motor1_ena, 0);


  digitalWrite(motor2_in1, LOW); digitalWrite(motor2_in2, LOW);

  analogWrite(motor2_enb, 0);

}

5. CdS 센서 사용 시 꿀팁

센서 배치: 두 개의 CdS 센서를 로봇의 전면 좌우에 일정한 간격(예: 3~5cm)을 두고 부착합니다. 센서 간의 거리가 너무 멀거나 가까우면 빛의 차이를 감지하기 어렵습니다. 빛을 감지하는 부분이 바깥으로 향하도록 합니다.

주변 환경 영향: CdS 센서는 모든 종류의 빛에 반응합니다. 간접광이나 주변의 다른 광원(창문, 형광등)이 로봇의 동작에 영향을 줄 수 있으므로, 테스트 환경을 단순하게 조성하는 것이 좋습니다.

Threshold 값 조정: light_difference_threshold 값은 센서의 민감도를 조절하는 역할을 합니다. 이 값이 너무 작으면 로봇이 빛의 미세한 변화에도 과도하게 반응하여 흔들릴 수 있고, 너무 크면 빛의 방향을 잘 감지하지 못합니다. 시리얼 모니터를 통해 왼쪽/오른쪽 센서 값을 직접 확인하며 최적의 값을 찾습니다.

반응 속도: delay() 값을 조절하여 로봇이 빛 변화에 반응하는 속도를 조절할 수 있습니다. 너무 빠르면 불안정해지고, 너무 느리면 제때 반응하지 못합니다.

고려 사항: CdS 센서는 납과 카드뮴이라는 중금속을 포함하고 있어 인체에 해로울 수 있으므로, 폐기 시 유의하고 가급적 피부에 직접 닿지 않도록 주의합니다. 최근에는 환경 문제와 RoHS 규제 등으로 CdS 대신 포토트랜지스터나 포토다이오드를 사용하는 추세입니다. (초보자용 키트에는 아직 CdS 센서가 많이 포함되어 있습니다.)

CdS 센서를 활용하여 빛을 따라가는 로봇을 만들면서, 로봇이 어떻게 주변 환경의 변화(빛의 유무/방향)를 인지하고 그에 맞춰 지능적으로 행동하는지 직접 경험할 수 있습니다. 로봇에게 '빛을 향해 나아가는 본능'을 심어주는 이 프로젝트를 통해 로봇 공학의 재미에 푹 빠져보세요!

[이 게시물은 관리자님에 의해 2025-11-22 10:15:07 초보자를 위한 로봇 프로젝트에서 이동 됨]
[이 게시물은 관리자님에 의해 2025-11-29 13:01:12 18에서 이동 됨]

댓글목록

등록된 댓글이 없습니다.


회사소개 개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

작크와콩나무
대표:이강복 등록번호:129-30-34337 개인정보관리책임자:이경영

Copyright © https://roboman.co.kr/ All rights reserved.