0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberry Pi 3 で圧電スピーカーを使って聴力検査

0
Last updated at Posted at 2026-08-02

プロローグ

聴力検査がやりたかったわけではない。
本当はもっとこういろんなメロディを奏でたりしたかったのだが、
どうにもこうにも耳をぎりぎり近づけてやっとか細い音が微かに聞こえる程度にしかなならない。

回路

SunFounderのチュートリアルを参考にPNPトランジスタを組み込む。
圧電スピーカーはPKM13EPYH4000-A0を使用。

buzzer.png

ソースコード (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が聞こえにくい。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?