초음파 센서
초음파 센서
초음파 센서
초음파를 이용하여 벽이나 사물의 거리를 측정하는 센서
HC-SR04 모듈
- Vcc: 전원
- Trig : 트리거 (초음파 송출 제어)
- Echo : 에코(초음파 수신)
- GND: 접지
초음파센서 사용하기
초음파 센서 동작 원리
- Trig에 HIGH 전압 인가시 초음파 발사
- Echo에서 초음파 수신(처음에는 LOW)
- 시간차이를 측정하여 거리 계산


거리 계산
음속 : 340 m/s
비례식
- 1,000,000 us : 34,000 cm = x us : y cm
- y = 34,000*x/1,000,000 = 0.034*x cm
왕복 반영
- y = 0.034*x/2 = 0.017 *x cm = x/58 cm
delayMicroseconds()
아두이노 보드를 일정 시간 멈추는 함수입니다.
delayMicroseoonds(멈출 시간)
매개변수
- 멈출 시간: 단위는 마이크로초로 (0.000001초)
반환 값
- 없음
사용 예
delayMicroseconds(2);
// 아두이노 보드를 0.002 밀리초(0.000002초) 멈춥니다.
pulseln()
디지털 입력 핀의 전압이 LOW 또는 HIGH가 될 때까지 걸린 시간 측정
핀은 꼭 pinMode 함수를 이용해 입력 모드로 설정
pulseln(핀 번호,전압)
- 매개변수
- 핀 번호: 전압이 바뀌는 시간을 재고자 하는 핀 번호
- 전압: 바뀌는 전압. HIGH - LOW에서 HIGH가 될 때
- 매개변수
반환값
- 전압이 바뀌는 데 걸린 시간을 마이크로초 기준으로 반환
- 만약 1초 동안 기다렸는데도 전압이 바뀌지 않으면 0을 반환
사용 예
long duration = pulseln(3, HIGH);
//3번 핀의 전압이 HIGH가 될 때까지 걸린 시간

초음파 센서 거리 측정
int echoPin = 2;
int triggerPin = 3;
void setup() {
Serial.begin(9600);
pinMode(echoPin, INPUT); // 수신
pinMode(triggerPin, OUTPUT); // 출력
}
void loop() {
// trigger 핀으로 10us의 펄스를 발생
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10); // HIGH의 폭이 10㎲
digitalWrite(triggerPin, LOW);
// echo 핀 입력으로부터 거리를 cm 단위로 계산
int distance = pulseIn(echoPin, HIGH) / 58; // 시간 측정 후 /58해서 거리를 알 수 있다.
Serial.println("Distance(cm) = " + String(distance));
delay(1000);
}
초음파 센서 거리 측정 LCD (MiniCom.h)
#include <MiniCom.h>
MiniCom com;
int echoPin = 2;
int triggerPin = 3;
void checkDistance() {
// trigger 핀으로 10us의 펄스를 발생
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10); // HIGH의 폭이 10㎲
digitalWrite(triggerPin, LOW);
// echo 핀 입력으로부터 거리를 cm 단위로 계산
int distance = pulseIn(echoPin, HIGH) / 58;
com.print(0, "distance", distance);
}
void setup() {
com.init();
pinMode(echoPin, INPUT); // 수신
pinMode(triggerPin, OUTPUT); // 출력
com.setInterval(1000, checkDistance);
}
void loop() {
com.run();
}
초음파 센서 객체
Ultra.h
#pragma once
#include <Arduino.h>
class Ultra {
protected:
int echo;
int trig;
public:
Ultra(int echo, int trig);
int read();
};
Ultra.cpp
#include "Ultra.h"
Ultra::Ultra(int echo, int trig) : echo(echo), trig(trig) {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
}
int Ultra::read() {
// trigger 핀으로 10us의 펄스를 발생
digitalWrite(trig, HIGH);
delayMicroseconds(10); // HIGH의 폭이 10㎲
digitalWrite(trig, LOW);
// echo 핀 입력으로부터 거리를 cm 단위로 계산
int distance = pulseIn(echo, HIGH) / 58;
return distance;
}
app.ino
#include <MiniCom.h>
#include "Ultra.h"
MiniCom com;
Ultra ultra(2, 3);
void checkDistance() {
int distance = ultra.read();
com.print(0, "distance", distance);
}
void setup() {
com.init();
com.setInterval(1000, checkDistance);
}
void loop() {
com.run();
}
초음파 센서 - 거리 측정 후 LED, 부저 켜기
LED, 부저 병렬로 한 라인에 연결
#include <MiniCom.h>
#include <Ultra.h>
#include <Led.h>
MiniCom com;
Ultra ultra(2, 3);
Led led(5);
void checkDistance() {
int distance = ultra.read();
com.print(0, "distance", distance);
if(distance < 10) {
led.on();
} else {
led.off();
}
}
void setup() {
com.init();
com.setInterval(1000, checkDistance);
}
void loop() {
com.run();
}
초음파 센서 - 거리 측정 후 LED, 부저, 서보모토 켜기
#include <MiniCom.h>
#include <Servo.h>
#include <Ultra.h>
#include <Led.h>
MiniCom com;
Ultra ultra(2, 3);
Led led(5);
Servo servo;
void checkDistance() {
int distance = ultra.read();
com.print(0, "distance", distance);
if(distance < 10) {
led.on();
servo.write(90);
} else {
led.off();
servo.write(0);
}
}
void setup() {
com.init();
servo.attach(9);
servo.write(0);
com.setInterval(1000, checkDistance);
}
void loop() {
com.run();
}
Pulse 클래스 만들기
Pulse.h
#pragma once
#include <Arduino.h>
typedef void (*pulse_callback_t)(int);
class Pulse {
protected:
int onDelay; // HIGH 시간
int offDelay; // LOW 시간
int value; // 현재 상태값 (H/L)
unsigned long oldTime; // 최근 상태 변경 시점 기록
bool state; // 펄스의 운영 여부
pulse_callback_t callback;
public:
Pulse(int onDelay, int offDelay);
void setDelay(int onDelay, int offDelay);
void run();
int read() { return value; }
bool getState() { return state; }
void play();
void stop();
void setCallback(pulse_callback_t callback)
{this->callback = callback;}
};
Pulse.cpp
#include "Pulse.h"
Pulse::Pulse(int onDelay, int offDelay)
: onDelay(onDelay), offDelay(offDelay) {
value = HIGH;
state = false; // 시작은 운영 안함
callback = NULL;
oldTime = millis();
}
void Pulse::setDelay(int onDelay, int offDelay) {
this->onDelay = onDelay;
this->offDelay = offDelay;
}
void Pulse::play() {
state = true;
value = HIGH;
oldTime = millis();
}
void Pulse::stop() {
state = false;
value = LOW;
}
void Pulse::run() {
if(!state) return;
unsigned long currentTime = millis();
unsigned long diff = currentTime - oldTime;
long interval = value ? onDelay : offDelay;
if(diff >= interval) {
oldTime = currentTime;
value = !value;
if(callback!=NULL) {
callback(value);
}
}
}
자동차 후방 감지기 만들기
LED 신호 Low의 길이를 distance와 비례하게 한다.
app.ino
#include <MiniCom.h>
#include <Servo.h>
#include <Ultra.h>
#include "Pulse.h"
#include <Led.h>
MiniCom com;
Ultra ultra(2, 3);
Led led(5);
Servo servo;
Pulse pulse(100, 500);
// 5단계로 운용
int delaytimes[] = {
50, 100, 200, 500, 1000
};
void pulseCallback(int value) {
// LED 제어
led.set(value);
}
void checkDistance() {
int distance = ultra.read();
com.print(0, "distance", distance);
if(distance < 10) {
// led.on();
// Pulse의 offDelay를 distance를 고려하여 조정
int offDelay = map(distance, 0, 9, 0, 4);
pulse.setDelay(10, delaytimes[offDelay]);
servo.write(90);
if(!pulse.getState()) { // 처음 10cm 이하로 됐을 때
pulse.play();
}
} else {
if(pulse.getState()) {
pulse.stop();
}
// led.off();
servo.write(0);
}
}
void setup() {
com.init();
servo.attach(9);
servo.write(0);
pulse.setCallback(pulseCallback);
com.setInterval(1000, checkDistance);
}
void loop() {
com.run();
pulse.run();
}
'IoT 디바이스 활용 > Arduino' 카테고리의 다른 글
Arduino - WIFI - ESP8266 - AT 명령 (0) | 2020.10.16 |
---|---|
Arduino - 미세먼지 센서 (0) | 2020.10.15 |
Arduino - DHT11 (MiniCom.h) (0) | 2020.10.15 |
Arduino - 조도 센서 (0) | 2020.10.15 |
Arduino - 조이스틱 (Button.h 변경, joystick.h) (0) | 2020.10.15 |
댓글