● 実験テーマ16
「PICによる、チャイム音発生基板の製作日記」
(山名宏治氏の製作記事による製作と動作確認まで)
■ 2012.04.09
・思いつくまま計画案を・・・
<このテーマにする理由等>
@ 以前から、PICのみで動く、音楽関係のハードをやりたかった。
A FM音源を使った何かを作りたかった。
B だいぶ前に購入した技術雑誌「ハードウエア・デザイン・シリーズ15/PICマイコン活用ハンドブック」の中の、
山名宏治氏の製作記事に、「PIC16C84によるチャイム音の演奏」というのがあった。
そこに、色々と工夫が凝らされている、エンベロープ制御回路で音作りしている部分があり、非常に興味を持った。
C 自作オシロのVUPも済んだので、ちょっと変わった波形取りをしてみたい気持ちもある・・・
<この記事を参考に製作するに当っての問題点・心配点>
@ PIC16C84が、MPLABでコンパイルできるか?
→ C30では当然出来ない。
→ 次の方法で可能
MPASMWINを起動しソースファイルと、使用デバイスを指定し、アセンブル・ボタンを押せば、アセンブルが行
われエラーが無ければ、HEXファイルが生成される。
(MPASMWINは、C30をインストールした時に既に、インストール済)
A PIC16C84が、PICkit2で、HEXファイルを焼けるか?
→ このMPUには、PRGピンが用意されてないので焼けない。
B プログラムがアセンブラで書かれている。
→ 仕事でアセンブラ経験はあるが、古いインテル80系及び、ザイログZ80系のASMで、PICのASMは未経験
曲変更・音階追加などの修正が学習のいいチャンスなので挑戦してみる。
C だいたいPIC16C84自体古くて、秋月にもマルツにも在庫無し。
→ この代替として、殆ど仕様互換の改良版「PIC16F84」がある。
だが、PIKkit2では書込みできない。
→ これを書込めるライターキットが秋月より、5000円で販売されている。
(また」それには、お試し用に、当該デバイスと10Mのセラロックが付属されている。)
→ また、作者の方で、PIC16F84用のHEXファイルが提供されているので
同じ物は、製作可能。
(CHIMEF.HEX(HEX形式のオブジェクト・ファイル PIC16F84用)
→ 曲の追加などの時、MPASMが必要になる。
<今回製作する、PIC_チャイム音発生基板の機能ブロック図>
・作者(山名宏治氏)のWEBページには、本テーマは公開されておらず、本での公開のみなので、回路図を
ここに公開することはしません。
動作原理の詳細については、作者の本の記事をご覧ください。
ここでは、本を見て、私なりに整理した細かめの機能ブロック図を載せておきます。
簡単に説明すると、音の元は、PICより矩形波を発生し、これを使います。音程は、ド・ミ・ソのみですが、
オクターブ上のド・ミ・ソも発音可能になっています。
これだけでは、リード系の音しか出ないので、チャイム音のような減衰振動波を得るため、CRの充放電カーブ
を利用し、これでエンベロープ制御をし、矩形波を変調しています。
エンベロープ制御の中枢には、電流作動型のOPアンプが使われています。
矩形波の他に、UP/DWNの制御信号が用意され、これによって、波形の立上り時間と、発音時間等を制御
しています。
■ 2012.04.10
・シリアル制御IF(RS232C)からの、コマンド制御の確認用冶具としてPIC24F+8bit_DIP_SWを使用した、
任意コード発生装置を作成してみることにする.。
→ PCのKeyボードから与えられるコードには制限があるため別途チェック冶具が必要
・パラレルIFも切替で選択できるようになっているが、音出しの実験だけなので、パラレルIFは省略し、
シリアル制御のみとする。
<進め方案>
@ 秋月のライタキット+15V_ACアダプター:計5600円を手配する。
A 本体の部品表・見積り作成
B 部品手配(ライタを含め一括手配)
C とりあえず、自分用の回路図を、水魚堂で作成
D 任意コード発生冶具を作成
E 部材が届いたら、ユニバーサル基板製作に入る。
F 実験開始
・PICライタ・キット含め、部品手配済(秋月分+マルツ分)
■ 2012.04.11
・水魚堂にて、回路図作成開始
■ 2012.04.12
・秋月分の部品到着
・自分用回路図作成終了
・任意コード発生冶具検討
→ PIC24Fトレーニング基板使用
8bit_DIP_SWは手持ちの、10bit_DIP_SW使用
プルアップは、PIC内蔵プルアップを設定して使用
※ この冶具を作る為には、ストレート・ピン・ソケットが必要なのでマルツに追加の問合せメールを出した(済)
■ 2012.04.13
・マルツ追加OKの返事
・任意コード発生冶具のソフト作成+コンパイル済
→ ピン・ソケットが未着なので、8bit_DIP_SWを実装できない。
そこで、簡易的に、クリップ・ストラップにて40H→"@"と、41H→"A"を送出して、TERA_TEARMにて
送信キャラクタが正しいか確認した。
→ 若干の手直し(チャタリング考慮など)はあったが、難なくOKになる。
※ 以下に、任意コード発生冶具のブロック図と、Cソースへのリンクを示しました。
→ 冶具の、Cソースはこちらからどうぞ:rs232c_code_gene.C
■ 2012.04.14
・午前中で秋月のライタ・キットを組上げた。
→ IC未実装にて、電源確認OK(Vcc=5.10V, Vpp=12.78V)
■ 2012.04.15
・XPの、DOS窓にて、DOS版ライタ・ソフト「PICW.EXE」を実行し「接続OK」を確認
(この前に、純粋なDOS画面でも確認を試みたが、旧マシンが調子悪く断念)
■ 2012.04.16
・今回の、PIC16F84Aは初めて使うMPUなので、ターゲットボードのハードチェックも含め、簡単なPICのアセンブラ
プログラムを組んでみようと思い立つ。
→ 最初に作るアセンブラ・プログラム(IO_TEST.ASM)
<動作仕様>
SW1(RB1)_ON→ LED1(RA0)_ON
SW1(RB1)_OFF→ LED1(RA0)_OFF
このような、超単純な動作
尚、ターゲットボードは、チャイム音発生基板を予定
・ソースを作成し、MPASMにてアセンブルしてみた。
<結果>
@ ソースを置く場所(ディレクトリ・パス)が問題らしくソースファイルを指定して、アセンブルを開始する途端に
「ディレクトリ・パスが長すぎる・・」旨の警告が出てアセンブル開始が拒否されてしまった。
→ 当所、MPASMが置かれている場所(WIN\program_file\Microchip\・・・)下に、ソースを置いていたが、これを
C:\work_asm\IO_TEST_PIC16F64A\の下に置くようにしたら、無事アセンブルが開始された。
A 開始されたが、次のエラーが発生
Error[113] C:\WORK_ASM\IO_TEST_PIC16F84A\IO_TEST.ASM 16 : Symbol not previously defined (OxFF)
→ どうも、OxFFが、前もって定義されてない旨のエラーらしい。
よくよく、見ると、頭の、0でなければいけないところ、アルファベットの'O'になっているではないか??
(これは、その時は気が付かずこれを、H'FF'と修正して、エラーを無くしたが・・・そんな事だったとは・・しかし、WINの
メモ帳の字体で見ると、その変化はよく見ないと判らないほど微妙である。)
エラーを無くした後のアセンブル結果のダイアログを下に示す。
・Windows MEの PCにも、WIN版の「PICライタ・ソフト」をインストールしIO_TEST.HEXを書込んでみた。
→ 秋月ライタに付属の、「PIC16F84A」をソケットに差込みプログラムするが、何故か、「消去されていません・・上書き
しますか」のメッセージダイアログが出現。空の、ROMのはずなのに??(リードしてみると、オール0)
無視して、書込むと、無事書込み成功
ちなみに、CHECK SUM=263D
→ 後でハードが出来たら、動作確認してみる。
■ 2012.04.17
・当初は、チャイム音発生基板を、PIC16F84_トレーニング用と兼用にしようと思っていたが、手持ちの部品だけで、何とか、
トレーニング基板を作れそうなので急遽、製作することにした。
(ネックになる部品としては、18pinICソケットがあったが、大昔、BASICシステムを自作した時の、24pinICソケットが、
あったので、それを改造して間に合わせた。)
→ 2H余りで、製作完了
・本日、マルツ分の部品も到着した。
■ 2012.04.18
・部品は揃ったが、予めアセンブラで簡単なプログラム(SW_ON→LED_ON)を組んであったので、その動作確認をしたく、
IO冶具等の整備をすることにした。
・製作済みの、トレーニング基板の、ハード・チェックを行った。
→ PIC実装前の電源チェック→ 特に問題なし(Vcc=5.10V)
・HEXを焼いたPICを実装し、動作確認を行う。
→ SWを押しても、LED点灯せず。
→ ソースを見ると、LEDの点灯論理が逆(負論理のところ正論理)になっていることが判り、修正したが、それでも駄目
→ よくよく考えると、C言語でプログラミングしていた時の、コンフィグワードの設定を、していないではないか・・・
(PIC16Fでは、コンフィギュレ-ション ヒュ-ズと表現しているようである。)
→ プログラムの最後に、以下を記述(頭でも、たぶん構わない・・)
;************** コンフィギュレ-ション ヒュ-ズ設定 *************
;コ-ドプロテクション OFF/パワ-アップタイマ イネ-ブル
;WDT ディスエ-ブル/HS オシレ-タ
;
__CONFIG 03FF2H ;PIC16F84対応
;
→ これを追記して、HEXを焼き動作確認したら、OKとなった。
※ 以下に、PICライタのコントロール画面での、Config
Wordの表示と、トレーニング基板で動作確認している所を
示しておきました。またトレーニング基板の回路図と、Cソースのリンクを貼っておきました。
・PIC16F84A_トレーニング基板の回路図は、こちらから→ 「PIC16F84A_トレーニング基板の回路図」
・簡単なIO_TESTのアセンブラソースは、こちらから→ IO_TEST.ASM
■ 2012.04.19〜2012.04.20
・いろいろ準備で、横道にそれてしまったが、ようやく本題のチャイム音発生基板の製作が始まった。
■ 2012.04.21
・ユニバーサル基板実装上がり。
なかなか、アナログ部の部品点数が多く、配置を考えながらのハンダ作業が大変で、2日掛かってしまった。
・実装上がり後のチェック
@ IC未実装時の電源電圧チェック
MPU: 5V OK(約5.5V)
M3900: 5V OK(約5.5V)
LM386: 5V OK(約5.5V)
MPU MCLRピン OK
A IC実装時の電源電圧チェック
MPU他 全てOK(約5.3V)
B 山名氏から提供されている、CHIME.HEXをそのまま焼いてみる。
→ 電源ON時、「ピコッ」という起動音が出力されるか?
→ 問題なく出力された。
ただ、VR1_MAXでやや音量が小さいか?
(配線は一発OKのようだ)
C PIC24F_コード発生時具を接続して、登録されている曲(全31曲)
が全て再生できるか?
→ 再生できた
→ 送出コード0と1は、同じ音(ピコッ)であった
→ 曲番2〜20までは、山名氏の記事に記載されている<表1>登録チャイム音(1部のみ)と同じこと
を確認した。
21以降もメロディぽい音が登録されていた。
D オクターブ・コマンドの確認
→ 'o'で、オクターブ上/ 'O'で、通常動作を確認
■ 2012.04.21〜2012.05.25
※ この約1ヶ月間に実験したことの、まとめとして、以下の3つの実験資料(図表等)を公開します。
@ EEPROMに登録されている、全31曲分の、WAVデータの取込(最終的にMP3ファイルにミックスダウンしました。)
・ローランドのSC-D70により、基板のSP出力をサンプルし、これをWAVデータとして取込、MP3にミックスダウンして
登録曲の再生及び、波形評価を行いました。
波形評価には、時間軸の測定が必要なので、波形編集ソフト(Cool_Edit_Pro)を使って測定を行いました。
・また、曲番1〜31を連続再生するに当り、任意コード発生時冶具のコード設定を、0xFFにした時、DEMO演奏
ということで、曲番コードを適当なインターバルで連続送出するように、冶具のソフトをいじりました。
♪♪→ DEMO演奏を録音した、MP3ファイルはこちらからどうぞ: PIC_CHIME_DEMO.MP3
A 曲登録と波形一覧を図表にまとめました。
・曲番1〜22までについて、エンベロープ制御タイミング(UP*/DWN*/CK*/SP出力)を、SC-D70に取込み
実測データとして手書きでまとめました。
(音声用のサンプラーなので、直流分はカットされてしまい、矩形波は微分波形のようになり正確さには欠けますが
タイミングを把握するには問題ありません。)
尚、SP出力波形については、MIDI-WAVソフト(Cake
Walk Home Studio 9)の波形プレビュー画面を切り取り貼り付
けておきました。
※ 曲登録と波形一覧の図表へのリンクはこちらからどうぞ: 曲登録と波形一覧.htm
B エンベロープ制御シュミレーション一覧を図表にまとめました。
・CR充放電波形をモニタしようと思ったのですが、自作オシロの簡易プローブでは、プローブ容量が影響して音質が変わって
しまい、正しい測定ができないので、シュミレーションにて、CR充放電(エンベロープ制御の1部ですが・・・)波形を、
それぞれの、UP/DWNタイミング(動作モード)で確認してみました。
これを見ると、制御のしくみが少し理解できると思います。
・シュミレーションには、仕事でも時々使っていた、気楽に工作感覚で使える、マイクロネット社の
「Circuit Viewer V2.6」を使用しました。
※ エンベロープ制御シュミレーション一覧の図表へのリンクはこちらからどうぞ: エンベロープ制御シュミレーション一覧.htm
■ 2012.06.01
・追試:ADSR典型波を実機で出力してみたい。
(シュミレーションのようになるかを確認)
→ ROMデータでは無理(10mS単位で、コントロールしているため、10m以下のディケイは今のアルゴリズムでは実現できない。
かといって、asmプログラムを解析する気にはなれない。
→ そこで、ADSR出力するための、コントロール信号(UP1,DNW1,CK1)のタイミングを、Cで書いてみて、その出力を実験基板の、
チャイム音発生ブロックに突っ込もうと思う。
※ つまりは別PICで簡易パターンジェネレータのようなものを作ればよいはず。
5V IFなので、dsPIC30Fトレ基板を使うことにした。以下に、接続ブロック図と、実験風景の写真を示した。
■ 2012.06.02
・極く簡単な、Cソースを作成
電源ONで、タイミング・パターンを無限に繰返すだけのプログラムにした。
■ 2012.06.04
・追試の結果は別リンクの図表を参照してください→ ADSR典型波出力実験結果図表.htm
尚、制御信号のパルス波が正しく表示されてませんが、これは観測に、ソフト・オシロ2を使用している為です。
ソフト・オシロ2は、DCモードには対応していません。
← 実験テーマ1に戻る TOP PAGEに戻る 実験テーマ17へ →