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) | ツッコむ ]
#2 [nitijyou] 自転車で買い物に
100円ショップのSeriaで売ってるUSB充電ケーブルが意外にイイ感じ、という話がなんだか気になってきたので、電動自転車で近所のSeriaまで探しに行ってみたり。田舎だし、売り場面積が小さいお店しかないから、どうせ売ってないだろ…。と思ったらフツーに店頭にあった。ありがたや。たしかに、「2Aまで充電可能」的な文がパッケージに書いてある。とりあえず購入。
単3電池 x 2本で携帯電話(スマホに非ず)を充電できる、USB charger なるものも店頭にあって、少し気になった。おそらく中に昇圧回路が入ってて、3Vを5Vぐらいにして出力してくれるのだろうけど。ソレをモータ用の外部電源として使うのは…厳しいかな…。厳しいだろうな…。安定した出力にならないという実測結果をどこかで見かけた記憶もあるし。ということで今回は買わないことに。
ヨークベニマルで夜食その他を購入。
単3電池 x 2本で携帯電話(スマホに非ず)を充電できる、USB charger なるものも店頭にあって、少し気になった。おそらく中に昇圧回路が入ってて、3Vを5Vぐらいにして出力してくれるのだろうけど。ソレをモータ用の外部電源として使うのは…厳しいかな…。厳しいだろうな…。安定した出力にならないという実測結果をどこかで見かけた記憶もあるし。ということで今回は買わないことに。
ヨークベニマルで夜食その他を購入。
[ ツッコむ ]
以上、1 日分です。
使って、音を出すことができました!
素敵な記事をありがとうございます。