본문 바로가기

Programming/Windows10IoTCore

Windows 10 IoT Core 초음파 센서(HC-SR04)로 거리 측정

반응형

초음파 센서를 활용하면 장애물과의 거리를 측정할 수 있습니다.

1천 원 내외로 구매가 가능한 초음파 센서인 HC-SR04를 활용해서 거리 측정이 가능합니다.

2cm에서 4m까지의 거리를 3mm의 정확도로 측정할 수 있습니다.

Windows 10 IoT Core에서 HC-SR04를 통해 거리를 측정하는 방법입니다.


1. 준비물

다음과 같은 부품이 필요합니다.

  • HC-SR04
  • 330Ω 저항
  • 470Ω 저항
  • 연결용 케이블

전체적인 부품은 위의 것으로 충분한데 저항은 4.7㏀과 10㏀을 사용해도 됩니다.


2. 센서 연결

회로는 다음과 같이 구성하면 됩니다.

빨간색은 5V 출력과 연결되며 검은색은 GND에 연결됩니다.

GPIO 배치가 따로 없는데 녹색선(Trig)은 GPIO 18, 파란선(Echo)은 GPIO 12에 연결되어 있습니다.

상단의 저항은 330Ω이며 하단의 저항은 470Ω으로 연결되어 있습니다.


3. 샘플 프로그램 작성

샘플 프로그램은 역시 C#으로 작성합니다.

HC-SR04로 거리를 측정하는 코드는 다음과 같습니다.

using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Windows.Devices.Gpio;

namespace PGBox.IoTCore.Sensor.Distance
{
    class HCSR04
    {
        private GpioController gpio;
        private GpioPin trigPin;
        private GpioPin echoPin;

        private bool initialized = false;
        public int TimeoutMilliseconds { get; set; }

        public HCSR04()
        {
        }

        public int Init(int trigPinNum, int echoPinNum, int timeoutMilliseconds = 20)
        {
            gpio = GpioController.GetDefault();
            if (null == gpio)
            {
                return 1;
            }

            trigPin = gpio.OpenPin(trigPinNum);
            echoPin = gpio.OpenPin(echoPinNum);

            TimeoutMilliseconds = timeoutMilliseconds;

            trigPin.SetDriveMode(GpioPinDriveMode.Output);
            echoPin.SetDriveMode(GpioPinDriveMode.Input);

            initialized = true;

            return 0;
        }
    
        public double GetDistance(int timeoutMilliseconds = 20)
        {
            if (false == initialized)
                return 0.0;

            TimeoutMilliseconds = timeoutMilliseconds;

            trigPin.Write(GpioPinValue.Low);
            Task.Delay(TimeSpan.FromMilliseconds(1)).Wait(); // 1millisecond

            trigPin.Write(GpioPinValue.High);
            Task.Delay(TimeSpan.FromMilliseconds(0.01)).Wait(); // 10microseconds
            trigPin.Write(GpioPinValue.Low);

            Stopwatch sw = new Stopwatch();
            sw.Start();

            while (sw.ElapsedMilliseconds < TimeoutMilliseconds && GpioPinValue.Low == echoPin.Read()) ;

            if (sw.ElapsedMilliseconds >= TimeoutMilliseconds)
                return 0.0;

            sw.Restart();

            while (sw.ElapsedMilliseconds < TimeoutMilliseconds && GpioPinValue.High == echoPin.Read()) ;
            sw.Stop();

            if (sw.ElapsedMilliseconds >= TimeoutMilliseconds)
                return 0.0;

            // the utralsonic speed is 34300cm/s -> 34.3cm/ms. And divide by 2 becuase it is round-trip time.
            return sw.Elapsed.TotalMilliseconds * 34.3 / 2.0;
        }
    }
}

기존에 존재하는 파이썬 코드를 Windows 10 IoT Core에 맞게 수정하면 동작합니다.

샘플 코드를 포함한 전체 코드는 아래 github 주소에서 확인이 가능합니다.

https://github.com/psychoria/HCSR04sample

초음파는 34300cm/s의 속력으로 이동하기 때문에 계산으로 쉽게 거리를 얻을 수 있습니다.

마지막에 2로 나누는 이유는 초음파가 왕복하기 때문에 실제 거리는 절반이기 때문입니다.


4. 활용 방안

초음파 센서의 거리 측정을 통해서 특정 거리 이내 일 때 LED를 켜거나 하는 동작을 추가로 할 수 있습니다.

혹은 조도 센서와 함께 사용해서 방이 어둡거나 할 때만 LED를 켜고 끌 수도 있습니다.

HC-SR04는 아주 정확하지는 않지만 대략적으로 cm 단위 내에서는 정확성을 어느 정도 보장합니다.

초음파 센서를 활용한 거리 측정으로 다양한 시도가 가능합니다.

반응형