2016/07/22(金) [n年前の日記]
#1 [raspberrypi] Raspberry Pi3でブザーを制御
Raspberry Pi3 + Python + pigpio で、ブザー? 圧電スピーカ? なんて呼ぶのか分からんけど、ブザーっぽいものを鳴らしてみたり。PWM制御を使って周波数を設定してみる。
使ったブザーは、秋月電子で購入した、 _圧電スピーカー(圧電サウンダ) (13mm) PKM13EPYH4000-A0 。
回路図は以下。
GPIO 18番にブザーを接続。…最初、GPIO 24番に繋いで、 _set_PWM_frequency(user_gpio, frequency) で鳴らせないか実験してたけど、大雑把な周波数なら指定できるものの、人間の可聴域の周波数をそこそこちゃんと指定するのは難しいようで。ハードウェアでPWM制御ができるGPIO 18番に繋ぎなおして実験したらちゃんと音が鳴ってくれた。
ブザーをどう繋ぐかは、ググってみたけどちょっとよく分からず。いきなり GPIOピンとGNDに繋ぐ例もあったけど、抵抗を繋いでる例も見かけたので、今回は直列で1kΩの抵抗を入れてみたり。
使ったブザーは、秋月電子で購入した、 _圧電スピーカー(圧電サウンダ) (13mm) PKM13EPYH4000-A0 。
回路図は以下。
GPIO 18番にブザーを接続。…最初、GPIO 24番に繋いで、 _set_PWM_frequency(user_gpio, frequency) で鳴らせないか実験してたけど、大雑把な周波数なら指定できるものの、人間の可聴域の周波数をそこそこちゃんと指定するのは難しいようで。ハードウェアでPWM制御ができるGPIO 18番に繋ぎなおして実験したらちゃんと音が鳴ってくれた。
ブザーをどう繋ぐかは、ググってみたけどちょっとよく分からず。いきなり GPIOピンとGNDに繋ぐ例もあったけど、抵抗を繋いでる例も見かけたので、今回は直列で1kΩの抵抗を入れてみたり。
◎ 「ピポ」を鳴らすスクリプト。 :
buzzer_pigpio.py として保存。
pi1.hardware_PWM(GIPO番号, 周波数, dutycycle) で、ハードウェアを使ったPWMを設定。詳しくは、 _pigpio library の、 _hardware_PWM(gpio, PWMfreq, PWMduty) の項を参照。眺めた感じでは…。
使えるGPIOは4つ。
ひとまず、sudo python buzzer_pigpio.py で実行。
こんな音が鳴った。
PC-9801の起動音を再現してみたかったのだけど…。なんか違う…。以下の記事を参考にして、2000Hz → 1000Hz を鳴らしてみたつもりなのだけど…。
_新設計!98ピポ回路II
_国産名機PC-9801シリーズの起動音に関する質問です。 ピポッとな… - 人力検索はてな
_国民機起動音発生装置 PiPo Ver.4
#!/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+ は、話が違う…?)
ひとまず、sudo python buzzer_pigpio.py で実行。
こんな音が鳴った。
PC-9801の起動音を再現してみたかったのだけど…。なんか違う…。以下の記事を参考にして、2000Hz → 1000Hz を鳴らしてみたつもりなのだけど…。
_新設計!98ピポ回路II
_国産名機PC-9801シリーズの起動音に関する質問です。 ピポッとな… - 人力検索はてな
_国民機起動音発生装置 PiPo Ver.4
◎ ドレミっぽい音階を鳴らすスクリプト。 :
buzzer_pigpio_doremi.py として保存。
こんな音が鳴った。
一応音階というか、メロディーが鳴ってるように聞こえなくもない、かな…。
もうちょっと努力すれば _MML(Music Macro Language) を鳴らせるソレも作れなくもないだろうけど…。周波数も、 _音階の周波数を計算する方法とMIDIノート番号の関係 で計算式が紹介されてるし…。
しかしそもそも Raspberry Pi3にはサウンド機能が入ってるはずなので、あえてブザーを使って凝ったメロディーを鳴らす必要はないわけですが。
#!/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にはサウンド機能が入ってるはずなので、あえてブザーを使って凝ったメロディーを鳴らす必要はないわけですが。
この記事へのツッコミ
[ ツッコミを読む(1) | ツッコむ ]
以上です。
使って、音を出すことができました!
素敵な記事をありがとうございます。