본문 바로가기

개발자/라즈베리파이4

라즈베리파이 부저 제어

반응형

 

라즈베리파이 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을 누르면 “도”에서 높은 “도” 음이 나오도록 설계하고 컴파일 한 다음 실행하여 결과를 확인해보자.  

 

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩