学園祭で電子オルゴールを作った

今日は小平にある職業能力開発総合大学校東京校の学園祭に出向いて、電子オルゴールを作った。

これはPICマイコンを使って圧電ブザーをプログラムで制御するという物。ハードもプログラムも基本は作ってあって、参加者は音符をプログラムで記述して、コンパイル、PICに書き込み・・・をするだけという感じ。本当に短時間だけど、こういう組み込み系を体験できるという・・・なんと素晴らしい!

しかし自分と奥さん以外に参加していたのは、小学生女子数名と、高校生か大学生くらいの女子2名。学園祭なので、全員飛び入りの参加。どうなる事やら・・・。

さすがに小学生はなんだか難しかったらしいが、一人は音楽には堪能だった様で。スタッフの助けでなんとか完成していた模様。

うちは奥様に任せて、ちょこちょこアドバイスする程度。まずはその場で楽譜をちょっと書いて、最初の8小節だけ入力してみる事に。 ・・・結構難しい。

プログラムはPICのC言語になっていて、g() っていう関数に音の引数を渡すと1音出るので。これを並べるだけ。1音でデータはオクターブ、音の長さ、音階の3つの数値のorを取って1byteに圧縮。ドレミと鳴らすのにはこんな感じになる。

g(t1|n1|do1);  //  ド
g(t1|n1|re);    // レ
g(t1|n1|mi);   // ミ

t1, n1, do1 等は全てマクロで定義済。なんとなく一般人が、最低レベル理解可能にしてある。

音程には1bitしか割り当てていないため、2オクターブまでしかできないが。プログラムを見るとどうやら3オクターブはできる感じになっていた。ならいっそ、1音を3byteにしてしまえばいいのになぁ・・・わざわざ>>とか&してパラメータを解析してるし。(&だけでもOKだけど、コンパイラの最適化とか気にしているのかも。)

などといろいろ突っ込みどころ があったのだが。無事に我が家の奥さんはオルゴールをなんとか完成。結構大変だった。いろいろ助言をいただいたスタッフのおかげでした。初めてのプログラミング(本人はプログラミングと分かっていたのか怪しいが)に成功して、奥さんも自分のお気に入りの曲で喜んでました。

ここはすみません、いきなりディープな話ですが。
帰ってからPICのチップを見てみると、文字が小さい・・・PIC16F84aだ。データシートを見てみると、 なんと・・・。

  • 1024 words of program memory  (プログラム用メモリ1024ワード・・・これって1byte/8bitがwordなのかな?)
  • 68 bytes of data RAM (少ない!)
  • 64 bytes of data EEPROM (プログラムから書き込み出来るのかな・・・?)
  • Eight-level deep hardware stac (8レベルまでしか・・・厳しいなぁ)

こんなに制限がきついと思わなかった。前にPICが流行った頃に少しやったはずなんだけど、こんなきつかったんだなぁ。ちょっとビックリ。組み込みを舐めてました、すみません・・・ちょっと想像していた以上だった。まぁPICにはもっと違う種類が一杯あるので、もっと凄いのがあるに違いないきっと。

で、せっかくオルゴール毎貰ったし、無理行ってデジカメのメモリカードにソースコードもコピーして貰えたので。早速PICライターを探してみた。うーん、いろいろあるんだけど、やっぱり自作がいいかなぁ。秋月のはちょっと高くて、しかも外部電源が必要なのがちょっと残念。サイズも大きいし。本格的に遊ぶならいいだろうけど。たぶん、ちょっと遊んで終わり程度だからなぁ。Webの情報も流行が過ぎているせいか、古いのばかりなのが残念。これで遊ぼうという事自体、マニアック過ぎるのかも。

そうそう、ブレッドボードという電子回路の実験のためのボード。これが最近は安く買えるとは。これをベースにPICライター作ってみようかな。 どうせ数回で使わなくなるなら、こういうのでやるのがお手軽で良さそう。