google-site-verification: google3bd66dd162ef54c7.html
FC2ブログ

圧力センサーMPS20N0040Dを使う、回路とソフトのテスト

 前の記事で圧力センサーの感度が判ったので、いよいよ回路とソフトを作って実際に圧力測定を行ってみます。今回の記事の結論を先に出すと、

▼炭酸ガス発生装置の圧力を測定
反応式CO2m圧力計テスト中
 圧力センサーを使って、CO2発生装置の反応槽(重曹タンク)の圧力を液晶画面に表示させるところまで行います。

▼回路図(クリックで別窓に拡大)
Arduinoを使った圧力計の回路図
 圧力センサーの出力を5倍の差動(差電圧)アンプで受け、更に12倍のアンプを通してArduinoに接続しています。

 1段目はオペアンプを3個使った計装アンプ構成にした方が良いのですが、作るのが面倒なので簡単な回路にしました。なお、差動アンプのゲインを欲張ると増幅率の精度が悪くなるので、ほどほどの倍率に留めています。また、オフセット調整のVR1には100Ωを使いたかったのですが手持ちが無かったので100Ω(R50)をパラにして誤魔化しています(副作用があります)。

 R6を可変抵抗にしてゲインを調整可能にしたくなります。でもそうすると、ゲインと同時にオフセットも変わってしまうので調整が面倒になります。そんなことで、ゲインは60倍の決め打ちで行くことにしました。なおゲインの最終調整はソフトで行うことにします。

 後段の12倍アンプと合わせ、全体の増幅率は60倍で、この倍率でセンサーのフルスケールである0.4気圧が、Arduinoのアナログポートのフルスケールの5Vにほぼ相当するようになります。なお、センサーのブリッジの供給電圧は電源電圧のままで安定化していませんが、Arduino側のADCのVrefも電源電圧のままで変化するので、電圧の変動の影響はキャンセルされるはずです。

 話が戻りますが、この回路のように整数の増幅率を持つアンプを作る時は、正確な抵抗比が必要な時に便利な、E24の数値の相対比率表を使うと便利です。まあこの記事の用途では、半端な増幅率になってもあまり困らないのですが、、

▼センサーとブレッドボード
圧力センサー MPS20N0040D
 半透明のチューブの先のDIPのICが圧力センサーです。

▼プログラム
/*  圧力センサー MPS20N0040D の動作テストプログラム
* 表示はmmAq 2018/11/11 ラジオペンチ http://radiopench.blog96.fc2.com/
*/

#include <LiquidCrystal.h> // LCDを使用

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // 液晶シールドを使用
float k1 = 931.1; // 1V当たりの圧力(mmAqの値)、要調整
float zeroPressV = 0.5; // 気圧ゼロの時の電圧

int mmAq; // mmAq単位の気圧(表現出来る範囲は±3.2kg/cm2)
char buff[10]; // 文字列操作バッファ sprintfで使用

void setup() {
pinMode(13, OUTPUT);
Serial.begin(115200);
lcd.begin(16, 2);
lcd.print("MPS20N0040D test"); // 1行目表示
lcd.setCursor(0, 1);
lcd.print("P= mm"); // 2行目固定表示
}

void loop() {
mmAq = readPress();
lcd.setCursor(2, 1); // 2行目3文字目から、
sprintf(buff, "%4d", mmAq); // 右詰め4文字で (マイナスは-nnn)
lcd.print(buff); // 圧力を表示
Serial.print(buff);Serial.println("mmAq");
delay(500);
}

int readPress() { // 圧力を測定してmmAq単位の値で返す
float p; // 圧力計算結果
long d; // ADC結果バッファ
long sumd = 0; // ADC累積値
digitalWrite(13, HIGH);
for (int n = 0; n < 100; n++) { // 100回
d = analogRead(0); // A0の値を読む
Serial.println(d);
sumd = sumd + d; // 平均処理のために累積
}
digitalWrite(13, LOW);
// 圧力計算式
p = k1 * ((sumd * 5.0) / (100.0 * 1024.0) - zeroPressV ) + 0.5;
return (int)p; // 結果をintで返す
}
 0.5秒間隔で圧力を測定し、キャラクタ液晶に表示するプログラムです。なお表示の単位はmmAqです。
 電圧から圧力に変換する係数(8行目のk1)の値は、前の記事の感度測定結果から持ってきた値です。
 約5000mmAqのスパンを10ビットのADCで刻むと、ステップは5mmAqになりこれでは分解能が不足します。そこで多数回測定して平均値を求めることで1mmAq単位の値を出しています。

▼ブレッドボードと液晶
圧力計のテスト
 右は液晶シールドで、この下にArduino UNO があります。

◆調整方法
 まずはゼロ調整を行います。センサーに何も接続していない状態で、VR1を廻して表示がゼロになるように調整すれば調整は完了です。なお、ゼロ調整した状態では、アナログポートへの出力(U3のピン7)の電圧は0.5Vになっているはずです(9行目の値で電圧は変更可能)。つまり、気圧ゼロは0.5Vで、それより電圧が低ければ負圧ということになります。

 なお、気圧ゼロを0ボルトに設定する手もあります。でも今回のようにオペアンプを片電源で使うと、0ボルト付近の挙動が怪しいので、アナログ回路ではオフセットを付けておいた方が安心です。ちなみに、オフセットは後でソフトで差っ引けば良いし、そもそも0ボルトを基準にすると負の圧力が表現出来なくなります。

▼スパン確認
調整と動作確認
 測定範囲確認のためにシリンジで圧力を加えているところです。確認の結果は、測定範囲 -465 ~ 4181mmAq で、狙い通りでした。

 動作は大丈夫そうなことが確認出来たので、実際の水槽に接続したのが最初の写真です。

◆まとめ
 念のためにU字管を使ったマノメーターで圧力の測定精度を確認しましたが、圧力の値はほとんど一致していました。ということで、k1の値は事前調査の値のまま変更しないで済みました。センサーの感度測定やアンプの倍率設定がうまくいっていた、ということで良かったです。

 最初の写真のように、実際の水槽に接続してみると、タンク圧力とCO2の泡の発生状態との関係が良く判って面白いです。現在の水槽の状態では、タンク圧力は750mmAq程度で、水深による圧力変化はもちろんありますが、圧力のほとんどはストーンの圧損によるものでした。

 ということで、圧力センサーを使ってArduinoで圧力を測定することが出来るようになりました。これをベースにすれば、いろいろな応用方法があると思います。世の中にはもっと高級な圧力センサーがありますが、基本はこの回路のようなブリッジアンプになっていることが多いはずです。ブリッジアンプを一度自分で作ってみるのは、良い経験になると思います。

 次回の記事では、これを化学反応式のCO2発生装置に組み込む予定です。
関連記事

コメントの投稿

管理者にだけ表示を許可する

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード