티스토리 뷰

Arduino

[Arduino] 적외선 전방 감지 + 부저

생각많은 소심남 2013. 5. 21. 00:34

어제 간단하게 적외선 센서를 이용해서 장애물이 있는지를 감지하는 예제를 진행해봤다.

2013/05/20 - [About Arduino] - [Arduino] 적외선 센서를 활용한 전방 감지


그런데 생각해보니까 이런 감지에 대한 Output은 LCD를 통해서만 주어진다. 사람이 항상 이 작은 lcd만을 바라볼 수는 없으므로 다른 방식의 피드백도 주어져야 할 것이다. 그래서 부품통을 찾아보니 사진과 같은 부저(buzzer)가 있길래 삽입해봤다.

 우리가 흔히 부저라고 알고 있는 것의 정식 명칭은 Piezo buzzer 이며, 말 그대로 자성에 따른 운동에너지를 활용해서 소리를 내는 원리(다른 말로 압전효과!)를 가진다. 이 조그마한 게 소리를 얼마나 낼 수 있을까 무시할 수도 있겠지만, 생각보다 많은 소리를 낸다. 앞에서 언급한 것처럼 운동에너지를 활용해서 소리를 내기 때문에 이 운동에너지의 량만 적절히 조절한다면 다양한 소리를 낼 수 있다. 보통 이를 구현하는 방식은 PWM을 사용하는게 기본이지만 아두이노 IDE에 내장되어 있는 pitches 라는 라이브러리를 활용하면 음계와 박자를 삽입해서 적절한 음악을 낼 수 있다. 



예제에서 제공하는 toneMelody 예제와 이전 포스트 예제를 적절히 조합해보았다.

#include <LiquidCrystal.h> 
#include "pitches.h" 

const int sensorPin = 7;
const int buzzerPin = 8;
const int threshold = 80;

LiquidCrystal lcd(12,11,5,4,3,2); 

int melody[] = { 
  NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4}; 

int noteDurations[] = { 
  4, 8, 8, 4,4,4,4,4 }; 

void setup(){ 
  lcd.begin(16,2); 
  pinMode(sensorPin,INPUT); 
} 

void loop(){ 
  lcd.clear(); 
   
  int value = digitalRead(sensorPin); 
   
  lcd.setCursor(0,0); 
  lcd.print("Detected: "); 
   
  if(value == 0){ 
    lcd.print("O"); 
    beep(); 
  } 
  else{ 
    lcd.print("X"); 
    //digitalWrite(buzzerPin,LOW); 
  } 

  delay(100); 
} 

void beep(){ 
   for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second  
    // divided by the note type. 
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. 
    int noteDuration = 1000/noteDurations[thisNote];
    tone(buzzerPin, melody[thisNote],noteDuration); 

    // to distinguish the notes, set a minimum time between them. 
    // the note's duration + 30% seems to work well: 
    int pauseBetweenNotes = noteDuration * 1.30; 
    delay(pauseBetweenNotes); 
    // stop the tone playing: 
    noTone(buzzerPin); 
  } 
}


동작 영상은 다음과 같다. 무슨 노래인지는 모르겠지만...



아무튼 이런식으로 buzzer와 적외선 센서를 활용하면 멋진 전방 감지기를 만들어낼 수 있다. 


PS : 감지가 안될 때에도 노래가 나오게끔 변경



댓글