電子工作の課題でスペアナ作ってみた

概要

WindowsXPで入力された音のスペクトルを解析して、パラレルポートから回路にデータを送り、16x32のLEDマトリックスに表示させる。

ソフトウェア

概要

VisualStudio2005で作成。waveInAddBuffer()あたりのAPIで録音。DFTでスペクトル解析する。解析したデータをパラレルポートから出力する。データは4bit(0〜15)×32列である。

パラレルポートからの出力

WindowsXP/2000/NTでパラレルポート制御

Windowsでやる場合はこのサイトを参考にする。やることとしては

  1. GIVEIOアクセスライブラリを使えるようにする。
  2. パラレルポートのモードの設定を確認する。
  3. パラレルポートのBase I/Oアドレスを調べる。

ぐらいだろうか。1,2は上記サイトに載ってる。3は上記サイトのBIOS画面にちらっと映っているとおり、BIOSの設定画面で確認できる。当たり前だが機種によって異なるので上記サイトのコピペではいけない。
GIVEIOアクセスライブラリの使い方は全部上記サイトに丁寧に書かれているのでもはや言うことはないだろう。

データの出力

15行(4bit)のデータをdata_portから2列分同時に送信する。デジタルデータなので、ただ単に出力しても、回路側は何がデータなのか認識できない。そこで、ストローブ(control_port)でタイミングを制御する。

  • ストローブを下げる
  • データを出力する
  • ストローブを上げる

ということを繰り返す。回路側はストローブの立ち上がりを検出したときにデータを読み込めばよい。もう少し厳密にやりたければハンドシェイク通信をしてもいいのかもしれない。
また、この作品の場合、列の同期を取るためにもう一本出力線を用意しておく必要がある。

ハードウェア

主材料
部品 購入店 価格 個数
16x16 Dual Color LEDマトリックス(LM1256) 秋月 \500 2個
サンハヤト2mmピッチ基板 千石 \700 1枚
ユニバーサル基板 千石 \300 1枚
25pin雄コネクタ+専用基板 千石 \700 1セット
2.1mm標準DCジャック(基板取り付けタイプ) 秋月 \30 1個
ピンヘッダ&ソケット2x13 秋月 \50+\50 4組
PIC16F690 秋月 \210 1個
TC74HC595(シフトレジスタ) 千石 \170 4個
TC74HC154(4to16デコーダ 千石 \140 1個
TC74HC161(4bitカウンタ) 千石 \100 1個
ICソケット 千石・秋月 --- 必要分
抵抗(1/6W)330Ω 秋月 \1 40本
抵抗(1/6W)1000Ω 秋月 \1 16本
2SA1015GR 秋月 \3 16個
LM1256

ググったらデータシートが出てくるのでピンの配置を調べる。このLEDマトリックスは地雷。ピンが2mmピッチだから。オリジナルの基板に作るならいいけど、2.54mmピッチのユニバーサル基板で回路を自作する場合はおすすめしない。悲惨なことになる。

回路の概要

PIC16F690で処理を行う。パラレルポートからの出力はすべてPIC16F690に入力する。
LEDマトリックスのダイナミックドライブはその他のICをPIC16F690でせいぎょして行う。

列は4bitカウンタの161でカウントし、154でデコードする。カウントアップのための線と、0行目を同期するためのクリアの線が必要。
行は各LEDマトリックスごとに1本のデータ線を用意する。3-stateの8bitシフトレジスタに流し込んでいく。流し込むためのカウンタ線、流し終わった後のラッチを行うラッチ線が必要。

PIC16F690の処理

main関数はLEDマトリックスのダイナミックドライブを行う。

  1. カウンタのクリアオフ
  2. 各列について
    1. ラッチをオフ
    2. 各行について
      1. クロックをオフ
      2. 点灯させるなら0を、点灯させないなら1を各データ線に出力
      3. クロックをオン
    3. ラッチをオンしてLEDMに出力
  3. カウンタのクリア

パソコンからのデータの読み込みは割り込み処理で行う。

動作

データ読み込みの割り込み処理の速度が遅いのか、でーたが左から右に読み込まれているのがはきりとわかる。スペアナとしては使い物になっていない……。通信のプログラムをうまい方法で改善できればもうちょっとちゃんとしたものにできるかもしれない。

感想

ハードウェアって難しい(;´Д`)