mbedとクルマのメーターで
オーディオレベルメーター(電圧計)

<目次>

動作例の動画

まずはYouTube動画で動作の様子をご覧ください。

ピークメーター編

回路は複雑になりますが、PWM信号を12V電源のパワーアンプで増幅し、能動レールスプリッタを用いるため複数個の交差コイルメーターを並列接続しても元気に動きます。

VUメーター編

回路が簡単ですが、PWMをポート直結で取り、抵抗分圧レールスプリッタを用いるため電流不足で応答速度は上げられません。
※VUメーターのようにゆっくりと動くというだけで、正式なVUメーターの規格(wikipedia)は全く満たしておりません。
・音源:フリーBGM・音楽素材MusMus(http://musmus.main.jp/)

<ハードとソフト>

この回路は数Wで鳴るスピーカーと組み合わせることを前提に作ったため、1V程度以上の音声信号を入力しないとまともに動作しません。
図中に記載はしておりませんが、ヘッドホンアンプやマイク等の小信号に組み合わせる場合は、別途アナログ増幅回路が必要になります。

音声信号を整流したのちマイコンでAD変換し、レベルに応じた角度で車の交差コイルメーターを振らせるのsin・cos成分を計算し、PWM出力で駆動します。
マイコンは負の電圧を扱えないため、デューティー比50%を0とし、メーターのグラウンド側はレールスプリッタ回路により電源電圧を分圧した仮想グラウンド点に接続しています。

なお、安い方法(USBシリアルアダプタで書き込む方法)を用いない場合、書き込み用端子を設ける必要はありません。

回路図(ピークメーター編)

VUメーター回路図

回路図(VUメーター編)

ピークメーター回路図

LPC1114用mbedソースコード(共通)

開発環境には mbed を使用しC言語で記述しています。
ソースコードはピークメーター・VUメーター共通ですが、ピークメーターはエミッタ接地でデューティー比が反転するためVUと交差コイルの極性が入れ替わります。
プラットフォームにLPC1114NF28を選択して新規プロジェクトを作成後、ソースコードをコピーしてお使いください。
LPC1768などでお使いになる場合は、ポート設定の部分を書き替える必要があります。

//LPC1114 交差コイル表示電圧計
#include "mbed.h"
#include "PwmOut.h"

#define kakudo_max 4.4 //メーターの最大振り角度(rad)
#define bairitsu 10 //ad変換値に掛ける倍率

//交差コイル駆動PWM出力ポート
PwmOut sin_coil(dp1);
PwmOut cos_coil(dp2);
//信号入力
AnalogIn voltage(dp13);

int main() {
 float data = 0.0;
 double theta = 0.0;
 double s = 0.0;
 double c = 0.0;

 //PWM周期設定(メーターから聞こえる「ピー」という音が気になる場合はマイコンの性能と相談しつつ減らします)
 sin_coil.period_us(50.0);
 cos_coil.period_us(50.0);

 while(1) {

  //AD変換値(0.0~1.0)を読み取り倍率を掛ける
  data = bairitsu * voltage.read();

  //2πに掛けて振るべき角度(Θ)を求める
  theta = 6.28 * data;

  //角度がオーバーしていなければPWMのデューティー比を更新
  if(theta < kakudo_max)
  {
   //sin(Θ)とcos(Θ)を求め、-0.5~+0.5の範囲に圧縮する
   s = 0.5 * sin(theta);
   c = 0.5 * cos(theta);
   //圧縮したsin(Θ)とcos(Θ)を0.5オフセットし、0.5を中心としてPWMの設定範囲である0.0~1.0にする
   cos_coil = c + 0.5;
   sin_coil = s + 0.5;
  }
 }
}

<調整>

ハードウエアの調整個所

直流バイアス
ダイオードの順電圧分をオフセットするためのバイアスです。
交差コイルメーターには一般に0km/hの部分にストッパーがついていますが、無信号時にわずかにストッパーから浮くくらいのポイントに調整します。
C1
直流カット兼ハイパスフィルタ用のコンデンサです。電解コンデンサでも構いません。
重低音で振らせたい場合は数10μF程度、ボーカルに合わせて振らせたい場合は0.1~数μF程度になります。
ハイパスフィルタを一緒に構成するR2に合わせて調整します。
R1
小さくしすぎると大音量時に保護用のLED2を焼き切った後マイコンが破壊されます。
LED2許容電流 > (アンプの最大出力振幅-1.8)/R1 となるように設定します。
C2
整流回路の平滑コンデンサです。電解コンデンサでも構いません。
小さくすると指針の応答が良くなりますが、小さすぎると十分平滑されず不自然な動きになります。
VUメーターのようなゆっくりした動きが良い場合は数十μ程度、ピークメータの場合は0.1μF~といった感じです。
※R1やR2が大きい場合、C2も小さくしないと応答が遅くなります。
R2
ゲイン調整・平滑コンデンサ放電抵抗です。R1の値に応じゲインを調整します。
針の戻り具合調整にも使えますが、ハイパスフィルタやゲインとの兼ね合いもあり極端に小さくしたり大きくしたりすると都合が悪いです。

ソフトウエアの調整個所

最大振り角度
最大振り角度をラジアンで指定します。
入手した交差コイルメーターのフルスケール角度+αを設定します。
倍率
AD変換値に掛ける倍率です。
大きくしすぎるとオフセット調整が困難になり、またノイズを拾って針が暴れます。
マイクなどの微小信号で振らせたい場合は、この値は10程度にとどめ、アナログ信号を増幅することで対応します。

参考:定数設定例

ノートパソコン(EPSON NJ2050)のヘッドホン端子を無負荷・最大音量で出力した場合で動作確認済みの定数です。
参考にしていただければ幸いです。
ハードウエア:R1=1kΩ,C1=1μF,R2=10kΩ,C2=3.3μF
ソフトウエア:サンプルソース通り

参考:交差コイルの端子探り

メーターから基板をすべて取っ払ったら、乾電池か電源装置を用意し「sin(π/2)=1・cos(π/2)=0」と「sin(π)=0・cos(π)=-1」を使って探します。
約90度くらい振るコイルがsinコイルでその時の電源の極性がコイルの極性、0と反対向き(120km/hくらい?)へ振るコイルがcosコイルでその時の電源の極性がコイルの極性と逆になります。