아두이노 우노 R4 초음파 센서

이 튜토리얼은 초음파 센서와 Arduino UNO R4를 사용하여 물체까지의 거리를 측정하는 방법을 가르쳐줍니다. 자세히 알아볼 내용은 다음과 같습니다:

아두이노 우노 R4 초음파 센서

준비물

1×Arduino UNO R4 WiFi or Arduino UNO R4 Minima
1×(또는) DIYables STEM V4 IoT, Compatible with Arduino Uno R4 WiFi 쿠팡 | 아마존
1×USB 케이블 타입-A to 타입-C (USB-A PC용) 쿠팡 | 아마존
1×USB 케이블 타입-C to 타입-C (USB-C PC용) 아마존
1×초음파 센서 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 우노 R4용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino UNO R4 쿠팡 | 아마존
1×(추천) 아두이노 우노 R4용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노 R4용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노 R4용 전원 분배기 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Arduino Uno R4 WiFi Compatible Boards

초음파 센서에 관하여

HC-SR04 초음파 센서는 소리 파동을 사용하여 물체까지의 거리를 측정합니다. 인간이 들을 수 없는 소리 파동을 보내고, 그 파동이 물체에 반사되어 돌아오는 에코를 듣습니다. 소리 파동이 돌아오는 데 걸리는 시간을 측정하여 센서는 물체가 얼마나 멀리 있는지를 계산할 수 있습니다.

핀아웃

초음파 센서 HC-SR04는 네 개의 핀이 있습니다:

  • VCC 핀: 이 핀을 VCC(5V)에 연결하세요.
  • GND 핀: 이 핀을 GND(0V)에 연결하세요.
  • TRIG 핀: 이 핀을 Arduino UNO R4에 연결하여 제어 신호(펄스)를 전송하세요.
  • ECHO 핀: 이 핀은 신호(펄스)를 Arduino UNO R4로 다시 보냅니다. Arduino UNO R4는 이러한 펄스의 지속 시간을 계산하여 거리를 결정합니다.
초음파 센서 핀아웃
image source: diyables.io

선연결

아두이노 우노 R4 초음파 센서 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

Arduino Uno R4와 기타 부품에 전원을 공급하는 가장 효과적인 방법을 확인하시려면, 아래 링크를 참조하세요: 아두이노 우노 R4 전원 공급 방법.

아두이노 UNO R4 코드

#define TRIG_PIN 9 // The Arduino UNO R4 pin connected to the ultrasonic sensor's TRIG pin #define ECHO_PIN 8 // The Arduino UNO R4 pin connected to the ultrasonic sensor's ECHO pin float duration_us, distance_cm; void setup() { // begin serial port Serial.begin (9600); // configure the trigger pin to output mode pinMode(TRIG_PIN, OUTPUT); // configure the echo pin to input mode pinMode(ECHO_PIN, INPUT); } void loop() { // generate 10-microsecond pulse to TRIG pin digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // measure duration of pulse from ECHO pin duration_us = pulseIn(ECHO_PIN, HIGH); // calculate the distance distance_cm = 0.017 * duration_us; // print the value to Serial Monitor Serial.print("distance: "); Serial.print(distance_cm); Serial.println(" cm"); delay(500); }

자세한 사용 방법

다음 지침을 단계별로 따르십시오:

  • Arduino Uno R4 WiFi/Minima를 처음 사용하는 경우, 아두이노 우노 R4 - 소프트웨어 설치에 대한 튜토리얼을 참조하십시오.
  • 제공된 다이어그램에 따라 구성 요소를 연결하십시오.
  • USB 케이블을 사용하여 Arduino Uno R4 보드를 컴퓨터에 연결하십시오.
  • 컴퓨터에서 Arduino IDE를 실행하십시오.
  • 적절한 Arduino Uno R4 보드(예: Arduino Uno R4 WiFi) 및 COM 포트를 선택하십시오.
  • 위의 코드를 복사하여 Arduino IDE로 엽니다.
  • Arduino IDE의 Upload 버튼을 클릭하여 코드를 Arduino UNO R4로 전송하십시오.
아두이노 ide - 코드 업로드 방법
  • 시리얼 모니터를 엽니다.
  • 초음파 센서 앞에서 손을 흔드세요.
  • 시리얼 모니터에서 손과 센서 간의 거리를 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
distance: 29.4 cm distance: 27.6 cm distance: 26.9 cm distance: 17.4 cm distance: 16.9 cm distance: 14.3 cm distance: 15.6 cm distance: 13.1 cm
Ln 11, Col 1
Arduino Uno R4 WiFi on COM15
2

코드 설명

설명은 위의 Arduino 코드 주석에 있습니다.

초음파 센서 거리 측정에서 노이즈를 필터링하는 방법

초음파 센서의 읽기 값에는 잡음이 포함되어 있습니다. 일부 경우에는 이 잡음이 데이터의 잘못된 작동을 초래할 수 있습니다. 우리는 이 방법을 사용하여 잡음을 제거할 수 있습니다:

  • 여러 번 측정하고 배열에 저장합니다.
  • 배열을 오름차순으로 정렬합니다.
  • 데이터에서 노이즈를 제거합니다:
    • 가장 작은 값들은 노이즈로 간주하여 무시합니다.
    • 가장 큰 값들은 노이즈로 간주하여 무시합니다.
    • 나머지 중간 값들을 사용하여 평균을 계산합니다.

    아래 코드 예제는 20개의 측정을 수행합니다.

    • 다섯 개의 가장 작은 샘플과 다섯 개의 가장 큰 샘플은 노이즈로 간주되어 무시됩니다. 5번째부터 14번째까지 10개의 중간 샘플의 평균을 계산합니다.
    /* * 이 아두이노 우노 R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 우노 R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-ultrasonic-sensor */ #define TRIG_PIN 9 // The Arduino UNO R4 pin connected to the ultrasonic sensor's TRIG pin #define ECHO_PIN 8 // The Arduino UNO R4 pin connected to the ultrasonic sensor's ECHO pin float filterArray[20]; // array to store data samples from sensor float distance; // store the distance from sensor void setup() { // begin serial port Serial.begin (9600); // configure the trigger and echo pins to output mode pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } void loop() { // 1. TAKING MULTIPLE MEASUREMENTS AND STORE IN AN ARRAY for (int sample = 0; sample < 20; sample++) { filterArray[sample] = ultrasonicMeasure(); delay(30); // to avoid untrasonic interfering } // 2. SORTING THE ARRAY IN ASCENDING ORDER for (int i = 0; i < 19; i++) { for (int j = i + 1; j < 20; j++) { if (filterArray[i] > filterArray[j]) { float swap = filterArray[i]; filterArray[i] = filterArray[j]; filterArray[j] = swap; } } } // 3. FILTERING NOISE // + the five smallest samples are considered as noise -> ignore it // + the five biggest samples are considered as noise -> ignore it // ---------------------------------------------------------------- // => get average of the 10 middle samples (from 5th to 14th) double sum = 0; for (int sample = 5; sample < 15; sample++) { sum += filterArray[sample]; } distance = sum / 10; // print the value to Serial Monitor Serial.print("distance: "); Serial.print(distance); Serial.println(" cm"); } float ultrasonicMeasure() { // generate 10-microsecond pulse to TRIG pin digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // measure duration of pulse from ECHO pin float duration_us = pulseIn(ECHO_PIN, HIGH); // calculate the distance float distance_cm = 0.017 * duration_us; return distance_cm; }

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

아래는 이 비디오에서 사용한 전체 코드입니다:

/* * 이 아두이노 우노 R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 우노 R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-ultrasonic-sensor */ /* * HC-SR04 + Traffic Light + Buzzer * Arduino UNO R4 */ // ================== HC-SR04 ================== #define TRIG_PIN 9 #define ECHO_PIN 8 // ================== Traffic Light ================== #define GREEN_LED 5 #define YELLOW_LED 6 #define RED_LED 7 // ================== Buzzer ================== #define BUZZER_PIN 10 float filterArray[20]; float distance; // =================================================== // Buzzer Functions // =================================================== void beep1() { digitalWrite(BUZZER_PIN, HIGH); delay(80); digitalWrite(BUZZER_PIN, LOW); } void beep2() { for (int i = 0; i < 2; i++) { digitalWrite(BUZZER_PIN, HIGH); delay(60); digitalWrite(BUZZER_PIN, LOW); delay(60); } } void beep3() { for (int i = 0; i < 3; i++) { digitalWrite(BUZZER_PIN, HIGH); delay(40); digitalWrite(BUZZER_PIN, LOW); delay(40); } } // =================================================== // Ultrasonic Measure // =================================================== float ultrasonicMeasure() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); float duration_us = pulseIn(ECHO_PIN, HIGH); float distance_cm = duration_us * 0.017; return distance_cm; } void setup() { Serial.begin(9600); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(GREEN_LED, OUTPUT); pinMode(YELLOW_LED, OUTPUT); pinMode(RED_LED, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); } void loop() { // =================================================== // 1. Read and Filter Distance // =================================================== for (int sample = 0; sample < 20; sample++) { filterArray[sample] = ultrasonicMeasure(); delay(30); } // Sort ascending for (int i = 0; i < 19; i++) { for (int j = i + 1; j < 20; j++) { if (filterArray[i] > filterArray[j]) { float temp = filterArray[i]; filterArray[i] = filterArray[j]; filterArray[j] = temp; } } } // Average middle 10 values double sum = 0; for (int sample = 5; sample < 15; sample++) { sum += filterArray[sample]; } distance = sum / 10.0; Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); // =================================================== // 2. Traffic Light + Buzzer // =================================================== if (distance > 16) { digitalWrite(GREEN_LED, LOW); digitalWrite(YELLOW_LED, LOW); digitalWrite(RED_LED, LOW); digitalWrite(BUZZER_PIN, LOW); delay(100); } else if (distance > 13) { // Green Warning digitalWrite(YELLOW_LED, LOW); digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, HIGH); beep1(); delay(720); digitalWrite(GREEN_LED, LOW); } else if (distance >= 8) { // Yellow Warning digitalWrite(GREEN_LED, LOW); digitalWrite(RED_LED, LOW); digitalWrite(YELLOW_LED, HIGH); beep2(); delay(380); digitalWrite(YELLOW_LED, LOW); } else { // Red Danger digitalWrite(GREEN_LED, LOW); digitalWrite(YELLOW_LED, LOW); digitalWrite(RED_LED, HIGH); beep3(); delay(180); digitalWrite(RED_LED, LOW); } }

아래는 Arduino UNO R4에서 초음파 센서를 사용하는 방법을 단계별로 보여주는 비디오 튜토리얼입니다:

초음파 센서 응용 프로그램

  • 충돌 방지
  • 충만 감지
  • 레벨 측정
  • 근접 감지