[아두이노] 적외선 거리 센서 : GP2Y0A21 IR - C29 (with 3m 연장선)

    거리를 측정해야 할 일이 있는데 아두이노와 쉽게 호환되는 센서 종류로는 대~충 3가지가 있는 것 같습니다.

    • 적외선 센서
    • 초음파 센서
    • LIDAR 센서

    해당 제품은 적외선을 통해 거리를 측정하는 센서로, 측정 방법에 '빛'이 사용된다는 점이 특징입니다.

    따라서 측정의 매개체가 되는 빛에 영향을 주는 환경에서는 해당 센서를 사용하는 것을 고려해야 할 것입니다.

    (예를 들면 직사광선이 쏟아지는 야외, 그늘과 양지를 오가는 상황, 비가 올 수도 있는 환경 등)

    매우 단순한 구조입니다.

    센서의 구조 자체는 크게 적외선 발광부와 수광부로 이루어져 있습니다.

    적외선을 발광하여 반사물에 반사되는 적외선의 양에 따라 거리를 측정하며, 측정 된 거리만큼 아날로그 전압으로 출력하는 방식입니다.

    참고로, 해당 모델은 아날로그형 모델(GP2Y0'A'21)로, 디지털형 모델(GP2Y0'D'21)도 있습니다.


    Specification

    제품명 : GP2Y0A21 IR 혹은 LK-DMS

    가격 : 9,800원 (VAT 별도)

    거리 측정 범위 : 10 ~ 80cm

    동작 전압 : 4.5V ~ 5.5V

    케이블

      - 검은색 : GND

      - 빨간색 : Vcc

      - 노란색 : Vd (아두이노 아날로그 입력핀으로 사용)

    거리 측정 특성곡선

    1차 함수가 아니네요. switch 문으로 쪼개던가 해야 하는데 귀찮습니다.


    Environment

    제가 사용할 환경은 먼저 야외의 상황입니다.

    야외를 주행하는 로봇에 부착할 센서이고 눈/비가 심하게 오는 상황이 아니면 4계절 내내 밖에 있을 로봇입니다.

    특히 잔디 위에서 굴러다닐 놈이라 잔디에 의한 난반사(?)현상에도 견뎌야 하는 아주 rough한 환경입니다.

    특이사항이라고 한다면 위 사진과 같이 센서와 아두이노 사이의 거리가 무려 3m나 됩니다.

    아무리 도선이 얇아도 혹시나 도선 저항에 따른 전압 강하가 발생하지 않을까 우려했습니다.


    Test Code

    아래는 테스트용 코드 원문입니다.

    #define IRPin A0
    
    int voltageIn;
    float distance;
    
    void setup () {
        Serial.begin(115200);
        Serial.println("Setup in progress...");
        pinMode(IRPin, INPUT);
    }
    
    void loop() {
        voltageIn = map(analogRead(IRPin), 0, 1023, 0, 5000);
        distance = (24.61 / (voltageIn - 0.1696)) * 1000;
    
        if ((distance > 10) && (distance < 80)) {
            Serial.print("Distance : ");
            Serial.print(distance);
            Serial.println(" cm");
        }
        else {
            Serial.println("Measurement out of range!");
        }
    }

    테스트용 코드는 매우 단순합니다.

    먼저 아날로그 A0 핀을 지정해주고 값을 저장할 변수를 선언합니다.

    지정된 아날로그 핀으로부터 전압값을 읽어들입니다.

    아두이노 아날로그 입력은 10bit의 해상도를 갖고 있으므로 map() 함수를 사용하여 0~1023의 입력값을 0~5000mV의 값으로 스케일링 합니다.

    distance로 저장되는 거리값을 계산하는 식은 저도 디바이스 마트에 나와있는 식을 사용한 것입니다.

    (따라서 계산식의 출처를 모릅니다.)

     

    거리값을 구한 후, 제품 스펙에 따른 측정 범위 내의 값만 출력하도록 if()문을 작성했습니다.

    위의 시리얼 모니터는 VSCode의 콘솔창을 활용한 것입니다.

    2021.05.22 - [메모장] - [macOS] VSCode를 사용하여 아두이노 IDE를 대체하기.

     

    [macOS] VSCode를 사용하여 아두이노 IDE를 대체하기.

    아두이노 IDE 잘 쓰고 계십니까? 저는 아두이노의 이 IDE 화면을 볼때마다 솔직히 ㅃㅏㄱ이 칩니다... 킹리적 갓심이지만, 저는 아두이노 재단이 이 앞뒤 꽉꽉 틀어막힌 IDE를 일부러 개선하지 않는

    conceptbug.tistory.com


    Code with Smoothing

    위의 테스트 코드로는 읽는대로 값을 출력하는 raw 방식이다 보니 값이 좀 튀는 것 같아 평균 필터를 적용했습니다.

    #define IRPin A0
    
    float distance;
    
    int getDistance (int count) {
        int voltageIn = 0;
        float distance;
    
        for (int i = 0; i < count; i++) {
            voltageIn += map(analogRead(IRPin), 0, 1023, 0, 5000);
        }
        distance = ((24.61 / ((voltageIn / count) - 0.1696)) * 1000);
    
        return distance;
    }
    
    void setup () {
        Serial.begin(115200);
        Serial.println("Setup in progress...");
        pinMode(IRPin, INPUT);
    }
    
    void loop() {
        distance = getDistance(10);
    
        if ((distance > 10) && (distance < 80)) {
            Serial.print("Distance : ");
            Serial.print(distance);
            Serial.println(" cm");
        }
        else {
            Serial.println("Measurement out of range!");
        }
    }

    형변환을 안해서 int값에 그냥 소수점만 찍은 것 같이 출력되네요.


    마무리

    이게 빛을 사용한 방식이다 보니 야외에서 얼마나 취약할지, 혹은 생각보다 잘 버틸지 모르겠습니다.

    실제로 장착하고 시운전을 여러번 돌려봐야 알 수 있겠죠.

    또한 처음에 사용을 위해 자료를 구글링하다 보니 아래와 같은 상위 모델이 있더군요.

    가격은 무려 50%나 비싼 14,600원

    가격이 비교적으로는 비싸지만, 센서 하나가 아직은 15,000원 선이니 한번 테스트 해볼만한 가치가 있다고 생각이 듭니다.

    참고로 아래는 초음파 센서를 이용한 거리 측정 방법입니다.

    2021.05.29 - [메모장] - [아두이노] 초음파 거리 센서 : HC-SR04 (with 3m 연장선)

     

    [아두이노] 초음파 거리 센서 : HC-SR04 (with 3m 연장선)

    이전에 적외선 거리 센서를 다뤘습니다. https://conceptbug.tistory.com/entry/아두이노-적외선-거리-센서-GP2Y0A21-IR-C29-with-3m-연장선 [아두이노] 적외선 거리 센서 : GP2Y0A21 IR - C29 (with 3m 연장선)..

    conceptbug.tistory.com

     

    댓글

    Designed by JB FACTORY