초음파 : 가청주파수보다 높은 주파의 음파
높은 주파수 특징 : 에너지↑ , 전달 거리 ↑, 감쇠 ↓
이를 이용해 수심을 재는 초음파 측정기, 어근 탐지기 또는 물체의 거리를 측정하는 계측기에 활용
초음파 센서
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);
}