라즈베리파이 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을 누르면 “도”에서 높은 “도” 음이 나오도록 설계하고 컴파일 한 다음 실행하여 결과를 확인해보자.
'개발자 > 라즈베리파이4' 카테고리의 다른 글
mysqli_real_connect(): (HY000/1045): Access denied for user 'phpmyadmin'@'localhost' (using password: YES) (1) | 2022.09.05 |
---|---|
라즈베리파이 i2c lcd display 제어 (1) | 2022.09.02 |
라즈베리파이 FND Flexible Numeric Display 제어 (4) | 2022.08.31 |
라즈베리파이 FAN 제어 실습 코드 (1) | 2022.08.30 |
라즈베리파이 음성 녹음 재생 모듈 (1) | 2022.08.26 |
Raspberry Pi PICO 사용 방법 (1) | 2022.08.02 |
라즈베리파이4 액츄에이터 7종 제어 C 언어 (0) | 2022.06.29 |
라즈베리파이4 led bar 실습 코드 (1) | 2022.06.27 |
더욱 좋은 정보를 제공하겠습니다.~ ^^