YMZ294を動かす

学校では毎日同じ時刻にチャイムが鳴ります.これは,定時になるとリレーを動作させて接続された線を短絡する,プログラムタイマーという装置と,端子が短絡されるとチャイムが流れる装置を組み合わせて実現されており,業務用なので高価ではありますが,個人でも店を探せば通販などで購入することができます.

で,最近これをヤフオクで安く買い,30分毎に短いチャイムを,1時間毎に長いチャイムを,3時間毎に別のチャイムが鳴るように設定して使っているのですが,何かに集中していて気がついたら数時間が経っていたということがなくなったり,目覚まし時計で起きるのに失敗しても時報で目が覚めたりと,いろいろな効能がありました.

さて,時報のメロディーとして,学校のチャイム(ウェストミンスターの鐘,というものらしい)というのも風情があっていいのですが,やはり自分の好きな曲を流したいというのもあります.好きな曲と言っても,普通のPCM音声をパソコンから流すだけじゃおもしろみがないので,音源ICをマイコンか何かから制御して音を鳴らしたいところです.

音源ICというとFM音源が有名で,表現力も高く扱いやすいのですが,残念ながら生産が終了しており,個人が簡単に入手できるようなものではないようです.

そこで,秋月電子で500円で販売されているYMZ294というICを使うことにしました.これは,矩形波生成器とノイズ生成器,32段階の音量変化を3チャンネル備えたもので,表現力は必要最小限であるものの,入手性と価格は悪くないですし,いざとなったら汎用のマイコンでも比較的簡単にエミュレーションが可能に見えます.

ICの使い方についてですが,附属のデータシートによれば,ICのレジスタに音量や周波数などの情報を入れる領域が並んでいて,それをリアルタイムに書き換えると,その通りに音が鳴るようです.レジスタには8bitを1byteとしてアドレスが振られていて,アドレス長は8bitですが,実質的には4bit分のアドレスまでしかないようです.アドレスとデータの指定は8本のピンからパラレルに行います.

さて,これらの情報をもとに,装置の構想を練っていきます.少しずつ試作しながら設計を考えるという方法は,今回は目的のものがメロディーチャイムとはっきり決まっていることと,何度も秋葉原に通って部品を買い足していく余裕がないのでパス.もちろんデバッグのための試作はしますが,基本的にはかっちり仕様を決めて一発で完成させることが目標です.

  • 制御には汎用のマイコンを使う.具体的にどの種類のマイコンを使うかは後で決める.
  • 曲データは512Kb(64KB)のEEPROM,もしくはそれと同一のプロトコルをもつ容量のEEPROMに格納し,それに従って音源ICのレジスタを書き換える.
  • EEPROMに格納するデータのフォーマット:
    • 1つのEEPROMに収録する曲は1曲だけとし,データのヘッダなどはなく,EEPROMの先頭からいきなり曲データを開始する
    • 音源ICのレジスタアドレスを1byte,書き込むデータを1byte,この2byte固定長をデータの最小単位(ワード)とし,これをEEPROMにずらずら並べる.
    • 音源ICのレジスタアドレスは8bitのうち実際には下位4bitしか使わないので,上位4bitは好きに使えることになる.とりあえず,全bitが0のワードを曲の終了としたいので,通常の曲データは必ず最上位ビットを1とする.残った3bitは,将来音源ICの数を最大8つまで増やしたとき,デバイスを指定する番号に割り当てる.
    • 最上位ビットが0のワードは,曲の終了のほかに,ミリ秒単位の待ち,曲を無限ループする命令,次のEEPROMに入っている曲にそのまま移る命令(1つのEEPROMに収まらない大曲を複数のEEPROMにまたがって入れるのに使う),条件分岐命令(サビなどの繰りかえしに使う)に割り当てる.
    • 最上位ビットが0で,2番目のビットが1のワードは,条件分岐命令とする.残ったビットのうち上位5bitを分岐条件,残りの9bitを分岐先のEEPROMアドレスの上位ビットとする.分岐条件については,曲の開始時に0にリセットされるカウンタを用意し,分岐条件の値がカウンタの値以上だったら分岐を行うとともにカウンタをインクリメントする.これにより,サビ部分のサブルーチン的な呼び出し,リピート,ダ・カーポ,ダル・セーニョなどを指定できる.
    • 最上位ビットが0で,2番目のビットが0のワードは,基本的にはミリ秒単位の待ちであるが,0ミリ秒待ちというのは存在しないので,全ビットが0のワードは曲の終了であるというルールと矛盾しない.
    • ミリ秒待ち命令のうち,待ち時間を表すビットがすべて1であるワードは,次の曲へ続くことを表す符号とする.これは16383ミリ秒待ちという符号を潰してしまうが,ぴったりその時間を指定する機会は滅多にないだろうし,運悪くその時間だけ待ちたい事態が発生したら,16000ミリ秒待ってからさらに383ミリ秒待てばいい.
    • 次の曲へ続く命令と同様に,待ち時間を表すビットが,最下位だけ0でそれ以外1であるワードは,条件分岐のカウンターをリセットして曲の先頭に戻る,つまり無限ループ命令に割り当てる.
  • GNDと短絡させることで曲の再生を開始する端子を曲の数(EEPROMの最大数8つ)だけ用意する
  • GNDと短絡させることで曲の再生を停止して音源ICをリセットする端子を1つ用意する.
  • RS232のポートを用意し,そこから曲の再生開始と再生停止と,音源ICの直接制御を可能にする.
  • RS232のプロトコル:
    • 最上位ビットが1のバイトは,その次のバイトと合わせて,EEPROMのフォーマットと同様にして音源ICのレジスタ書き換える命令と見なす.
    • 最上位ビットが0で,その次のビットが1のバイトは,音源をリセットしてから,最下位3bitの番目のEEPROMに記録された曲を再生する命令とする.これは,曲再生端子の短絡と同じ動作である.
    • それ以外のバイトは,曲を停止して音源をリセットする命令とする.これは,曲停止端子の短絡と同じ動作である.つまり,RS232のビット化けなどでおかしな状態に陥っても,すべてのビットが0のバイトをいくつか送れば必ず音源がリセットされることになる.

と,ごちゃごちゃと仕様を書きましたが,問題はどの種類のマイコンを使って,どうやって実装するかです.実は私はArduinoを使ったことはあっても,マイコンを直接触ったことはないので,どういう基準でマイコンを選び,どうやって実装すべきかについてはまったく知識がありません.これが正しい選択かどうかはわかりませんが,とりあえず秋月電子に売ってるATTINY2313-20PUを使ってみることにします.

プログラムの開発はAtmelが無料で公開しているIDEで行い,プログラムの書き込みは,USB接続の書き込み装置をマイコンにつなぐだけでできるようです.この書き込み装置も,秋月で売ってます.

さて,装置の構想はおおよそ固まったので,部品を揃えます.とりあえず先週末,秋葉原で以下の物を買ってきました.

  • ATTINY2313-20PU(マイコン) x2(予備にもう一個)
  • ICソケット 20ピン x10(10個パックが安かったので)
  • 24FC512(EEPROM) x4
  • ICソケット 8ピン x10(10個パックが安かったので)
  • YMZ294(音源IC) x2(予備にもう一個)
  • AVRISP mkII(Atmel純正AVRライタ)
  • 1μF 積層セラミックコンデンサ x10(ノイズ除去用,容量はこれくらいでいいのか?)
  • ステレオミニジャック
  • D-sub 9ピンコネクタ(RS232用)
  • USBコネクタ(5Vの電源をとるためだけにUSBを使う……)

以上,すべて秋月で揃いました.あとは,通販で注文した,IOの数を増やすためのシフトレジスタが届けば,必要な部品はとりあえずすべての予定です.

とりあえずこの記事ではここまで

技術系 > 電子工作 | comments (1) | trackbacks (0)

コメント

ちじたぜ | 2017/11/18 04:59 PM

メロディICを使えば早いのに...
SVM7975Cとか。
SVM7910I、SVM7962C0Nなんかも

コメント投稿






トラックバック