2011年1月28日金曜日

低予算で小学生にも組み立てられる「あの楽器」作りました

教員養成が仕事なのですが、中学校の技術・家庭科で「計測と制御に関するプログラム」という項目が必修になり、関係者の間でどうすべきかということが盛んに議論されているところです。

そんななか、これまで僕は自律ロボットの製作とプログラミングを実習授業でやってきていたのですが、お金の問題とか、いろいろ行き詰まりを感じて、単純に楽しめて工夫できる題材を考えていました。

そして、そのひとつの提案が、ここで紹介させていただく「あの楽器」です。

そうです、「あの楽器」です。ネギとかいう人もいます。余談ですが。

とにかく安くて子どもが持って帰ることができること、それから、プログラムで工夫して変化をつけられること、最後に、家で当分遊べることを目標にしました。

以下、仕様:
  1. 黒くてショルダーキーボードのような形状
  2. 手を触れると音が出る
  3. 音に合わせてなにやらビジュアル効果が表示される
1.は問題なし。子どもの体型に合っていればよい。2.で、センサーの登場です。計測するわけです。3.はたいへん敷居が高いところです。「ニコニコ動画」の「作ってみた」カテゴリの方々は、ここに高価な液晶ディスプレイなどを使って、Flashの動画を出したりしているようです。

しかし、「あの楽器」特有の幾何学模様を妥協すれば、単純にLEDを光らせるだけで相当な効果が出そうです。音に合わせてぱらぱらと複数のLEDがいろいろな色で光れば、結構インパクトが出ることが期待できます。

そして設計したのが以下の内容です。
  • 手のセンサーに、シャープのPSD測距センサーを使う
  • 楽器の裏からLEDをいくつか出して、アクリル板で散光させる
アクリル板に、蛍光マーカーで絵を描けばきれいで、子どもも喜びそうです。

さて、マイコンですが、僕は大阪電気通信大学教授の兼宗先生のお仕事に関係していて、学生へのプログラミング実習でも、彼の「ドリトル」を使っています。いまのところ、ドリトルでプログラムできるマイコンボードとしては、静岡のスタジオミュウさんの「ミュウロボ基板」とArduinoの2つがあります。といっても、Arduinoは独立して動かすのではなく、I/OとしてPCに接続したままPC上のドリトルで値を読んだり書き込んだりするために使うようになっています。

そこで、ミュウロボ基板にドリトルでプログラムを書きこんで楽器に仕立てようということになります。ミュウロボ基板にはピエゾスピーカーが搭載されていて、ドリトルからは「電子音」命令で、指定した時間の長さだけ、指定した波長の矩形波を出すことができます。

センサーからの入力は、PIC 16F688搭載のミュウロボ基板では、10bitのA/Dコンバータを通したアナログ入力ができるので、これを使います。

試しに、秋月で買ってきた1個400円のPSD「GP2Y0A21YK」の出力をミュウロボ基板のアナログ入力端子に直接入れてみました。よくしたもので、定格範囲内で、20〜130ぐらいの値としてみえているようです。そこで、その値を直接「電子音」命令のパラメータに入れてみました。音の長さは最短の0.1秒です。

すると、音が連続しないように、0.01秒程度の無音期間が入りますが、距離に応じて、遠ければ低い音、近ければ高い音が出ます。手を動かすと、断続的ではありますが、音程の変化がわかり、慣れてくると、ある程度の音階も表現できそうなことがわかりました。

というわけで、音はOK。あとはビジュアルエフェクトです。複数のLEDをランダムに光らせたいわけですが、測定値の2進の値をそのまま出力ポートに出せば、LEDがビットの順にさえなっていなければランダムに見えそうです。

よくしたもので、ミュウロボ基板はPICを使っていますから、LEDぐらいなら直接ドライブできます。高輝度で光軸の角度が広い(拡散を狙うため)LEDを何色か買ってきて、つないでみました。いい感じです。

ここまで確認ができたところで、研究室の卒業研究の題材として与えることにしました。教材開発ということになります。対象は本来なら中学生でしょうが、職場で工作教室のイベントを年間を通して実施していて、小学生がたくさんきます。そこで、このイベント向けに、小学生サイズの、小学生ができる工作の範囲で作るということを目標にさせました。

まあそれはともかく、作品を見てください。

いい感じでしょう。

演奏をよく見ると、右手で音を出しているのですが、左手親指を動かすと、音が変化しているのがわかると思います。ここが、第2のセンサーです。

価格的に、ミュウロボ基板とPSD測距センサーで工作教室の予算はいっぱいなのですが、「より楽しい演奏」のためのオプションを試してみたのです。

これも秋月で1個500円で売っているFSR(力感知抵抗)という、力を加えることによって抵抗値が下がる受動素子です。データシートを見る限り、抵抗膜方式のタッチパネルと同じ原理といってもよさそうです。

抵抗値は、無負荷で1MΩ、100gあたりで一気に10kΩまで下がり、そこから10kgぐらいまで、「逆べき乗」の関係で0Ωに近づいていきます。この変化は、抵抗膜と導体の間にポリウレタンのドームが60個、面状に配置されているため、これが潰れて両者が接触するまで抵抗値がかわらないということです。実際にテスタで変化を確かめると、データシートに似た変化をすることが確認できました。

PICのAポートは設定によって、10kΩの抵抗でプルアップされます。ミュウロボ基板は、入力端子がすべてこの設定になっています。ですから、FSRを直結しても、A/D値は0から半分までの値をスイングしそうです。

ところが試してみると、100gのポイントで一気に0になってしまいました。これではスイッチとしてしか使えません。そこで真面目に、オペアンプを使って電流-電圧変換させてやることにしました。うまいことに、データシートにLM358を使った単電源の電流-電圧変換回路の例が載っています。

この通りの回路をブレッドボードで実験し、負帰還のRを10kΩにしてやると、押した感触をうまく反映した値が出ることがわかりました。実測で、183〜230ぐらいの値です。

これをどう使うか、ミュウロボ命令の「電子音」は、音の長さ(0.1秒単位)と波長(8bit)しかありません。そこで、両方を試してみることにしました。

まず、音の長さを変化させることを考えます。右手を距離センサにかざしても音は出ず、左手の押す力の大きさで音の長さを変化させます。イメージは、ピアノのサステインペダルです。かといって、単音しか出せないので、あまり長い音が出ても困ります。そこで、何回か試したところ、185を引いて負になったら0にして、その結果を4で割ると、それなりのニュアンスが出せました。

もうひとつ、波長の変化です。シンセについているベンドをイメージしました。押して音程を下げるよりは、上げたほうが雰囲気が出そうです。ギターのチョーキングのイメージです。

「電子音」命令の、波長のパラメータは、30ぐらいで1度ぐらいの差になります。では、ということで、185を引いて負にならないようにした値を、距離センサの値から引いてやりました。ただ、どうしても音が0.1秒単位で切れるので、ポルタメント的な変化は感じられません。最初は値を割ったりしましたが、極端に変化したほうがわかりやすいだろうと判断しました。最終的には、4倍しています。また、距離センサの値が小さく圧力センサの値が大きいと、引いた結果が負になりますが、試してみるとそれはそれで意外性があっていいや、という気分になりました。

この結果が、上記のビデオの音です。

まともな楽器というよりは、ガジェットといったほうがふさわしそうな仕上がりになりました。「楽しければいい」という意味では、これぐらいがちょうどいいのかもしれません。

肝心のボディですが、学生が工夫して、表面は黒と決めたので(なんせ「あの楽器」ですから)、小学生が持てる重さを考えて、黒のスチロールボードを使っています。外周は木材を使って剛性を保っています。小学生が多少乱暴に扱っても壊れないことを目指しました。LEDの光を散光させる透明板ですが、アクリルは重いのと高価なことで、プラスチック板としました。おかげで加工が簡単になりました。

最後にプログラムリストをご紹介します。ミュウロボ基板でロボットのプログラムを書いたことがある人には、センサの値を演算したり、条件分岐したりすることを意外に思うかもしれません。

実は、ミュウロボ基板のファームウェアで実現されたVMのバイトコードを直接プログラムしています。簡単なレジスタマシンを実現していて、限られてはいますが最低限必要な演算や分岐命令を持っています。また、引数をレジスタに指定して、指定したバイトコードを直接実行させる命令があり、evalというかexecというか、非常に自由度が高くなっています。「計測値を使って音を鳴らす命令」のためには必須の命令です。

結果、ぱっと見てどんなプログラムか理解するのは難しそうな、変態プログラムができました。でもこういうことに悦びを感じるのですよ、どうしても。

というわけで、リストを掲げてご紹介を終わります。


システム!"MYU"使う。

ロボ太=MYU!"COM5"作る。
ロボ太:演奏=「!はじめロボット
パワーオンスタート
「!
4 AN // In4の圧力センサの値をAに保存
「!30 以上のA」なら「!185 SUB」実行 // 183~230あたりの値が出るので調整
「!CFLAG」なら「!CLA」実行 // 念のため負になったら0にする
RLA // 2倍する
RLA // さらに2倍
EXARG1 // Aの値をARG1レジスタに退避
2 AN // In2の距離センサの値をAに保存
「!80 以上のA」なら // 値が80未満なら音を出さない
「!
SUBARG1 // Aから計算結果(ARG1にある)を引く
AARG2 // その結果を音程に設定
1 ARG1 // 時間は0.1秒固定
APC // LEDを光らせる
105 CMD // 電子音命令実行
CLPC // LEDを消す
」実行
」繰り返す
おわりロボット」。
ロボ太!演奏。