プロローグ
聴力検査がやりたかったわけではない。
本当はもっとこういろんなメロディを奏でたりしたかったのだが、
どうにもこうにも耳をぎりぎり近づけてやっとか細い音が微かに聞こえる程度にしかなならない。
回路
SunFounderのチュートリアルを参考にPNPトランジスタを組み込む。
圧電スピーカーはPKM13EPYH4000-A0を使用。
ソースコード (softTone版)
3秒ごとに1,000Hzと4,000Hzを鳴らす。
WiringPiで決まった周波数を鳴らすにはSoftToneを使うのが便利。
buzzer_softTone.c
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <softTone.h>
#define BUZ_PIN_BCM 17
int main(void)
{
if (wiringPiSetupPinType(WPI_PIN_BCM) == -1) {
printf("wiringPiSetupGpio failed\n");
return EXIT_FAILURE;
}
if (softToneCreate(BUZ_PIN_BCM) != 0) {
printf("softToneCreate failed\n");
return EXIT_FAILURE;
}
while (1) {
softToneWrite(BUZ_PIN_BCM, 1000);
printf("1000Hz\n");
delay(3000);
softToneWrite(BUZ_PIN_BCM, 4000);
printf("4000Hz\n");
delay(3000);
}
return EXIT_SUCCESS;
}
聞こえない。。。
ソースコード (digitalWrite版)
digitalWriteでもできる。自前でパルスを作る。
buzzer_digitalWrite.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <wiringPi.h>
#define BUZ_PIN_BCM 17
volatile int g_freq = 1000; // 周波数(Hz)
void *buzzerThread(void *arg)
{
(void)arg;
while (1) {
int halfPeriod = 500000 / g_freq; // 半周期(μs)を計算
digitalWrite(BUZ_PIN_BCM, HIGH);
delayMicroseconds(halfPeriod);
digitalWrite(BUZ_PIN_BCM, LOW);
delayMicroseconds(halfPeriod);
}
return NULL;
}
int main(void)
{
if (wiringPiSetupPinType(WPI_PIN_BCM) == -1) {
printf("wiringPiSetupGpio failed\n");
return EXIT_FAILURE;
}
pinMode(BUZ_PIN_BCM, OUTPUT);
pthread_t tid;
if (pthread_create(&tid, NULL, buzzerThread, NULL) != 0) {
printf("pthread_create failed\n");
return EXIT_FAILURE;
}
while (1) {
g_freq = 1000;
printf("1000Hz\n");
delay(3000);
g_freq = 4000;
printf("4000Hz\n");
delay(3000);
}
return EXIT_SUCCESS;
}
やはりこの距離では聞こえない。。。
スマホの外付けマイクを圧電スピーカーにぎりぎりまで近づけてみたらようやく聞こえた。フラッシュ注意。
エピローグ
年寄りなので4,000Hzが聞こえにくい。
