iFLine-코딩으로 뽀샤버리기

7강. 초음파 센서값 읽어 오기

Posted by INDIFROG on 2020-06-29
Words 477 and Reading Time 2 Minutes
Viewed Times

7강. 초음파 센서값 읽어 오기

iFLine_sonic

HeaderPin         GPIO

  Echo            IO8
  Trig            IO7

이렇게 소켓들을 연결합니다.

iFLine_sonic_02

iFLine에서는 HC-SR04 초음파 센서를 사용하고 있습니다.

이미 이 센서에 관련된 자료가 인터넷에 너무 많이 퍼져 있어서 새삼 따로 정리하는 것이 우습기도 하지만
친절하게 IFZero MCU보드에도 잘 동작하는 것을 확인하는 정도로 마무리할 까 합니다.

HC-SR04 초음파 센서 데이터시트 분석

데이터 시트의 내용을 먼저 분석해 봅니다.

Working Voltage: DC 5V
Working Current: 15mA
Working Frequency: 40Hz
Max Range: 4m
Min Range: 2cm
Measuring Angle: 15 degree
Trigger Input Signal: 10µS TTL pulse
Echo Output Signal Input TTL lever signal and the range in proportion
Dimension 45 * 20 * 15mm

위 스펙을 분석해 보면 대략 2Cm에서 4M까지 범위내에 장애물이 존재하는 것을 인지할 수 있는 능력을 제공합니다만 하기 주의 사항에서 공지해 드린 바와 같이 실제 3.3V에서는 초음파 감지 거리가 줄어 들 것 같습니다.

HC-SR04 초음파 센서는 동작 전압이 5V와 3.3V, 3.3V ~ 5V 이렇게 3 종류가 존재합니다.
5V에서 동작하는 HC-SR04 버전들은 ESP32 PICO V3이 메인 MCU인 IFZero 보드에서는 동작하지 않았습니다. 

아래 그림에서 왼쪽 버전은 3.3V~5V 내에서 동작이 가능하도록 버전업된 모델이고,
오른쪽 버전은 HC-SR04P라는 이름의 3.3V 전용 보드입니다
iFLine은 오른쪽 3.3V HC-SR04P 초음파 센서를 제공합니다.

iFLine_sonic_03

HC-SR04 초음파 센서 동작 분석

측정을 시작하기 위해 MCU에서 모듈의 Trigger Pin에 짧은 10us 트리거 펄스를 공급합니다.

그러면 모듈에서 40 kHz 주파수로 8개 사이클의 초음파 버스트를 발생합니다.

이 후 Ehco 핀을 통해 장애물에 부딪혀서 되돌아오는 에코 시간 즉, MCU가 High 레벨 구간의 시간을 읽어 냅니다. 특정 시간내 응답이 존재(즉, 이장치가 동작가능한 4m 내에서 )한다면 거리에 비례하는 펄스폭의 시간을 산출할 수 있습니다.

트리거 신호 전송과 시간 간격을 통한 범위 계산

에코 신호 시간( us )에 대한 거리 공식 :

 거리( cm )  =   us / 58 

이에 대한 자세한 공식 유도는 코드의 주석에 남겨놓았습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <Arduino.h>
/////////////////////////////////////////////////////////////////
// for Ultrasonic Sensor
int echoPin = 8;
int trigPin = 7;


void setup()
{
Serial.begin(115200);

// for Ultra Sound Sensor
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

}


void loop() {

// for Ultra Sonic Sensor
float duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

// echoPin 이 HIGH를 유지한 시간을 저장 한다.
duration = pulseIn(echoPin, HIGH);

// HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
// 초음파(소리)는 초당 340 M를 이동하는 속도
// 단위를 M, s에서 cm, us 로 변경하게 되면...
// 100 / 1000000 ( 1M : 100 cm / 1 s : 1000000 us )
// 즉, 1 / 10000 비율이 나오므로
// 340 / 10000 이 1 us당 이동 거리 cm 이다.
// 여기다가 왕복거리이므로 2로 나눠준다. (340 / 10000) / 2
// 0.017 , 즉, 1 us 0.017 cm 이동하는 속도가 계산된다.

float a = (float) (340.0 / 10000) / 2;

// v = d / t;
// d = v * t;
distance = ((float)(a * duration) );

// float b = (float) (1.0 / a); // 58.82
// distance = ((float)( duration / b ) );
printf("Duration: %f Distance: %f cm \n", duration, distance);

delay( 1000 );

}