아두이노 아날로그 센서(4) 초음파센서

2022. 1. 9. 21:16아두이노

초음파 : 가청주파수보다 높은 주파의 음파

높은 주파수 특징 : 에너지↑ ,  전달 거리 ↑,  감쇠 ↓

이를 이용해 수심을 재는 초음파 측정기, 어근 탐지기  또는 물체의 거리를 측정하는 계측기에 활용

 

 

초음파 센서 

 

VCC  5V
Trigger 펄스 입력(디지털핀)
Echo 펄스 출력(디지털핀)
GND GND

초음파 센서 HC-SR04  특징

1.40KHz의 주파수 사용

2.입력전압 5V

3.측정거리: 2cm~4M

4.측정해상도: 3mm

 

 

동작원리

VCC를통해 5V 인가

->Trig에서 10Us의 펄스 발생 

->반사된 거리에 따라 150Us~~ 25ms의 Echo에 펄스 발생 

->   Trig 펄스 발생 과 검출 펄스 발생 시간(t)로 거리측정 or  Echo의 펄스 시간 측정

 

 

거리계산 : 초음파 측정은 음파가 갔다가 반사되어 되돌아온 시간을 측정.  실제거리의 2배

 

2L=시간 X 속력

이 때 속력 Vs=331.5 + 0.607 x T  이며    T는 온도다.  일반적으로 14C'에서 음파의 속도는 340m/s이다.

 

 

 

실습 :    초음파를 이용해 거리를 측정해 보세요.   (온습도센서는 다음 실습 때)

더보기
더보기
int trig_pin = 7;  // trig 핀을 아두이노의 7번핀에 연결
int echo_pin = 6; // echo 핀을 아두이노의 6번핀에 연결

void setup() {
  Serial.begin(9600); // 시리얼 통신 시작
  

  pinMode(trig_pin, OUTPUT);  // trig_pin은 아두이노의 신호를 받으므로 출력모드로 설정
  pinMode(echo_pin, INPUT);   // echo_pin은 아두이노에 신호를 주므로 입력모드
}
void loop() {  
  
    digitalWrite(trig_pin, LOW);  //발사하기전엔 LOW
    digitalWrite(echo_pin, LOW);   //발사하기전엔 LOW
    delayMicroseconds(2);
    digitalWrite(trig_pin, HIGH);  //5V-> 초음파 발사 
    delayMicroseconds(10);        // 10microseconds동안 
    digitalWrite(trig_pin, LOW);   // 발사 끝 

  unsigned long duration = pulseIn(echo_pin, HIGH);    
  // pulseIn함수는 echo_pin의 HIGH가 유지된  시간을 리턴 
  
  float distance = ((float)(340 * duration) / 10000) / 2;  
  //거리계산  음속 340m/s, 시간= micro는 100만분의 1,    
  
  
  Serial.print(distance);
  Serial.println("cm");
  // 거리를 출력
  delay(500);
}

 

 

 

 

 

 

 

 

 

 

 

참고 : 온습도 연결 

VCC 5V
GND GND
아날로그 핀 DATA

문제  : 온습도 센서에서 온도를 이용해  좀 더 정확한 거리를 구하시오.

더보기
더보기
#include <DHT.h>
#define DATAPIN A1 //DHT11 Datapin Number
DHT myDHT11(DATAPIN, DHT11);   //DHT 중에서 우리 모듈인 DHT11 


int trig_pin = 7;  // trig 핀을 아두이노의 7번핀에 연결
int echo_pin = 6; // echo 핀을 아두이노의 6번핀에 연결

void setup() {
  Serial.begin(9600); // 시리얼 통신 시작
  pinMode(trig_pin, OUTPUT);  // trig_pin은 아두이노의 신호를 받으므로 출력모드로 설정
  pinMode(echo_pin, INPUT);   // echo_pin은 아두이노에 신호를 주므로 입력모드
  myDHT11.begin();
  
}
float fTempC;
void loop() {  
  fTempC = myDHT11.readTemperature(false);  //섭씨 
    digitalWrite(trig_pin, LOW);  //발사하기전엔 LOW
    digitalWrite(echo_pin, LOW);   //발사하기전엔 LOW
    delayMicroseconds(2);
    digitalWrite(trig_pin, HIGH);  //5V-> 초음파 발사 
    delayMicroseconds(10);        // 10microseconds동안 
    digitalWrite(trig_pin, LOW);   // 발사 끝 

  unsigned long duration = pulseIn(echo_pin, HIGH);    
  // pulseIn함수는 echo_pin의 HIGH가 유지된  시간을 리턴 
  
  float distance = ((float)((331.5 + 0.607*fTempC ) * duration) / 10000) / 2;  
  //거리계산  음속 340m/s, 시간= micro는 100만분의 1,    
  
  
  Serial.print(distance);
  Serial.print("cm            ");
  Serial.print(fTempC);
  Serial.println("C");
  // 거리를 출력
  delay(500);
}

 

 

 

 

 

 

 

 

 

 

 

문제 :  https://www.youtube.com/watch?v=sTM7XYAfL7c 

led대신 피에조부저를 사용해서   도레미파솔라시도가 울리게 해보세요

(근데 HC-SR04자체가 워낙 부정확해서 정확하게 도레미파솔라시도를 만들기는 힘듭니다.)

더보기
더보기

#define piezo 0
int trig_pin = 7;  // trig 핀을 아두이노의 7번핀에 연결
int echo_pin = 6; // echo 핀을 아두이노의 6번핀에 연결

void setup() {
  Serial.begin(9600); // 시리얼 통신 시작
  pinMode(trig_pin, OUTPUT);  // trig_pin은 아두이노의 신호를 받으므로 출력모드로 설정
  pinMode(echo_pin, INPUT);   // echo_pin은 아두이노에 신호를 주므로 입력모드
  pinMode(piezo,OUTPUT);
  
  
}


float tones[]={262,293,329,349,392,440,493,523};

void loop() {  
    digitalWrite(trig_pin, LOW);  //발사하기전엔 LOW
    digitalWrite(echo_pin, LOW);   //발사하기전엔 LOW
    delayMicroseconds(2);
    digitalWrite(trig_pin, HIGH);  //5V-> 초음파 발사 
    delayMicroseconds(10);        // 10microseconds동안 
    digitalWrite(trig_pin, LOW);   // 발사 끝 

  unsigned long duration = pulseIn(echo_pin, HIGH);    
  // pulseIn함수는 echo_pin의 HIGH가 유지된  시간을 리턴 
  
   float distance = ((float)(340 * duration) / 10000) / 2;
  //거리계산  음속 340m/s, 시간= micro는 100만분의 1,    
  
  
  Serial.print(distance);
  Serial.println("cm            ");
  // 거리를 출력
  switch((int)distance/5){  
    case 0 : 
      tone(piezo,tones[0]); //도
      break;
    case 1 : 
      tone(piezo,tones[1]); //레
      break;
    case 2 : 
      tone(piezo,tones[2]); //미
      break;
    case 3 : 
      tone(piezo,tones[3]); //파
      break;
    case 4 : 
      tone(piezo,tones[4]); //솔
      break;
    case 5 : 
      tone(piezo,tones[5]); //라
      break;
    case 6 : 
      tone(piezo,tones[6]); //시
      break;
    case 7 : 
      tone(piezo,tones[7]); //높은 도
      break;
  }

  
  delay(1000);
  noTone(piezo);
}