オーディオ用スペアナ製作

スイッチサイエンスで販売されているチップを眺めていたら、スペクトラムアナライザMSGEQ7LEDドライバが並んでいて、「あー、スペアナ作れるよってことね」と思い、オーディオ用のスペクトラムアナライザを製作。


ベース基板。MSGEQ7を2つ積んで、ステレオ2ch × 7バンド(特性は下記)のレベルを取得します。
左から16ch LEDドライバ、Arduino Pro、MSGEQ7×2と周辺パーツが並びます。裏面にステレオミニジャックとACアダプタジャックがついてます。


ベース基板の上に乗る表示基板。表示用には秋月のバーLED(緑×5、黄×3、赤×2のタイプ)をレールで購入しました。左右対称に、真ん中から順に、左右chの63Hz、 160Hz、400Hz…用のレベルメータです。
あとはひたすらLED140個分をハンダ付け…(o´Д`)=з。バーLEDは基板に刺す前に、アノード側の足を全部根元で折り曲げてハンダ付けし、アノードを1つにまとめてしまったりとか、割と無茶して並べてあります。


MSGEQ7は、ストローブ信号を送ると順番にバンドが切り替わって、対応する電圧が出力されるので、それをAruduinoのADコンバータで読み取り、10レベル(1目盛りで約3dBのlogスケール)に変換します。

変換した値に基づいて、各バンドに対応したLED10個を順にダイナミック点灯していきます。購入したLEDドライバは16chを同時に駆動できるため、余った6ch分もダイナミック点灯用のトランジスタをドライブするのに流用しています(こんな使い方していいのかはよくわからないけど)。ダイナミック点灯に必要なpinは、左右ch選択 2 + バンド選択 7の9pin。 残りの3つはArduinoのデジタルポートから直接ドライブします。


他に、ピーク検出&表示(一定時間max値を維持した後ドロップするアニメーション)を入れてみたり、起動アニメーションで文字らしきものを表示してみたりして遊んでいます。


スモークグレーのアクリルケースに入れると結構きれい。


参考までに回路図(適当なので間違いがいっぱいあるかも(汗))。表示基板部分は同じ構造の繰り返しのため大幅に省略してあります。

[リンク先の「オリジナルサイズを表示」で拡大]


スケッチは本エントリの最後に。これとは別にLEDドライバ用のライブラリ Tlc5940 が必要です(リンク先の説明は分かりやすく参考になる)。
ただし、デフォルトの状態では14chでダイナミック点灯するには動作が遅すぎて、表示が激しくちらついてしまうので、ライブラリの設定を変更して動作を高速にする必要があります。
ライブラリの tcl_config.h というファイルを開くと TLC_PWM_PERIOD という定数が 8192 になっていますので、これを下記のように小さくします。

#define TLC_PWM_PERIOD    64

作ってくれた方が。

ケース苦労しますよね。

http://ehbtj.com/electronics/171/

続きを読む

Arduinoで電波時計を合わせよう

現在、福島第1原子力発電所の事故の影響で、東日本で電波時計の基準となる福島の送信所からの標準電波(JJY)の運用が止まっています。このため、電波時計の自動調整が行えなくなっています。(西日本は九州からの電波があるため問題ありません。)


このJJYを模擬した出力を、NTPを使って取得した時刻をもとにArduinoを使って発信*1して、電波時計を合わせるのに挑戦してみました。


PCのオーディオ端子を駆使して、同じことをするWindows用ソフトがあり、こちらに触発されて作ってみました。


JJYのフォーマットについては、下に詳しく説明があります。40kHzの電波のON/OFF時間により、1秒に1bitずつ、60bitの信号を1分かけて送信します。
標準電波の出し方


ハードウェアはこんなかんじ。

Arduinoの3pinに送信確認用LEDのアノードを接続し、カソードには適当にリード線を繋ぎます。リード線は、少しくるくる巻いておき、もう片方をGNDに繋ぎます。このリード線がアンテナの役割をします。信号は1mも飛ばないので、すぐ近くに電波時計を置きます。*2


電源を入れると、Ethernetシールドを使ってNTPで正確な時刻を取得します。取得に成功すると、0秒(正分)になったところから信号の送信が開始され、LEDがいろいろな長さで点滅しはじめます。(時刻やNTPの取得状況はシリアル出力を見ると分かります。)
送信が始まったら、合わせたい電波時計を強制受信モードにして、時刻を合わせるのがよいと思います。(なおArduino側は10分に1度NTPで時刻を再取得して時刻を補正しています。)


ソフトウェア的な工夫として、Arduinoからの40kHzの信号を出力するために、今回はPWM出力を使ってみました。AVRのレジスタを直接操作してPWMの周波数を40kHzに変更し、これをJJYのフォーマットに合わせてON/OFFしています。
ちなみにNTPのコードはIDE付属のEthernetライブラリのサンプルを改良してNTPと秒以下まで同期するようにしたものです。


以下、スケッチの内容です。Arduino IDE 0019以降用です。MACアドレスEthernetの設定などは、お使いの環境に合わせて変更して下さい。
また、下記からダウンロードできるArduino用のTimeライブラリをインストールしておく必要があります。
http://www.arduino.cc/playground/Code/Time

*1:勝手に電波を出しても良いの?という疑問が湧きますが、市販のFMトランスミッタ等よりもさらに弱い出力なので問題ありません。実際試してみたところ、到達範囲は感度の良い電波時計でも1mもいかない程度でした。

*2:もうちょっと共振回路らしくしても良いと思いますが、うちではこれで合わせられてしまったので追求しないことにしました。

続きを読む

電流センサ+Arduinoでコンセントの電流を測ってみた

スイッチサイエンスで売られている電流センサ ACS714 を使って、コンセントの電流を計測するモノを作りました。家電をON/OFFをモニターするとか、波形みたりもできます。

±5Aまでのと±30Aまで測れるのがあるけど、使ったのは5Aの方。

写真のようにコンセントと電源ケーブルの間にいれると、流れている電流が電圧値に変換されて出力される。


この写真はMacBook ProのACアダプタを繋いだところだけど、スイッチング電源なためか変な波形。半田ごてとか単純なものを繋げば、もうちょっと綺麗なsin波になります。


交流電流なので、出てくる電圧は2.5Vを中心にした交流波形(±5Aのだと185mV/A)になります。

アナログ回路で検波&整流しても良いのだけど、そのままArduinoに入力してデジタル処理した方が簡単だろうということで、下記のようなスケッチを書いてみました。Arduinoとセンサの接続は、アナログ3ピン←OUT、5V→Vcc、GND–GNDという感じ。

const int sensorPin = A3;    // pin that the sensor is attached to
const int hz = 50;           // frequency of signal
const int filter = 4;        // get average of several samples to reduce noize

// Current sensor (ACS714 5A)
int get_mA() {
  int max = 0, min = 32767, cnt = 0;
  unsigned long start = millis();
  do {
    int val = 0;
    for (int i = 0; i < filter; i++)
      val += analogRead(sensorPin);
    if (max < val) max = val;
    if (min > val) min = val;
    cnt++;
  } while (millis() - start <= 1100/hz); //10%+ for ensure p2p is acquired
  int mA = long((max-min))*9333/1000/filter;
  return mA;
}

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print(get_mA());
  Serial.println(" mA");
  delay(500);
}

出力は以下のような感じになります。

1324 mA
1325 mA
1312 mA
...

スケッチでやってる計算は、あくまで簡易的なもので、peak-to-peakの電圧値を求めて実効値に変換してるだけ*1。変換式は

 { \( V_{\rm max}-V_{\rm min} \) \over 2 \sqrt{2} } \times {5000 {\rm mV} \over 1024} \times {1000 \over 185 {\rm mV/A}} \simeq 9.33\( V_{\rm max}-V_{\rm min} \) \; { \rm [mA] }

という感じです。

ただノイズが多めで何も繋いでなくても0にならないのだった(30mAくらいの数値が出る)。小さい値は無視する必要がありそう。

*1:頑張って積分してもいいんだけど。。

ArduinoでFeliCaリーダー; 黒パソリ(RC-S330,370)に対応

ArduinoでFeliCaリーダー & ケータイにURLをプッシュ の続編です。


20101203024421

黒パソリこと、RC-S330,およびRC-S370に対応させました。


USBのエンドポイントがコントロール+インタラプト転送からバルク転送に変わった他、コマンド体系も少し変わっているようです。プロダクトIDから接続されたPaSoRiを自動的に識別して、アクセス方法を切り替えるようにしました。

使い方自体は、先の記事の説明と変わっていませんので、そちらを見て下さい。



FeliCa+Arduinoと言えば、シリアル接続のFeliCaリーダ/ライタ RC-S620/S の Arduino用の制御ライブラリが公開されていました。
http://blog.felicalauncher.com/sdk_for_air/?p=2677

RC-S620/Sはスイッチサイエンスさんで扱う予定のようですが、現在品切れ中になっています。
FeliCa リーダー・ライター RC-S620S - スイッチサイエンス


USBのものとしてはスティック型のリーダが発売されるようです。今のところ法人向けのみとのことですが。
Sony Japan | FeliCa | 法人のお客様 | 製品情報 | RC-S360/S・S360/SH

ArduinoでFeliCaリーダー & ケータイにURLをプッシュ

ArduinoFeliCaリーダーを作ってみました。

FeliCa PlugではなくPaSoRiを使っています。
SuicaEdyを交互に検出して、残高を表示しています。
おサイフケータイのように両方に対応するものは両方とも表示。


「WebTo」機能(三者間通信)も試してみました。ケータイをかざすだけで、URLをプッシュしてブラウザを起動させることができます。

使ったもの

PaSoRiライブラリとサンプルスケッチ

今回作ったスケッチをライブラリとして置いておきます。

旧バージョン: http://neocat.jp/arduino/Library-PaSoRi.zip (RC-S320専用)
現バージョン: http://neocat.jp/arduino/Library-PaSoRi-1.1.0.zip (RC-S320,330,370対応)

展開後のPaSoRiフォルダをスケッチのlibrariesフォルダ内に格納して下さい。IDEを再起動すると、サンプルスケッチが File > Example > PaSoRi 内に現れるはずです。

ライセンスはMITライセンスとしておきます。あくまで試しに作ってみただけなので、動作は保証しかねます。RC-S330,370等では試してないので動かないかもしれません。 追記12/2 RC-S330,370にも対応しました。


なおこの他に

が必要です。

参考にしたサイト

IDm (FeliCa固有の番号)を使ってセキュリティボックスを作った方もいるようです。
ArduinoとFeliCaでセキュリティボックス - YouTube
上記のライブラリもIDmやPMmの取得に対応しています(詳しくはExampleスケッチを見て下さい).

IDE 0019以降向けにDNSライブラリを移植

http://gkaindl.com/software/arduino-ethernet で配布されているArduino用のEthernetDNSライブラリですが、IDE 0019以降ではコンパイルが通らず動作しません。これはEthernetライブラリがUDPをサポートするなど変更が加わった影響のようです。対応中だからそれまでIDE 0018を使ってくれとのことですが、何よりArduino Unoが使えないので困る。


拙作のTwitterライブラリでもEthernetDNSを使っていたため、IDE 0019では動作しなくなっています。


とりあえず本家が対応してくれるまでのつなぎとして、EthernetDNSライブラリを0019以降向けに移植しました。使い方などは全く同じです。なお、DNSの送受信中に消費するスタック(RAM)がオリジナルより200byteほど増えてしまっていますので注意して下さい*1


ダウンロードは以下から。

*1:0019に付属のUdpライブラリがパケットの部分送受信に対応しておらず、一括で全パケットを構築してから送信/一括受信してから解析しているためです。

I2C液晶ライブラリ

ストロベリー・リナックスのI2C接続できるキャラクタ液晶が手軽で便利そうだったので、いくつか購入。

たったの2線で通信できるので、他の液晶と比べて配線がとても簡単ですし、同じくI2C接続のRTC等とも相性が良いのが特徴です。あとアイコン表示があるのも何か楽しい。写真は秋月で購入したRTCと組み合わせて時計にしてみた例。


例によって(?)、Arduinoで簡単に使えるようにライブラリ化してみました。ダウンロードはこちらから。
http://neocat.jp/arduino/Library-LCD_I2C.zip

展開後のLCD_I2Cフォルダを ~/Documents/Arduino/libraries に入れればインストール完了です。
ArduinoIDEを立ち上げ直し、Files > Examples > LCD_I2C > LCD_I2C_sample を開くと、サンプルスケッチが見られます。

Arduinoと液晶の配線は、

続きを読む