라즈베리파이 수동부저 모듈사용하여 음악 연주하기
라즈베리파이에서 수동부저를 사용하여 음악을 연주하는 프로그램을 작성한다. 프로그래밍, 작성한다, 코딩을 한다, 프로그램를 짠다 라는 말들은 "컴퓨터가 이해할 수 있는 문서를 작성한다." 라는 말과 동일한 말이다.
일단 아래와 같이 아두이노에서 많이 사용하는 부저 스피커 모듈을 준비한다. 보통 3.3V 이상~ 5V 에서 동작하므로 라즈베리파이와 직접 연결해도 잘 동작한다.
위 센서모듈을 VCC-3.3V, 혹은 5V에 연결하고 GND는 GND에 연결한다. 스피커 입력 I/O 핀은 라즈베리파이 GPIO 이름이 GPIO.28이고, BCM 번호가 20 이고, 물리적인 핀 번호는 38번에 연결한다. 즉 wPi 핀번호 28번에 연결하라는 말이다. 그리을 아래에 나타낸다.
아래 테스트에 들어가기 전에 라즈베리파이에 "wiringPi 라이브러리"를 설치해야 하고, 라즈베리파이 GPIO 에 대해 약간은 알고 있어야 한다. 혹시 처음 여기에 들어온 사람은 아래 두개의 포스팅을 참고하면 좋겠고, 준비가 안되어 있어도 따라하면 된다. 실수를 통해 더욱 많은 것을 배울 수 있다는 사실은 만고불변의 진리다. 일단 오래 기억되니까 말이다.
라즈베리파이의 GPIO를 제어할 수 있는 wiringPi 라이브러리의 설치 방법 https://diymaker.tistory.com/56
Raspberry Pi GPIO 와 wiringPi 라이브러리 https://diymaker.tistory.com/57
아래 코드는 은하계 전쟁을 다룬 불멸의 SF 영화 스타워즈의 주제곡이다. 소스코드 파일네임은 starwars.c 로 하고 입력한다. 다음 곡은 슈퍼마리오 게임에서 나오는 곡이다.
'$'는 입력하지 말고 컴파일은
$gcc -o starwars starwars.c -l wiringPi
에러없이 컴파일이 되면 아래 명령어로 실행한다. 거칠지만 아름다운 띠~띠띠띠 소리가 난다.
$sudo ./starwars
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | #include <wiringPi.h> #include <stdio.h> //Pin 11 on Raspberry Pi corresponds to BCM GPIO 17 and wiringPi pin 0 #define BeepPin 28 //FREQUENCIES #define cL 129 #define cLS 139 #define dL 146 #define dLS 156 #define eL 163 #define fL 173 #define fLS 185 #define gL 194 #define gLS 207 #define aL 219 #define aLS 228 #define bL 232 #define c 261 #define cS 277 #define d 294 #define dS 311 #define e 329 #define f 349 #define fS 370 #define g 391 #define gS 415 #define a 440 #define aS 455 #define b 466 #define cH 523 #define cHS 554 #define dH 587 #define dHS 622 #define eH 659 #define fH 698 #define fHS 740 #define gH 784 #define gHS 830 #define aH 880 #define aHS 910 #define bH 933 //This function generates the square wave that makes the piezo speaker sound at a determinated frequency. void beep(unsigned int note, unsigned int duration) { //This is the semiperiod of each note. long beepDelay = (long)(1000000/note); //This is how much time we need to spend on the note. long time = (long)((duration*1000)/(beepDelay*2)); int i; for(i=0;i<time;i++) { //1st semiperiod digitalWrite(BeepPin, HIGH); delayMicroseconds(beepDelay); //2nd semiperiod digitalWrite(BeepPin, LOW); delayMicroseconds(beepDelay); } //Add a little delay to separate the single notes digitalWrite(BeepPin, LOW); delay(20); } //The source code of the Imperial March from Star Wars void play() { beep( a, 500); beep( a, 500); beep( f, 350); beep( cH, 150); beep( a, 500); beep( f, 350); beep( cH, 150); beep( a, 1000); beep( eH, 500); beep( eH, 500); beep( eH, 500); beep( fH, 350); beep( cH, 150); beep( gS, 500); beep( f, 350); beep( cH, 150); beep( a, 1000); beep( aH, 500); beep( a, 350); beep( a, 150); beep( aH, 500); beep( gHS, 250); beep( gH, 250); beep( fHS, 125); beep( fH, 125); beep( fHS, 250); delay(250); beep( aS, 250); beep( dHS, 500); beep( dH, 250); beep( cHS, 250); beep( cH, 125); beep( b, 125); beep( cH, 250); delay(250); beep( f, 125); beep( gS, 500); beep( f, 375); beep( a, 125); beep( cH, 500); beep( a, 375); beep( cH, 125); beep( eH, 1000); beep( aH, 500); beep( a, 350); beep( a, 150); beep( aH, 500); beep( gHS, 250); beep( gH, 250); beep( fHS, 125); beep( fH, 125); beep( fHS, 250); delay(250); beep( aS, 250); beep( dHS, 500); beep( dH, 250); beep( cHS, 250); beep( cH, 125); beep( b, 125); beep( cH, 250); delay(250); beep( f, 250); beep( gS, 500); beep( f, 375); beep( cH, 125); beep( a, 500); beep( f, 375); beep( c, 125); beep( a, 1000); } int main(void) { //Check wiringPi setup if(-1 == wiringPiSetup()) { printf("setup wiringPi failed!"); return 1; } //Prepare GPIO0 pinMode(BeepPin, OUTPUT); //Play the Imperial March play(); return 0; } | cs |
라즈베리파이와 하드웨어 연결은 동일하다. 다음 곡은 누구나 좋아하는 슈퍼마리오 게임에서 나오는 짧은 곡이다. 소스코드 파일 이름은 supermario.c
'$'는 입력하지 말고 컴파일은
$gcc -o supermario supermario.c -l wiringPi
에러없이 컴파일이 되면 아래 명령어로 실행한다. 거칠지만 아름다운 슈퍼마리오 시작음이 들린다.
$sudo ./supermario
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <stdio.h> #include <errno.h> #include <string.h> #include <wiringPi.h> #include <softTone.h> #define PIN 28 int scale [23] = { 659, 659, 0, 659, 0, 523, 659, 0, 784, 0,0,0, 392, 0,0,0, 523, 0,0, 392, 0,0,330 } ; int main () { int i ; wiringPiSetup () ; softToneCreate (PIN) ; for (i = 0 ; i < 23 ; ++i) { printf ("%3d\n", i) ; softToneWrite (PIN, scale [i]) ; delay (200) ; } } | cs |
'라즈베리파이' 카테고리의 다른 글
라즈베리파이3 B+ 에 대한 좋은 자료 (0) | 2019.01.18 |
---|---|
Raspberry Pi GPIO 와 wiringPi 라이브러리 (0) | 2018.11.22 |
라즈베리파이의 GPIO를 제어할 수 있는 wiringPi 라이브러리의 설치 방법 (0) | 2018.11.22 |
GPIO 충돌, I2C 사용할 때 GPIO와 충돌해결 - wire, w1_gpio, w1_therm (0) | 2018.11.22 |
라즈베리파이란? (0) | 2018.11.01 |