2015年11月23日月曜日

15.11.23 ミニキーボード


ものづくり教室の生徒に電子音を体験してもらおうと思い、基板にスイッチを鍵盤状にならべてキーボードを作ったところ、ものづくり仲間が鍵盤じゃないとつまらない、と言って、プラダンで鍵盤を試作してくれた。その鍵盤を使い、ミニキーボードを作ってみた。


鍵盤は1オクターブで発音数は1つだけとする。PIC1つで全ての処理を行うことにし、部品点数が一番少なくできる16bitのPIC24FV32KA301に決めた。音源方式はピッチ同期式で1周期128ポイントの波形メモリ方式とした。DACはないのでPWM変調を使うことにし、キャリア周波数は256KHz、データのビット数は8bitとした。PWM変調の出力に抵抗を直列に入れて圧電ブザーを鳴らしている。


鍵盤は1オクターブの13keyとモード選択用に1keyの合計14keyがあり、それぞれの鍵盤のスイッチがPICのポートに接続されている。
通常は、鍵盤を押して演奏する。モード選択キーをダブルクリックするとエディットモードになり、鍵盤でパラメータ変更などができるようになる。モード選択キーをシングルクリックすると、通常の演奏モードに戻る。

機能1:音色選択
白鍵を押して音色を変更する。サイン波・三角波・矩形波・鋸歯状波・FM波形(4種類)の8種類の波形が用意されている。8番目の波形は、音の出だしから波形を順に切り替えていくようになっていて、音色が変化する音になっている。
機能2:音量エンベロープ設定
音量の減衰を選択する。減衰なしから減衰最大までを4種類選べる。
機能3:ビブラート設定
ビブラートの深さを設定する。ビブラートなしから最大までを4種類選べる。
機能4:オクターブ設定
演奏する音程のオクターブを4つの中から選択する。
機能5:メロディー演奏
メロディー貯金箱用に作ったメロディーを連続演奏する。演奏順はランダム。メロディーを演奏しながら機能変更を行うと、音色の変化がわかりやすい。


プラダンで鍵盤を作る工程で、白鍵の隙間をカッターで切り取る作業や、スイッチになるメッキ線を取り付ける作業など、かなり技術的にも高度な作業があるし、ユニバーサル基板に回路をはんだ付けし、スイッチのメッキ線と接続する作業も忍耐が必要な作業なので、他の作業の負担を減らすよう、いくつかの作業を事前にこちらで行った。


和音が出ないのが最大の欠点だし、音の強弱のコントロールができないのが寂しいが、簡単なメロディーを弾いて楽しむことはできる。

2015年9月13日日曜日

15.09.13 エネループ放電・充電器


今回は自分用の実用品。以前、エネループ用の放電器を作ったが、電池1ヶ用だったし、充電は別の充電器に移してやる必要があったので、エネループ2ヶを同時に放電してから充電する装置を作った。電池でエネループを充電するのはばからしいので、電源は3.3VのACアダプタを使う。


放電は、トランジスタのコレクタに3.3Ωの抵抗をつけ、これにエネループで電流を流すようにする。流れる電流は300mA程度。電池の電圧を測定し、1.0V以下になったら放電を終了し、充電を開始する。


充電は別のトランジスタのコレクタに3.3Ωの付加抵抗を付けて電源に接続し、エミッタにエネループの+側をつなぎ、-側はグランドにつなぐ。3.3Ωの両端の電圧を測定し、一定の電流が流れるようにベース入力のPWMの幅を制御する。電池を10時間で使い切るのと同じ電流で充電するのが安全ということなので、単3の場合は190mA、単4の場合は75mAを流して充電する。充電中の電池の電圧が1.44V以上になったら充電を終了し、無負荷状態に戻る。


動作状態や電池の電圧を表示するため、乾湿式の温度・湿度計で使ったのと同じ3桁の7SegLEDを使い、操作用にタクトスイッチを2ヶ用意した。
LEDの1桁目は状態表示で、上半分で左側の電池、下半分で右側の電池の状態を交互に表示する。"口"は無負荷状態、下の横棒がないのは放電状態、右の縦棒がないのは充電状態を表す。1桁目の小数点は常に点灯している。
2桁目と3桁目で電圧の小数部を表示する。電池が装着されていない場合は"--"と表示される。


電池を電池ホルダに入れると、無負荷の状態の電池の電圧が表示される。エネループでなくても電池の残量を表示することができる。基板には単4用の電池ホルダを取り付けたので、単3を使う場合は単3用の電池ホルダを基板のコネクタに取り付ける。


タクトスイッチを押す回数で機能を選択する。
1回押しは単4電池の放電と充電、2回押しは単3電池の放電と充電、3回押しは単4電池の充電、4回押しは単3電池の充電となる。動作中にスイッチを押すと、動作を停止して無負荷状態に戻る。

2015年8月23日日曜日

15.08.23 乾湿式温度・湿度計


乾湿式の温度・湿度計を作ってみた。昔からガラス管の温度計2本を並べたものがあるが、これを電子式の温度センサーで再現したもの。


温度センサーはトランジスタ型のLM61を使う。出力はアナログなので、PICのADコンバータでディジタル値に変換する。乾球のほうはそのままの温度を測定するが、湿球のほうは水にひたしたガーゼをプラスチック部分に巻きつけて湿らせて測定する。
水分が蒸発するときに気化熱を奪うので、湿球のほうが温度が低くなる。乾球と湿球の温度差と乾球の温度で湿度を読み取るが、本来のガラス管の温度計用のテーブル通りだと湿度が高く表示されるので、現物合わせで、乾球と湿球の温度差を2倍にしてテーブルを読むようにした。


乾球の温度と乾・湿球の温度差で湿度を読むテーブルの一部は以下のようになっている。
温度は0.1度単位で測定しているので、乾・湿球の温度差の1度の間は直線補間して湿度を求める。たとえば、乾球温度26度で、乾湿球の温度差が3.4度の場合は、76 - (76-69)*0.4 = 73.2で73%となる。
 Dry  Difference Between Dry and Wet
      0   1   2   3   4   5   6   7   8   9
 30 100  92  85  78  72  65  59  53  47  41
 29 100  92  85  78  71  64  58  52  46  40
 28 100  92  85  77  70  64  57  51  45  39
 27 100  92  84  77  70  63  56  50  43  37
 26 100  92  84  76  69  62  55  48  42  36
 25 100  92  84  76  68  61  54  47  41  34


PICは8bitのPIC18F26K22を使った。表示は7セグ3ケタのLEDを使う。温度は" 27"、湿度は"h72"のように表示する。
温度と湿度の表示だけだともったいなので、キッチンタイマーの機能も付けることにした。表示が3ケタなので、"9:50"までの時間を設定できるようにした。ラーメンの3分、パスタの9分には十分使える。
LEDで表示するので、つけっぱなしだと電池がすぐになくなるため、スイッチ操作から10分経つとスリープするようにした。


水を使うので、全体をひとまとめにしておくことにし、木の台に基板・電池・ペットボトルで作った水入れ、を取り付けた。
別のセンサーで作った温度・湿度計と比べているが、温度・湿度ともほぼ同じ値が表示されている。


2015年5月10日日曜日

15.05.10 リモコンで動かす三輪車


これまで三輪車にいくつか芸をやらせてきたが、PICの新しい基板を作ったので、これまでの芸をまとめて復活させてみることにした。3回に分けて書くことにして、今回はリモコンで操作するもの。


16bitのPIC24FJ64GA002を使って新しい基板を作成した。プログラム領域が64KBytes、データ領域が8KBytesあるので、あれこれ機能を盛り込んでも十分実装できる。16bitなので計算が早いしPWMの出力も5ヶ使える。モータードライバーはRohmのBD6211を2ヶ実装した。リモコン用に赤外線受信器を実装し、他にはボリュームとスイッチを1ヶずつとLEDが3ヶ。外部との入・出力用に6pin分を用意した。



リモコンは4種類用意した。最初はDVDレコーダー用のリモコン。ボタンがたくさんあるので便利に使える。上下左右の矢印キーなどを使い、前・右前・左前・後・右後・左後・右回転・左回転・停止、の動きができ、速度は8段階に設定できる。
このリモコンは三輪車を動かす他、動作モードの切り替えなどにも使っている。


次はボリュームで方向を決め、ボタンで前進・後退をさせるもの。ものづくり教室で作成したプリント基板で作ってある。この基板は、PIC、トランジスタ、ボリューム、スイッチなどを実装できるので、さまざまな用途で便利に使っている。


ボリューム2つで制御するもの。左手の親指で前進・後退と速度を制御し、右手で方向を決める。リモコン用のプリント基板に穴を開け、むりやりねじ止め型のボリュームを2つ取り付けた。


最後はレゴの歯車を回し、歯車の回転をロータリーエンコーダで検出して、左右の車輪の回転方向と速度を別々に制御するもの。歯車の回し方で動きが変化する。


リモコンで操作して楕円形のコースに沿って走らせてみたが、思ったよりも難しくなかなかきれいには動かせないことがわかった。

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曲入れてある。

2015年1月8日木曜日

15.01.08 格子状の道をうろうろ歩く2輪車


去年作った迷路探索する2輪車で別の動きをさせてみた。
走る道は前回と同じ格子状の道で、壁を自由に置くことができる。
車は交差点で壁の状態を確認して壁にぶつからないように方向転換しながら歩く。


レゴのモーター2つで車輪を駆動する。CPUは18pinのPIC18F1320を使い、モータードライバーはLB1639を2ヶ使っている。


センサーは道路を検出するもの2ヶと壁を検出するもの3ヶで、どちらも反射型のフォトインタラプタを使う。
センサーを低い位置に取り付けたので、壁は低くてすみ、10*15mmの角棒を切るだけで作成できる。


道路は直線なので、ライントレースは複雑な制御はしていない。交差点で右・前・左の壁の有無を測定し、壁のない方向に進む。壁のない方向が2つ以上ある場合は乱数で方向を選び、すべて壁でふさがれている場合は反転して後ろに進む。