micro:bitオルゴールプロジェクト


2020.8.4
↓クリックでデモ動画が再生されます

◆micro:bitと音楽

micro:bitには標準で音楽を演奏する機能が備わっています。と言っても、音源はサーボ駆動と同じPWMの方形波で、これをポートに出力するだけなので、micro:bit単体では音が鳴らせません。ポートに圧電スピーカーを接続するか、適当なアンプで増幅する必要があります。
1ブロックに1音の音階とを指定して、ブロックを並べて曲を作っていきます。

ブロックを並べていくのは少々面倒でもあり、曲を変更するにはにプログラムしなおさなければなりません。
曲の変更を簡単にできると楽しいですね。そのためには曲の情報を外部に記録しておくことが考えられます。パソコンを使わずに済めばなお簡単ですが、一つの方法としてオルゴールのように機械的に記録する方法があります。
コンピュータの先祖のひとつがパンチカードで織柄をプログラムする「ジャカード織機」と言われていますが、ピンの配置で音楽をプログラムするオルゴールも、先祖の一つと言えるかもしれません。
また、曲の中には順次、反復、条件分岐などアルゴリズム的な要素があるため、音楽とプログラミングは相性が良いと言われています。

◆光で音を記録する

オルゴールは、一定の速度で回転するシリンダーやディスクに埋め込まれた金属のピンが、金属の櫛歯を弾いて音を出します。
音階は櫛歯の数で決まり、弾かれた音がメロディになるようにピンを並べていきます。

(Hebi B.によるPixabayからの画像)

micro:bitでこの仕組みを実現するには、櫛歯のかわりに接点を用意して、ピンと触れた接点に対応する音階の音を出力すればよいですが、なかなか複雑な機構になりそうです。
そこで、ピンの代わりに光を反射するものを使い、接点の代わりに光反射センサー(リフレクションセンサー)を使ってみます。回転するシリンダーは加工が面倒そうなので、回転するディスクにすることにします。
ディスクの円周を32等分し、32個の音を置けるようにします。32等分した扇形は同心円で8つに分割し、8つの音階を表し、黒く塗ったところ(光反射のないところ)が音が出るように考えます。


◆光反射センサー

光の反射をとらえるセンサーは、物体の存在の検出などで大量に使用されているため安価に入手できます。
原理的には赤外線LEDとフォトトランジスタのセットになっていて、一定の距離内に物体が存在すると、LEDから出た赤外線が反射されてフォトトランジスタをONにします。物体の存在を、フォトトランジスタに電流が流れているか、いないかに置き換えて検知しています。
今回は「Pololu QTR-8A」という1モジュールに光反射センサーが8個並んでいる製品がありましたので、これを利用しました。
スイッチサイエンスで入手できます。


https://www.pololu.com/product/960

◆構造と回転機構

構造は手持ちのレゴブロックを使いました。センサー部分はレゴテクニックブロックに両県テープで固定します。
ディスクの回転は、レゴブロック互換のサーボである「Geekservo」シリーズの回転サーボを使用しました。
回転サーボの駆動にもmicro:bitを使用しますが、スイッチサイエンスの「ワークショップモジュール」は電池内蔵でサーボの端子も用意されているので、これを利用します。
https://www.switch-science.com/catalog/5489/
実際やってみると、サーボの回転数を最低まで低くしても、まだ速すぎる感じなので、電池の1本をダミー電池にして3Vで動かしています。

 

◆センサーとmicro:bitの接続

QTR-8Aの出力はアナログです。センサーに反射がないと出力に3V程度の電圧が出て、反射があると0V近くに落ちますが、アナログなので中間の不安定な状態になる場合があります。micro:bitに安定したデジタル入力をするため、センサーとmicro:bitの間にバッファを接続します。
バッファはテキサスインスツルメントのSC74HC541という3ステートバッファですが、ちょうど8チャンネルあるのでおあつらえ向きです。秋月電子通商で40円で購入できます。
https://www.tij.co.jp/product/jp/SN74HC541
A1〜A8が入力側で、ここにセンサーの出力をつなぎます。
Y1〜Y8が出力側で、micro:bitのP1〜P8に接続します。

OE1、OE2は両方ともLow(GND接続)にしておきます。
手元にあったユニバーサル基板と、コネクタ類で組み上げましたが、現在プリント基板を発注中です。



◆オルゴールのプログラム

micro:bitのポートのP0をスピーカーに、P1~P8を音階に対応するセンサーからの入力にします。
デフォルトではP3,P4,P6,P7はLEDの回路に接続されているため、これらの端子を使いたいときはLED表示を無効にする必要があります。
「最初だけ」のブロックに「LED表示を有効にする<偽>」を入れておきます。

センサーの前を楽譜の黒い部分が通ると、センサーの出力はHiになり、micro:bitから見ると端子のデジタル入力が「1」になります。1になったとき、対応する音階の音を出力するようにするだけです。

とりあえず以上です。

(2020.8.9)
プリント基板を製作しました。