2015年2月21日土曜日

15.02.21 PICで作った楽器もどき


最近メロディーがらみのものが多いので、勢いでいつも使っている8pinのPICで楽器もどきを作ってみることにした。音色が選べ、和音も鳴らせるものを目指す。


使うPICは8bit,8pinのPIC12F1822。秋月で1ヶ100円で買えるもの。5bitのDACを内蔵しているので、これを使って音を出す。クロックは最高の32MHzで動かす。音源方式は一番単純なピッチ同期の波形メモリとする。再生できる最高音を16KHzとするとサンプリング周波数は32KHzになる。250Hzの音の場合32,000/250 = 128なので、波形の1周期のサンプル数は128とする。波形を読みだす間隔は約30μsになる。これより1オクターブ高い音は波形を1つおきに読むようにすれば、波形を読みだす間隔の最小値は15μsになる。1オクターブ低い音は2回ずつ同じところを読むようにする。
サイン波、三角波、鋸歯状波の波形メモリを用意して鳴らしてみたところ、5bitのDACでも一応それらしい音が出ることが確認できた。





音量や音色を変化させたいので、サンプル毎に波形の値にEGを掛け算するようにしてみたところ、計算が間に合わないことが判明した。それでも音色を変化させたいと思い、波形を順に切り替えていくようにしてみた。波形はPCのVisualStudioでFM音源のシミュレータを作り、変調の深さが徐々に浅くなる8種類の波形を用意した。これを音の出だしのところで一定間隔で切り替えていき、最後の波形までいったら、その波形を繰り返して読むようにした。波形の切り替えのところでノイズが聞こえるが我慢する。波形切り替えの間隔は音程が高くなると短くなる。



2声の和音を鳴らせるよう、PICを2ヶ使う。2つのPICのDACの出力を抵抗でミキシングして鳴らしてみたところ、ひどい歪でとても聞けない。しかたないので、テスト中はそれぞれのPICに圧電ブザーをつけて鳴らすようにした。きちんと聴く場合は、ステレオの右と左にそれぞれの出力を出し、スピーカで鳴らせるようにしてある。


和音を弾けるよう、鍵盤で演奏する。単音なら鍵盤にスイッチをつければよいが、和音を出したいので他の方法を考えることにした。以前、楽器の研究をしていた時の同僚が、手袋の指先にセンサーをつけて専用の鍵盤を弾くようにすれば音源が10ヶあれば両手で弾ける、という特許を出したのを思い出し、これを採用することにした。
鍵盤も自作することにし、ユニバーサル基板にメッキ線で2オクターブの鍵盤を作成した。音程を検出するため、電源とグランドの間に100Ωの抵抗を直列に25ヶつなぎ、それぞれの音程の鍵盤のメッキ線に特定の電圧が出てくるようにした。
両手の人差し指にメッキ線で作ったセンサーを巻きつけ、これで鍵盤を弾くと、それぞれのPICで鍵盤の電圧をAD変換して音程を決め、音を出す。


ついでにマスタークロックの周波数を調整する機能を使い、ビブラートがかかるようにした。ビブラートをオフにすることもできる。
音源ごとにオクターブと音色を選ぶことができる。オクターブはボリュームの位置を合わせてスイッチを押す。音色は鍵盤を弾いたときにボリュームの位置をみて使う波形を決めるようにした。

2015年2月17日火曜日

15.02.17 光テルミンの自動演奏


ものづくり仲間が教材用に光センサーで制御するテルミンを開発した。演奏は大変難しいので、上手に演奏する自動演奏装置を作ってみた。


光テルミンは、音量は反射型フォトインタラプタ、音程はCDSをセンサーとして使っている。このセンサーを外部からLEDで駆動して自動演奏させる。以前製作したメロディー貯金箱のシステムを基本に使うが、PWMの出力数や計算精度を上げたほうが良いので、最近開発した16bitのPIC24FJ64GA002のシステムを使うことにした。モータードライバーが2ヶ実装されているので、これでLEDを駆動する。



LEDの明るさの制御はPWMのデューティーの変化で行う。音量の制御はPWMの周波数が聞こえないよう、20KHzのPWMとする。フォトインタラプタは赤外線のLEDを使っているので、自動演奏側も赤外線のLEDを使う。連続点灯だと一定音量で鳴るが、音の切れ目がわからないし、聞いた感じもつまらないので、明るさが減衰していくようにした。減衰速度はテンポと音符の長さで変える。PWMのデューティーの設定値が9bitしかないので、変化時にノイズが聞こえるが、単純な音よりはよしとした。


音程のLEDも20KHzのPWMで駆動する。試しに半音ごとに2^(1/12)ずつPWMのデューティーが変化するようにしてみたが、周囲の明るさの影響で音程の間隔が小さい。いくつか試してみたところ、半音ごとの比が1.13程度でうまく音程が再現できることがわかった。ただし周りの明るさが変化すると音程ごとの周波数が変わってしまうので、再生開始時に基板のボリュームを読み、半音ごとの比を決めて、音程毎のデューティーのテーブルを作ることにした。これで明るさに従って音程を調整することができるようになった。それでも人が動いたりするだけで明るさが変化して音程が崩れてしまうので、再生中はじっとしている必要がある。演奏するメロディーは貯金箱のときに作成したものを使っている。


2015年2月4日水曜日

15.02.03 格子状の道をせかせか歩く2輪車


前回はレゴのモーターで動く2輪車だったが、動きが遅いのが気に入らず、タミヤのミニモーターで動く2輪車を復活させてみた。PICの基板は20pinのPIC18F14K22で新しい基板を作成した。同じ格子状の道を歩かせるが、今回は壁は使わず勝手に歩き回るようにした。おまけで貯金箱用に作ったメロディーを鳴らす。


モーターはタミヤのミニモーターを使う。雑音を減らすためギヤボックスは使わず、レゴのプーリーにゴムのタイヤをつけた車輪の外周をモーターの軸で直接駆動する。モーターの取り付け方法、車輪に押し付ける力加減など、あれこれ試して今の方法に落ち着いたが、やはり安定度が低く空回りすることがある。
車体の前後にボールキャスターをつけて倒れないようにしてある。



3Vで動作するモータードライバー(ロームBD6211)を秋月から調達し、新しい基板を作成した。マイコンは20pinのPIC18F14K22を使う。ボリュームとスイッチ、LED3ヶを基板上に実装し、モーター駆動用の出力に4pinを使い、余った入出力は外部入出力用のピンに接続してある。BD6211は駆動するPWMは20KHz以上となっているが、18F14K22はハードウエアのPWMは1チャンネルしかないので、ソフトでPWMを作成するしかなく、周波数は500Hzとした。駆動波形が乱れているが、強弱のコントロールはできるので、これで良しとしてある。


センサーはライントレース用の反射型フォトインタラプタが2ヶ。左右に回転する時のラインの検出が安定するよう、車輪よりもやや前方に取り付けた。


自分がいる位置を管理しながら、はみ出さないように格子状の道を歩き回る。スタートは右下から上向きと決めておく。交差点に来るたびに、ランダムに進行方向を決める。進む方向は前・右・左の3方向で、選ぶ確率は前が2/4、右・左がそれぞれ1/4としてある。現在の座標を見て、道からはみ出す方向が選ばれた場合は、再度方向選びを行う。方向が決まったら、次の位置の座標を書き換えておく。


ものづくり教室で作ったメロディー貯金箱のメロディーを鳴らしながら歩き回るようにした。今回はPICのクロックを2倍の16MHzにしたため、メロディーの音程が1オクターブ高くなってしまった。貯金箱で使ったPIC12F1822よりもプログラム領域が大きいので、メロディーは16曲入れてある。