2024年11月10日日曜日

自作スピーカーと2.1chアンプでスピーカーシステムを組んでみる

これまでいろいろなスピーカーを作ってきましたが、はじめの頃に作った試作品はあまり使うこともないし邪魔なので処分してしまおうかとか、バラして使えそうな部品だけ取ってしまおうかとかと思いながら、しばらく思案しておりました。周波数分割器や2.1chアンプ(ZK-MT21YouTube動画)があるので、これらと組み合わせたらどんなものができあがるだろうかということが気になってしまい、とりあえずやってみることにしました。

着想のスタート地点は、以前の記事で紹介した(3番目のスピーカー=5cm,8Ω,0.5W)「低音すかすか」なスピーカーが「ツイーターとしてなら使えるのではないか」と思ったところでした。これに在庫しているスピーカーユニットを適当な箱に入れたものを組み合わせて2 Wayスピーカーのように組んでみてはどうかと思いました。さらに、これも以前の記事で紹介したサブウーファーを組み合わせて2.1chのスピーカーシステムにするという計画です。使用するスピーカーユニットは以下のとおりです。

  • Amazonuxcell←Amazonのストアページ)で購入した、詳細不明のフルレンジ(8Ω0.5W)を謳った薄っぺらいスピーカーユニット(2個1,100円税込)をツイーターとする。
  • 秋月電子通商の店舗で購入した、「F02408H2(8Ω10W)」という北日本音響製の広帯域用(フルレンジ)77mmスピーカーユニット(1個300円税込を2個)を中低音域用とする。
    #YouTubeでもよく取り上げられているコスパのよいスピーカーです。
  • Amazonで4,300円くらいで購入した、Dayton Audioの「TCP115-4(4Ω40W)」をサブウーファーとする。

2.1chのアンプ=ZK-MT21には、サブウファー用の出力は独立してありますが、左右のスピーカー出力は、それぞれ1つずつしかありません。ここに、Amazonで見つけた2 Wayスピーカー用の周波数分割器(クロスオーバーフィルター)をつないで高音と中低音に分割することにしました。Amazonの商品ページに書かれていた情報は、以下のとおりです。

周波数応答:48Hz〜20KHz
インピーダンス:4-8オーム
定格電力:80W

以前の記事で取り外し可能なエンクロージャーを作ったときに使ったものと同じ周波数分割器です。素性や詳しい仕様がよくわからないので具体的な商品紹介は控えます。

結論としては、「低音すかすか」スピーカーでもツイーターとしては使えそうだけれど、そこまで劇的に変化するほどの効果はなくて、高音の音の広がりをちょっとだけ足したい場合に追加するのもありかな程度と感じました。例えば、音域が広く音数の多いオーケストラのような楽曲を聴く場合には、あった方が良いかなと思いました。
#ツイーター専用を謳ったスピーカーユニットを使った場合は、どうなるのかを聴き比べたいところです。

#2.1chのアンプ=ZK-MT21(右側)からの出力を周波数分割器に入力して、Bassと Trebleに分割して、それぞれのスピーカーへ出力しています。

副産物的な気づきとして、それぞれのスピーカーをバラバラに設置できるので、置き方や向きなどの要素を変化させて聴き比べることができることもわかりました。配線がごちゃごちゃして見た目が悪いところは難点ではありますが…。

2024年11月2日土曜日

Raspberry PiでRaspberry Pi Picoのプログラミングに挑戦〜圧電スピーカーをつないで音を出す

以前の続きです。Raspberry Piでプログラミングをして、Raspberry Pi PicoをコントロールしてLチカする実験をしましたが、次のステップとして、「音を出す」ことに挑戦したいと思います。今回もRPI 3RPi 400を使ってやってみます。まずは、MicroPythonでできるかやってみようと思いますが、RPi 3では「Visual Studio Code」が使えなかったので、「Thonny」だけでやってみることにします。
#下準備として、PicoでMicroPythonが使えるようにするファームウェアの設定作業は、過去の拙Blogの記事を参考にしてください。公式Webサイトの情報もご確認ください。

まずは、Thonnyを起動して作業開催。既に様々な設定が終わっているので、すぐにプログラムを書き始めます。今回は、@undo0530さんの「Raspberry Pi PicoでMicroPythonでPWM信号でスピーカーでメロディー演奏」を参考にしながら、曲を演奏するMicroPythonプログラムを書きました。内容は以下のとおりですが、ファイル名は任意で決めていただいて構いません。

from machine import Pin, PWM, Timer
speaker = PWM(Pin(17, Pin.OUT))
led = Pin(25, Pin.OUT)
ahz = 440
A4 = ahz
B4 = ahz * (2 ** (2/12))
C5 = ahz * (2 ** (3/12))
D5 = ahz * (2 ** (5/12))
E5 = ahz * (2 ** (7/12))
F5 = ahz * (2 ** (8/12))
G5 = ahz * (2 ** (10/12))
A5 = ahz * 2
mspb = 400
melody = [C5,0,C5,0,G5,0,G5,0,A5,0,A5,0,G5,0,0,0,F5,0,F5,0,E5,0,E5,0,D5,0,D5,0,C5,0,0,0]
i = 0
def beat(timer):
global melody
global led
global i
global speaker
if i >= len(melody):
speaker.deinit()
led.value(0)
timer.deinit()
elif int(melody[i]) == 0:
speaker.duty_u16(0)
led.value(0)
else:
speaker.freq(int(melody[i] + 0.5))
speaker.duty_u16(0x8000)
led.value(1)
i += 1
tim = Timer()
tim.init(period=mspb, mode=Timer.PERIODIC, callback=beat)

ScratchMicrosoft MakeCodeのように、はじめから音階が用意されていないので、PWMで作らなければなりません。そのために、使う音名に12平均律の各音の周波数を計算して入れて、メロディとして並べて演奏するプログラムにしています。「0」は、休符です。

このプログラムを作る過程で、MicroPythonでの「べき乗」や「累乗根」の計算式の書き方を学びました。各音の周波数値を決めるために近似値を使わずに計算式で計算をさせるプログラムにしたのは、(内部処理によって計算精度が微妙に違うかもしれませんが)できるだけ「正しい12平均律」に近づけたいと思ったからでした。実験した圧電スピーカーとPicoは以下のとおりです。(Seriaで購入した小さなモニタスピーカー模型?に圧電スピーカーを仕込んであります)

プログラムを書き終えてから、PicoをUSBケーブルでRPiにつなぎ、認識された(認識がうまくいかない場合は、一度「Stop/Restert backend」ボタンをクリックすると認識される)ところでRUNボタンをクリックすると、無事にメロディが鳴ってくれました。(「きらきら星」です)RPi 400でもRPi 3でも問題なく、音程も思った通りで「楽器」としても面白いものができた感じになりました。今回取り組んだ「周波数から音階を作る」という作業は、とても面白いと思いました。一方で、もう少しスマートな書き方ができないものかと思案しています。

〈参考資料〉

【追記】これまでのPicoでのプログラミング(フィジカル・コンピューティング)に関する拙Blogの記事もご覧ください。(2024.11.4←これからも適宜更新していきます)