개발자/라즈베리파이4

라즈베리파이 부저 제어

지구빵집 2022. 8. 29. 07:15
반응형

 

라즈베리파이 GPIO 포트를 이용하여 부저를 제어해보자. 부저(Buzzer)란 소리 신호 알림 장치이며, 비퍼(Beeper)라고도 불린다. 보통 전자석의 코일에 단속적으로 전류를 보내어 철판 조각을 진동시켜 소리를 발생하며, 기계, 전자기계, 압전 방식을 사용한다. 부저는 얼마만큼의 주파수를 전달해 주는가에 따라 출력되는 소리가 달라지며, 부저의 종류에 따라 주파수에 따른 소리의 높낮이를 가진다. 부저에 적절한 주파수의 신호를 공급하여 음계에 해당하는 소리가 나는 프로그램을 만들어보자.

 

부저 구동 회로

 

부저 구동 회로

  

부저는 전원과 NPN트랜지스터의 컬렉터 사이에서 부하역할을 할 수 있도록 직렬로 연결되어 있으며 트랜지스터의 베이스에 GPIO 제어신호를 연결하여 소리를 만들어 낼 수 있다.

 

GPIO신호를 논리 1로 만들면 트랜지스터의 베이스와 에미터 간 다이오드에 작은 전류가 흐르고 이 전류는 컬렉터에서 에미터로 큰 전류를 흐르게 만드는 트리거 역할을 한다.

 

전원과 컬렉터 사이에 전류가 흐르면 부저가 ON되어 소리가 나고 전류가 흐르지 않으면 소리가 끊어진다. 이 프로그램에서는 PWM을 이용하여 특정 주파수가 트랜지스터의 베이스에 공급되게 할 것이다.  

 

주파수에 따른 소리 음계는 아래 표를 참고한다.

계이름 주파수 계이름 주파수 계이름 주파수
261.625 523.25 1046.5
# 277.18 # 554.36 # 1108.72
293.665 587.33 1174.66
# 311.125 # 622.25 # 1244.5
329.63 659.26 1318.52
349.23 698.46 1396.92
# 369.995 # 739.99 # 1479.98
392 784 1568
# 415.3 # 930.6 # 1661.2
440 880 1760
# 466.1 # 932.2 # 1864.4
493.8 987.6 1975.2
        2093

 

라즈베리파이와 부저 연결도는 이미지를 참고한다.

 

부저 연결도

 부저 실습 전체 코드를 첨부하고 코드 설명을 추가한다.

 

//#include <stdio.h>
//#include <stdlib.h>
#include <wiringPi.h>
#include <softTone.h>

#define BUZZER_PIN	4

#define DO_L		523
#define RE			587
#define MI			659
#define FA			698
#define SOL			784
#define RA			880
#define SI			987
#define DO_H		1046

//int scale [8] = { 262, 294, 330, 349, 392, 440, 494, 525 };

unsigned int SevenScale (unsigned char scale)
{
	unsigned int _ret = 0;
	switch (scale)
	{
		case 0:
			_ret	=	DO_L;
//			system("aplay do.wav");
			break;
		case 1:
			_ret	=	RE;
//			system("aplay re.wav");
			break;
		case 2:
			_ret	=	MI;
//			system("aplay mi.wav");
			break;
		case 3:
			_ret	=	FA;
//			system("aplay pa.wav");
			break;
		case 4:
			_ret	=	SOL;
//			system("aplay sl.wav");
			break;
		case 5:
			_ret	=	RA;
//			system("aplay la.wav");
			break;
		case 6:
			_ret	=	SI;
//			system("aplay ti.wav");
			break;
		case 7:
			_ret	=	DO_H;
//			system("aplay do.wav");
			break;
	}
	return _ret;
}
void Change_FREQ(unsigned int freq)
{
	pwmWrite(BUZZER_PIN, freq);
	softToneWrite (BUZZER_PIN, freq);
}
void STOP_FREQ (void)
{
	softToneWrite (BUZZER_PIN, 0);
}
void Buzzer_Init (void)
{
	softToneCreate (BUZZER_PIN) ;
	STOP_FREQ();
}

int main (void)
{
	if(wiringPiSetupGpio() == -1)
		return 1;
		
//	printf("Buzzer operationg..\n");
	Buzzer_Init();
		
	int i;
	for(i=0; i < 8; i++) {
		Change_FREQ (SevenScale(i));
		delay(500);		
		STOP_FREQ();
	}

	while(1)
	{
	}
	return 0;
}

 

소스코드 설명

 

Program Source Description
#include <wiringPi.h> GPIO access library 헤더파일 선언
#include <softTone.h> Tone wave signal 관련 헤더파일 선언
#define BUZZER_PIN  4 Buzzer Pin 정의
#define DO_L  523
#define RE  587
#define MI  659
#define FA  698
#define SOL  784
#define RA  880
#define SI  987
#define DO_H  1046
7음계에서 각 음에 해당하는 주파수 값 정의
unsigned int SevenScale (unsigned char scale)
{
  unsigned int _ret = 0;
  switch (scale)
  {
  case 0:
  _ret  =  DO_L;
  break;
  case 1:
  _ret  =  RE;
  break;
  case 2:
  _ret  =  MI;
  break;
 
각 음계에 해당하는 주파수 값을 선택하는 함수
  case 3:
  _ret  =  FA;
  break;
  case 4:
  _ret  =  SOL;
  break;
  case 5:
  _ret  =  RA;
  break;
  case 6:
  _ret  =  SI;
  break;
  case 7:
  _ret  =  DO_H;
  break;
  }
  return _ret;
}
각 음계에 해당하는 주파수 값을 선택하는 함수
void Change_FREQ(unsigned int freq)
{
  pwmWrite(BUZZER_PIN, freq);
  softToneWrite (BUZZER_PIN, freq);
}
주파수를 변경하는 함수
void STOP_FREQ (void)
{
  softToneWrite (BUZZER_PIN, 0);
}
주파수 발생 정지 함수
void Buzzer_Init (void)
{
  softToneCreate (BUZZER_PIN) ;
  STOP_FREQ();
}
Buzzer 초기 설정
int main (void)
{
 
  if(wiringPiSetupGpio() == -1)
  return 1;
 
  Buzzer_Init(); Buzzer 초기화
  int i;  
  for(i=0; i < 8; i++) {
  Change_FREQ (SevenScale(i));
  delay(500);
  STOP_FREQ();
  }


각 음계에 해당하는 음 발생
500ms 지연
음 발생 정지
  while(1)
  {
  }
  return 0;
}
 

 

부저 실습코드 컴파일과 실행은 아래 명령을 사용한다.

 

컴파일 명령어 gcc o buzzer buzzer.c -lwiringPi 실행파일명을 buzzer설정하여 컴파일한다.
실행 sudo ./buzzer 프로그램을 실행한다.

 

buzzer.c를 컴파일하고 실행하면 0.5초 동안 각 계음이 발생하는 것을 확인할 수 있다.

 

softToneWrite (BUZZER_PIN, freq); 함수에 대해 구체적으로 알아보자. 그리고 softTone Create (BUZZER_PIN) ; 함수와의 연관성을 검토해보자. 키패드 모듈을 이용하여 PB1~PB8을 누르면 “도”에서 높은 “도” 음이 나오도록 설계하고 컴파일 한 다음 실행하여 결과를 확인해보자.  

 

 

 

 

반응형