BNC入力、USB-C出力の簡易デジタイザです。アナログの電圧信号をPCに取り込んでモニタリングするのに使えます。
背景
とある研究で、電圧をモニタリングし、その値を使ってPCで何かしらの制御をしようとしていました。当初はロガーを使えないかなと思っていたのですが、調べてみるとロガーは内部メモリにログを保存するのが仕事で、PCと接続して常時電圧値を転送するみたいな使い方は想定されていないようでした。ならば仕方ない、簡易デジタイザ的なものを自作するかとなったわけです。
基本設計
- ちょっと信号をモニタリングしたい場合に使うことを想定してチャンネル数は1とする
- 小型のマイコンボードを使い、付属するADCを使って簡単にアナログ信号を取り込む
- アナログ端子はBNCのプラグにし、各装置のBNC出力端子に直接取り付けられるようにする
使用部品
秋月電子で買ってきました。
- マイコンボード: Seeduino Xiao (SAMD21)
- アナログコネクタ: BNCプラグ パネルマウント丸座
回路図は以下の通りです。マイコンへの入力部には3.3 Vのツェナーダイオードを入れて保護しています。そのせいで電圧が高くなってくると正しい値からずれますが、気にしないことにします。
3Dプリンタ
筐体は3Dプリンタで作りました。以下の2つのパーツで出来ています。STLファイルを置いておきます。
- BNC-Xiao-MiconBoard-side.stl (マイコンマウント側)
- BNC-Xiao-BNC-side.stl (BNC取り付け側)
2つのパーツを固定するのにM2のビットインサートとネジを使います。
- M2 ビットインサート(長さ2 mm程度)
- M2 ネジ
組み立て
- GNDピンと10番ピンにケーブルをはんだ付け
- BNC、ツェナダイオードなどをはんだ付け
- もう一方の筐体パーツにビットインサートを埋め込む
- はんだ付けした方のパーツを差し込んでねじ止めして完成
プログラム書き込み
マイコンに書き込むプログラムはArduino IDEで作りました。コードを以下に示します。
const int n_ave = 100; // 移動平均回数
const int in = 10; // アナログインプット端子
int cnt = 0; // 移動平均用のカウント値
float temp[n_ave]; // 移動平均用の配列
float v_ave; // 読み取り電圧値の移動平均
void setup() {
(12);
analogReadResolution.begin(19200);
Serial}
void loop() {
// --- 移動平均 ---
if (cnt == n_ave) {
= 0;
cnt }
[cnt] = analogRead(in);
temp= 0.0;
v_ave for (int i=0; i<n_ave; i++) {
+= temp[i];
v_ave }
= v_ave/n_ave * (3.3/4095.0);
v_ave += 1;
cnt
// --- コマンドの処理 ---
if (Serial.available() > 0) {
= Serial.readStringUntil('\n');
String cmd
// --- FETCH ---
if ((cmd == "FETC?")||(cmd == "FETCh?")) {
.println(v_ave, 4);
Serial}
else {
.println("");
Serial}
}
}
ポイントは次の通りです。
- SAMD21のADCは12bit対応なので
analogReadResolution(12)
で設定 analogRead()
だけでなく、念のため移動平均をとって出力- COMポート経由でPCから
FETC?
またはFETCh?
と送ると電圧値を返す(SPCIコマンドっぽく)
実戦投入
早速、実験系に投入しました。光パワーを受光器で測定してモニタリングしています。筐体の中でマイコンボードのLEDが光っているのが見えて、想定外にいい感じです。