mieki256's diary



2016/07/22(金) [n年前の日記]

#1 [raspberrypi] Raspberry Pi3でブザーを制御

Raspberry Pi3 + Python + pigpio で、ブザー? 圧電スピーカ? なんて呼ぶのか分からんけど、ブザーっぽいものを鳴らしてみたり。PWM制御を使って周波数を設定してみる。

使ったブザーは、秋月電子で購入した、 _圧電スピーカー(圧電サウンダ) (13mm) PKM13EPYH4000-A0

回路図は以下。

buzzer_01_bb.png

buzzer_01_c.png

buzzer_bb.jpg


GPIO 18番にブザーを接続。…最初、GPIO 24番に繋いで、 _set_PWM_frequency(user_gpio, frequency) で鳴らせないか実験してたけど、大雑把な周波数なら指定できるものの、人間の可聴域の周波数をそこそこちゃんと指定するのは難しいようで。ハードウェアでPWM制御ができるGPIO 18番に繋ぎなおして実験したらちゃんと音が鳴ってくれた。

ブザーをどう繋ぐかは、ググってみたけどちょっとよく分からず。いきなり GPIOピンとGNDに繋ぐ例もあったけど、抵抗を繋いでる例も見かけたので、今回は直列で1kΩの抵抗を入れてみたり。

「ピポ」を鳴らすスクリプト。 :

buzzer_pigpio.py として保存。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# buzzer control - pigpio PWM

import pigpio
import time

BUZZER_PIN = 18

pi1 = pigpio.pi()
pi1.set_mode(BUZZER_PIN, pigpio.OUTPUT)
pi1.hardware_PWM(BUZZER_PIN, 0, 0)

try:
    for v in [2000, 1000]:
        pi1.hardware_PWM(BUZZER_PIN, v, 500000)
        time.sleep(0.3)

except KeyboardInterrupt:
    pass

print "done."

# cleanup
pi1.hardware_PWM(BUZZER_PIN, 0, 0)
pi1.set_mode(BUZZER_PIN, pigpio.INPUT)
pi1.stop()

pi1.hardware_PWM(GIPO番号, 周波数, dutycycle) で、ハードウェアを使ったPWMを設定。詳しくは、 _pigpio library の、 _hardware_PWM(gpio, PWMfreq, PWMduty) の項を参照。眺めた感じでは…。

使えるGPIOは4つ。
12 PWM channel 0 All models but A and B
13 PWM channel 1 All models but A and B
18 PWM channel 0 All models
19 PWM channel 1 All models but A and B
  • 12と18は、PWMチャンネル 0 を共有。
  • 13と19は、PWMチャンネル 1 を共有。
  • 18は、Raspberry Pi 全モデルで使える。
  • 12,13,19は、Model A と Model B なら使える。(ということは Model A+ や Model B+ は、話が違う…?)
ということなのかなと。PWMのチャンネルが、0と1の2つ、というのが、どこかで見かけた「ハードウェアPWMは2つしか使えない」という話になるのだろうか。自信無いけど。

ひとまず、sudo python buzzer_pigpio.py で実行。

こんな音が鳴った。



PC-9801の起動音を再現してみたかったのだけど…。なんか違う…。以下の記事を参考にして、2000Hz → 1000Hz を鳴らしてみたつもりなのだけど…。

_新設計!98ピポ回路II
_国産名機PC-9801シリーズの起動音に関する質問です。 ピポッとな… - 人力検索はてな
_国民機起動音発生装置 PiPo Ver.4

ドレミっぽい音階を鳴らすスクリプト。 :

buzzer_pigpio_doremi.py として保存。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# buzzer control - pigpio PWM

import pigpio
import time
import re

BUZZER_PIN = 18
tm = 60.0 / 120.0 * 4
musical_scale = {
    "C":523, "C#":554, "D":587, "D#":622,
    "E":659, "F":698, "F#":740, "G":784,
    "G#":831, "A":880, "A#":932, "B":988
    }

pi1 = pigpio.pi()
pi1.set_mode(BUZZER_PIN, pigpio.OUTPUT)
pi1.hardware_PWM(BUZZER_PIN, 0, 0)

try:
    score = "C4D4E2C4D4E2C4D8E16F16G8A4B2"
    while len(score) > 0:
        m = re.match(r"^([A-Ga-g]+)([0-9]+)", score)
        if m:
            s = m.group(1)
            d = m.group(2)
            score = score.lstrip(s + d)
            freq = musical_scale[s]
            pi1.hardware_PWM(BUZZER_PIN, freq, 500000)
            print "%s : %d" % ((s + d), freq)
            time.sleep(tm / float(d))
        else:
            break

except KeyboardInterrupt:
    pass

# cleanup
print "done."
pi1.hardware_PWM(BUZZER_PIN, 0, 0)
pi1.set_mode(BUZZER_PIN, pigpio.INPUT)
pi1.stop()

こんな音が鳴った。



一応音階というか、メロディーが鳴ってるように聞こえなくもない、かな…。

もうちょっと努力すれば _MML(Music Macro Language) を鳴らせるソレも作れなくもないだろうけど…。周波数も、 _音階の周波数を計算する方法とMIDIノート番号の関係 で計算式が紹介されてるし…。

しかしそもそも Raspberry Pi3にはサウンド機能が入ってるはずなので、あえてブザーを使って凝ったメロディーを鳴らす必要はないわけですが。

以上です。

過去ログ表示

Prev - 2016/07 - Next
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

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project