今年も、子供向けにマイクロビットプログラミングのワークショップを開催しようと計画しており、そこでデモンストレーションするネタを考え中です。
今年の参加予定者には、小学生だけでなく中学生もいるので、ネタも少々凝ったものにしたいと色々考えていたのですが、以前つくったことのある、2台のマイクロビットをシンクロさせてハモらせるプログラム(記事は こちら)を、少し改良したら面白いものになるのではないか?と思いつきました。
音を出すマイクロビットを「子機」、その子機に指示を出すマイクロビットを「親機」とし、親機の指示に従って子機で音を鳴らすものです。
親機をゆさぶるたびに無線で信号を送信し、子機は無線信号を受信するたびに1拍分の音を鳴らすようにすれば、親機は「指揮者」、子機は「演奏者」のようになります。
子機をたくさん用意し、別々のパートのメロディーをプログラミングしておけば、ビッグバンドやオーケストラのようなものもつくれそうです。
実験1
親機について、当初は「ゆさぶられたとき」ブロックを使えば簡単に実現できるのでは?と考えていましたが、以下のような簡単なプログラムで試してみたところ、うまくいきませんでした。
ゆさぶるたびに短い音を鳴らすプログラムです。
マイクロビットを手に持って、指揮者のように「手を振った」とき、1拍ごとに「ピッピッ」と音が鳴ってくれれば成功なのですが、数回に1度の割合でしか音が鳴りません。
実験2
マイクロビットを持って指揮者のように「手を振った」とき、加速度センサの検出値がどのようになっているかを確認するため、以下のプログラムをつくってみました。
マイクロビットにプログラムを書き込み、「コンソールを表示 デバイス」をクリックすると、加速度センサの検出波形が表示されます。
検出値は通常は1000程度で、「手を振った」ときに2500程度になることがわかりました。
実験3
前述の調査結果を踏まえて、「手を振った」ことを検知するプログラムをつくってみました。
1度「手を振る」と複数回振動しているので、そのうちの1回だけを検知する必要があります。
1度検知したら、その後200ミリ秒は揺れを無視するようにしました。200ミリ秒は300bpmに相当するので、それより早く手を振ることはないという判断です。
また、少し手を動かしただけで「手を振った」と認識されると困るので、検出値が2000以上の時のみ「手を振った」と認識するようにしました。
このプログラムをマイクロビットに書き込み、マイクロビットを持って指揮者のように「手を振った」ところ、1拍ごとに「ピッピッ」と音が鳴ってくれました。
親機(指揮者)のプログラム
前述の調査結果を踏まえてつくった「親機(指揮者)」のプログラムは以下のとおりです。
今回、「無線のグループ」は「39」にしています。
「手を振る」たびに無線で数値を送信します。なお、最初の3拍分はスキップし、4拍目から送信します。
送信する数値は「テンポ(bpm)」です。今回手を振った時刻と、前回手を振った時刻の差から、テンポを計算しています。
ボタンAを押すと、曲をあたまに戻すため、拍をリセットします。子機も曲をあたまに戻さなければならないので「reset」という文字列を無線送信します。
子機(演奏者)のプログラム
「子機(演奏者)」のプログラムは以下のとおりです。これはメロディー(主旋律)用のプログラムです。
子機も「無線のグループ」は「39」にします。
親機から数値を受信するたびに拍(count)をカウントアップします。拍は0〜31をくるくる繰り返します。
また、その数値を受信するたびに、受信した数値で「テンポを設定」し、「melody」関数を呼び出します。
「melody」関数には、1拍分ずつメロディーを書いていますので、呼び出されるたびに、1拍分のメロディーを、設定されたテンポで鳴らします。
無線で「reset」という文字列を受信したら、曲をあたまに戻すため、拍をリセットします。
動作確認
親機(指揮者)のマイクロビットには「MI:電源ボード」を取り付けました。
子機は3台用意し、メロディーのみ変更したプログラムを書き込みます。
今回は子供ウケがいいように、「YOASOBI」の「夜に駆ける」を選曲しました。
子機(演奏者)のマイクロビットには、以前の記事(こちら)と同じように、電池ボックスや百均スピーカーを取り付けました。
もっとたくさんのパートを準備してもよかったのですが、マイクロビットの音がショボく、これ以上音数を増やすと何がなっているのかわからなくなりそうなので、子機は3台に留めておきました。
「メロディー」「ベース」「伴奏」の3パートです。