본문 바로가기
project/2020.12-02 (라즈베리파이) 눈으로운전하는휠체어

초음파센서 ultrasonic sensor + LED + buzzer(tone 함수)

by sj0020 2020. 9. 18.

 

https://blog.naver.com/ann_arbor/221361752643

 

아두이노 기초 - 초음파 센서 사용하기 (pulseIn 함수)

[2017. 8. 15 작성]최근 pulseIn 함수를 찾아 볼 일이 있었는데 또 필요할 때가 있을것 같아 정리해 둔다....

blog.naver.com

거리 : float 형이나 long 형으로 선언

 

//초음파 센서의 핀번호를 설정한다.
int echoPin = 2;
int trigPin = 3;
int buzzer = 6;
void setup() {
  Serial.begin(9600);
  // trig를 출력모드로 설정, echo를 입력모드로 설정
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(buzzer, OUTPUT);

  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  
}

void loop() {

  
  // 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
    digitalWrite(trigPin, LOW);
    digitalWrite(echoPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

  
  // echoPin 이 HIGH를 유지한 시간을 저장 한다.
    unsigned long duration = pulseIn(echoPin, HIGH); 
  // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
  float distance = ((float)(340 * duration) / 10000) / 2;  
  
  Serial.print(distance);
  Serial.println("cm");
  // 수정한 값을 출력
  if(distance <=30) {
    analogWrite(buzzer, 1);
  }
  
  else  {
    analogWrite(buzzer, LOW);
  }
  delay(500);
}

 

 

 

tone(pin, frequency)

tone(pin, frequency, duration)

 

pin : 파형을 출력할 핀 번호 

 frequency : 출력할 파형의 주파수(Hz 단위)

 duration : 출력 시간(밀리초 단위). 지정하지 않으면 noTone() 함수가 호출될 때까지 출력됨.

 

 

tone() 함수에는 아두이노의 모든 핀을 사용할 수 있다. frequency 값은 31 이하로는 설정할 수 없고, frequency 변수의 타입이 unsigned int 형이라 최대 65535Hz까지밖에 설정할 수 없다. , 이만큼 크게는 실제로 써 본 적이 없어서 정확한 주파수가 나올 지 모르겠지만, 나오니까 unsigned int 형으로 정해뒀겠지?

//초음파 센서의 핀번호를 설정한다.
int echoPin = 2;
int trigPin = 3;
int buzzer = 6;
void setup() {
  Serial.begin(9600);
  // trig를 출력모드로 설정, echo를 입력모드로 설정
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(buzzer, OUTPUT);

  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  
}

void loop() {

  
  // 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
    digitalWrite(trigPin, LOW);
    digitalWrite(echoPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

  
  // echoPin 이 HIGH를 유지한 시간을 저장 한다.
    unsigned long duration = pulseIn(echoPin, HIGH); 
  // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
  float distance = ((float)(340 * duration) / 10000) / 2;  
  
  Serial.print(distance);
  Serial.println("cm");
  // 수정한 값을 출력
  if(distance <=20 && distance >=15) {
    digitalWrite(8, HIGH);
    tone(buzzer, 500, 10);   
  }
  else if(distance <=14 && distance >=10) {
    digitalWrite(9, HIGH);
    tone(buzzer, 500, 200);     
  }
  
  else if(distance <=9 && distance >=5) {
    digitalWrite(10, HIGH);
    tone(buzzer, 500, 400);  
  }
  
  else if(distance <=4 && distance >=0) {
    digitalWrite(11, HIGH);
    analogWrite(buzzer, 5);    
  }
  
  else  {
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    analogWrite(buzzer, LOW);
    
  }
  delay(500);
}

duration 차이에 따라 큰 차이 못 느끼겠음..


millis() 함수 사용

//초음파 센서의 핀번호를 설정한다.
int echoPin = 12;
int trigPin = 13;
int go = 6;
unsigned long previousMillis = 0; //이전시간
const long delayTime = 500; //0.5초 대기시간
const long delayTime1 = 50;
boolean goState = false;
void sound1() {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= delayTime){ //0.5초 시간이 흘렀는지 체크
    previousMillis = currentMillis; //0.5초가 지나 참임으로 0.5초 지난 현재시간을 이전시간에 저장
    goState=!goState;   //if문이 참이니깐 0.5초 단위로 ledState 값을 반전시키면 0.5초 단위로 참/거짓됨.
    digitalWrite(6, goState);   //참(5V) or 거짓(0V) 
}
}
void sound2() {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= delayTime1){ //0.5초 시간이 흘렀는지 체크
  previousMillis = currentMillis; //0.5초가 지나 참임으로 0.5초 지난 현재시간을 이전시간에 저장
  goState=!goState;   //0.5초 if문이 참이니깐 0.5초 단위로 ledState 값을 반전시키면 0.5초 단위로 참/거짓됨.
  digitalWrite(6, goState);   //참(5V) or 거짓(0V) 
}
}
void sound3() {
  analogWrite(go,255);
}
void setup() {
  Serial.begin(9600);
  // trig를 출력모드로 설정, echo를 입력모드로 설정
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(go, OUTPUT);
}
void loop() {  
  // 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
    digitalWrite(trigPin, LOW);
    digitalWrite(echoPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    // echoPin 이 HIGH를 유지한 시간을 저장 한다.
    unsigned long duration = pulseIn(echoPin, HIGH); 
  // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
  float distance = ((float)(340 * duration) / 10000) / 2;  
    Serial.print(distance);
  Serial.println("cm");
  // 수정한 값을 출력
  if ((distance <=30)&&(distance>20) ) {
    sound1();
  }
  else if ((distance <=20)&&(distance>10)){
    sound2();
  }
  else if ((distance <=10)&&(distance>0)) {
    sound3();
  }
  else {
  (noTone(go));
  }
}

'project > 2020.12-02 (라즈베리파이) 눈으로운전하는휠체어' 카테고리의 다른 글

라즈베리파이 웹캠 연결  (0) 2020.12.24
rc카 조립  (0) 2020.12.23
opencv 설치  (0) 2020.12.20
웹캠으로 눈동자 인식  (0) 2020.12.20
라즈베리파이 프로젝트 일정  (0) 2020.11.30