아두이노

아두이노를 이용한 자동차 후방 센서 구현 : 초음파 거리센서+LED+피에조

디다새 2021. 5. 16. 20:27

회로구성

초음파 거리센서 + LED + 피에조

 

동작 요구사항

아두이노에 전원이 인가되면 LED피에조는 꺼져있는 상태이다.

초음파 센서로 거리를 측정하여 일정 거리 임계값보다 작으면 LED에 불이 들어오고, 피에조에서 소리가 발생한다.

측정 거리가 임계값보다 커지면 LED피에조 소리는 꺼진다.

자동차 후방 센서 (3단계 경보)

 

피에조(piezo)

피에조는 압전 물질에 얇은 판을 대어 압전 효과에 의해 소리가 나도록 한 소자

압전물질 : 압력을 가하면 전위차가 발생하거나 반대로 전압을 인가하면 물리적 변위가 생기는 물질

압전효과 : 압력을 가했을 때 전압이 발생되거나, 전압을 가했을 때 압력(신장, 응축)이 생기는 효과

 

초음파 거리 센서(ultrasonic sensor)

초음파

인간이 들을 수 있는 가청 주파수(20Hz~20kHz)의 최대 한계 범위를 넘어서는 주파수를 갖는 주기적인 음압(sound pressure)

응용분야 : 소나(sonar), 의료 초음파, 초음파 거리 탐사, 비파괴검사, 초음파 세척기

 

초음파 센서

펄스 송신부에서 펄스를 보낸 뒤 반사파가 수신부에 도달하는 시간으로 거리 측정

초음파 센서

 

동작 원리

 

초음파 센서 종류

 

초음파 센서 거리 측정

 

     물체와의 거리(D)[m] = 음속(V)[m/s] x 시간(t)[s] = (331.5 + 0.60714 x T) x (t/2)

여기서, T는 현재 온도, Output echo pulse는 거리를 왕복하는 시간이므로 실제 거리에 대한 시간은 Output echo pulse1/2이다.

 

데이터 시트

  1. 30도 각도 안에서 최적의 성능을 보임
  2. Trigger핀으로 최소 10us의 펄스를 입력하면 Trigger 소자에서 8 개의 40kHz 펄스를 출력
  3. Echo 소자로 반사파가 입력되면 Echo핀으로 거리에 비례하는 펄스파를 출력

 

 

초음파 센서 HC-SR04

• 동작전압 5V / 발생주파수 40kHz / 측정거리 2~400cm

• Key Code


int Trig = DP1, Echo = DP2;
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
unsigned long t = pulseIn(Echo, HIGH);  //us

 

HC-SR04

 

초음파 센서 Parallax #28015

• 동작전압 5V / 측정거리 3.3m이하 / SIG 핀에 2㏀ 사용

Parallax #28015
확대해서 보세요.

 

• Key Code


int SIG = DP1;
pinMode(SIG, OUTPUT);
digitalWrite(SIG, LOW);
delay(1);  // >200us
digitalWrite(SIG, HIGH);
delayMicroseconds(10);
digitalWrite(SIG, LOW);
pinMode(SIG, INPUT);
unsigned long t = pulseIn(SIG, HIGH); //us

 

Key Code 설명

 

아두이노 제어 함수

데이터 직렬통신을 위한 함수

Serial.begin(), Serial.print(), Serial.println()

 

소리 관련 함수

tone(), noTone()

 

시간 측정 관련 함수

pulseIn() 

 

Serial

아두이노와 컴퓨터 또는 다른 디바이스와 직렬 통신을 위한 클래스

Uno, Nano, Mini Mega에서는 0번 핀과 1번 핀이 컴퓨터와 통신에 사용된다. 이 핀에 무엇이든 연결하면 보드 업로드 실패를 포함, 통신을 방해 할 수 있다.

아두이노 IED 환경의 내장 직렬 모니터를 사용하여 아두이노 보드와 통신 할 수 있다.

 

Serial.begin() 함수 사용법
Serial.print() / Serial.pirntln() 함수 사용법
tone() 함수 사용법
옥타브별 주파수
옥타브별 주파수
noTone() 함수 사용법
pulseIn() 함수 사용법

 

아두이노 시뮬레이션

전체코드


int led = 6;
int piezo = 12;
int sig = 3;
int freq = 440;   // A4(라)음

float T = 21;                // 온도 21(degree)
float V = 331.5 + 0.60714*T; // 음속(m/s)
unsigned long t = 0;         // 왕복시간(us)
float D = 0;                 // 거리(cm)

float Dth1 = 150;   // 1차 경고 임계거리(cm)
float Dth2 = 100;   // 2차 경고 임계거리(cm)
float Dth3 = 50;    // 3차 경고 임계거리(cm)


int ledFlag = 0;   // led on/off 상태 표현

unsigned long u28015()
{
  pinMode(sig, OUTPUT);
  digitalWrite(sig, LOW);
  delay(1);
  digitalWrite(sig, HIGH);
  delayMicroseconds(10);
  digitalWrite(sig, LOW);
  pinMode(sig, INPUT);
  
  return pulseIn(sig, HIGH);  // microsecond
}

void setup()
{
  Serial.begin(9600);
  pinMode(piezo, OUTPUT);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
}

void loop()
{
  t = (float)u28015();   // 초음파센서-물체간 왕복시간
  D = (V*t/10000)/2;  // m -> cm, us -> s로 단위 변환
  Serial.print("Distance : ");
  Serial.print(D);
  Serial.print("cm    (V : ");
  Serial.print(V);
  Serial.print("m/s, t : ");
  Serial.print(t);
  Serial.println("us)");
  
  if (D <= Dth3)
  {
    tone(piezo, freq);
    digitalWrite(led, HIGH);
  }
  else if (D <= Dth2)
  {
    tone(piezo, freq, 200);
    delay(200);
    digitalWrite(led, ledFlag);
    ledFlag = !ledFlag;  
  }
  else if (D <= Dth1)
  {
    tone(piezo, freq, 300);
    delay(300);
    digitalWrite(led, ledFlag);
    ledFlag = !ledFlag;  
  }
  else
  {
    noTone(piezo);
    digitalWrite(led, LOW);
  }
  
  delay(300); 
}

 

 

Tinkercad 시뮬레이션 결과

 

실제 구현

코드

시연 동영상