ここから2回、水圧計測用のセンサーを紹介します。間隙水圧計測は地盤工学のモニタリングの中でも最重要項目ですし、水工学でも河川やため池の水位を計測する必要があり、水圧センサーの役割は大きいです。本ブログでは、後の「実践編」にて、水圧センサーを用いたテンシオメーターの作り方を紹介します。センサーを選ぶ際に、容量(何kPaまで測れるのか)や精度も重要ですが、実用上、以下に特に気を付ける必要があります。

 

・絶対圧センサーか、ゲージ圧センサーか?

 絶対圧(大気圧変動の影響をうける)を計測するのか、ゲージ圧(大気圧からの差分)を計測するのかは重要です。多くの応用(例えば水位計測)で、大気圧変動による圧力の読みは取り除きたい(水位とは無関係なので)ものになりますが、前者の場合は別途、大気圧の同時計測も必要になります。ただし、ゲージ圧計は大気圧補償を行うために空気穴がある場合が多く、防水性が低い(あるいはない)などの欠点もあります。

・アナログ出力か、デジタル出力か?

 これは圧力センサーに限った話ではないですが、出力がアナログ方式(電圧あるいは電流)か、デジタル方式か(I2Cなどの通信プロトコルに基づく)により、データ取得に必要なロガーが異なるので注意が必要です。

 

 今回紹介する圧力センサーのSMC製PSE570はゲージ圧計でアナログ出力(電圧)です。最も「典型的」なセンサーともいえます。直流で印加して直流電圧でデータが帰ってくるので、扱い方は、原理的には第24回の土壌水分計と同じです。このような圧力センサーは、たとえばRS Componentsのウェブサイトなどで検索すれば何百種類もヒットするので、好きなものを使えばいいのですが、ここ3~4年、このようにしていろいろなセンサーを使ってきた経験を交えて今回書かせて頂きます。

 

 SMC製PSE570はリード線付きでモノタロウにて1万円くらいで売っており、容量は0~1MPaです。姉妹品でPSE573というものもあり、こちらは容量が-100~+100kPaです。後者は負のゲージ圧が測れるので、テンシオメーター(負の間隙水圧が測れる装置)に用いることができます。容量以外はどちらも同じで、印加電圧DC12~24Vで、出力はDC1~5Vです。接続口にR1/8あるいはR1/4おねじが選べます。

 

 

ここで、印加電圧DC12~24Vというのが問題です。試したところ、DC9Vくらいまで印加電圧を下げても応答しますが(9V以上だったら、出力は印加電圧に依存しません。内部に電圧レギュレータが入っているのでしょう)、Arduinoからの印加はせいぜい5Vです。ですので、印加用に別の電源が必要となります。

 

では接続方法について紹介します。基本的にここまでの回の知識を応用するだけで、新しいことは大してありません。

 

①単純に連続印加して電圧をArduinoのアナログピンで読む場合

 以下のように接続します。PSE570のリード線のスリーブの色はわかりづらいので注意が必要です。茶:印加黒:出力青:GNDです。直感とかなり異なります。また、12Vの電源として鉛シールバッテリーを使っています(ネット上のどこかから頂いてきたFritzingのイラスト部品ですが、35Ahってすごいな・・・フィールド観測で使うのはせいぜい12Ahくらいだと思います)。エネループ(1.3V)の9本直列でもいけるでしょう。5V系のArduino UNOを用いる場合、圧力計測の分解能は、1.22kPa(=1000kPa/(5-1)V × 5V/(2^10bit))になります。2秒に一度、出力電圧を読んでいます。

 

 



void setup(void)

{

    /* ----- Setting up serial communication with PC ------ */

    Serial.begin(9600);

    while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only 

    }

}

 

void loop(void)

{

    float vinput;

 

    vinput=5000.0*analogRead(A0)/1023;

    Serial.print(vinput);

    Serial.println(" mV");

   

    delay(2000);

}

 

 

 

②必要なときのみ印加して電圧をArduinoのアナログピンで読む場合

第11回で学んだメカニカルリレー(GROVEリレー3.3V用)を使用します。リレーを開いて印加して1秒待ってから計測を行い、また次の計測時までリレーを9秒間閉じます。

 

 



const int RelayPin = 3; // リレーに信号を送るデジタルピン番号

 

void setup(void)

{

  /* ----- Setting up serial communication with PC ------ */

  Serial.begin(9600);

  while (!Serial) {

  ; // wait for serial port to connect. Needed for native USB port only 

  }

 

  pinMode(RelayPin, OUTPUT); // リレーに信号を送るデジタルピンを出力モードに設定

}

 

void loop(void)

{

  float vinput;

 

  digitalWrite(RelayPin, HIGH);

  delay(1000); 

  vinput=5000.0*analogRead(A0)/1023;

  Serial.print(vinput);

  Serial.println(" mV");

  digitalWrite(RelayPin, LOW);

 

  delay(9000);

}

 

 

 

③必要なときのみ印加して電圧をADS1115で読む場合

ADS1115については第8回を参照してください。ここでは、出力が1~5Vであることをふまえると、第8回に設定したADS1115のゲイン(利得)による計測範囲(4.096V)では不十分なので、ゲインを落として計測範囲を6.144Vまでとしています。分解能は0.023kPa(=1000kPa/(5-1)V × 6.144V/(2^16bit))となります。リレーの動作については②と同じことをやっています。なお、ここでは電圧を計20回読み込み、その平均値を表示するようにしています。これはADS1115で読むときに限らず、①②でももちろん同じことができます。

 

 



#include <Adafruit_ADS1015.h>    //https://github.com/adafruit/Adafruit_ADS1X15

 

#define AVERAGENUM 20 // 取得データの平均化に用いるサンプル数

 

#define CFACTOR 0.18750 // GAIN_TWOTHIRDS: +/-6.144V range: Calibration factor (mV/bit) for ADS1115

//#define CFACTOR 0.12500 // GAIN_ONE: +/-4.096V range: Calibration factor (mV/bit) for ADS1115

//#define CFACTOR 0.06250 // GAIN_TWO: +/-2.048V range: Calibration factor (mV/bit) for ADS1115

//#define CFACTOR 0.03125 // GAIN_FOUR: +/-1.024V range: Calibration factor (mV/bit) for ADS1115

//#define CFACTOR 0.01563 // GAIN_EIGHT: +/-/0.512V range: Calibration factor (mV/bit) for ADS1115

//#define CFACTOR 0.00781 // GAIN_SIXTEEN: +/-0.256V range: Calibration factor (mV/bit) for ADS1115

 

Adafruit_ADS1115 ads(0x48); // 0x48はADDRをGNDにつないだ場合のI2Cアドレス

 

const int RelayPin = 3; // リレーに信号を送るデジタルピン番号

 

void setup(void)

{

    /* ----- Setting up serial communication with PC ------ */

    Serial.begin(9600);

    while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

    }

 

    /* ----- Setting of ADS1115 AD converter ----- */

    ads.setGain(GAIN_TWOTHIRDS);

    ads.begin();

 

    pinMode(RelayPin, OUTPUT);

}

 

void loop(void)

{

    int cnt1=0;

    float read_from_ads;

    float averaged_input;

 

    /* リレーの駆動 */

    digitalWrite(RelayPin, HIGH);

    delay(1000); 

 

    /* ADS1115からの読み込み */

    averaged_input=0;

    for(cnt1=0;cnt1<AVERAGENUM;cnt1++) //AVERAGENUMの数だけ繰り返す

    {

      read_from_ads = float(ads.readADC_Differential_0_1()); //チャネル0から単動(Single End)入力

      averaged_input=averaged_input+read_from_ads/AVERAGENUM; //読んだ値を足していく:AVERAGENUMで割ることで平均化している

    }

    averaged_input=averaged_input*CFACTOR; //校正係数を掛けて電圧とする

 

    /* PCのシリアルモニタに表示 */

    Serial.print(averaged_input);Serial.println(" mV");

 

    /* リレーをOFF */

    digitalWrite(RelayPin, LOW);

 

    delay(9000);

}

 

 

ちなみに、Arduinoアナログピン(平均化なし)とADS1115(20回平均)で出力を比べると以下のようになります。ここではPSE570ではなく、たまたま手元にあったPSE573(先に紹介した、計測範囲-100~+100kPaの連成計)を使いました。大気圧(ゲージ圧0kPa)を計測したので、出力レンジ1~5Vの中間の3Vくらいが出力されるはずです。

 

  Arduinoアナログピン(平均化なし)

 

  ADS1115(20回平均)

 

後者の場合、ざっと+/-0.5mVくらいでばらついているので、精度としては200kPa/4000mV×1mV=0.05kPa、水頭にして約5mmです。

 

水圧センサーの選び方についてさらに

 圧力センサーの耐久性や性能はまちまちです。Amazonで水圧センサーを検索すると、1000円程度のものから見つかります。これらの中には、「適用流体:空気・水」とあるのに、水に触れると数日で錆びるものもあります。また、RS Componentsなどで4000円程度のものを買っても、やはり長期的に錆びたりします。また、PSE570のように(たぶん)電圧レギュレータが内蔵されていない場合、印加電圧によって出力が変わるので、印加用バッテリーの残存容量に依存して出力がドリフトしていきます(自身で電圧低下回路を作らなければなりません)。私も、ケチをしたせいでだいぶ損をしました。秋田の堤防に自作テンシオメーターを設置する際、まず1000円の圧力センサーから使い始めましたが、すぐにダメになり、1泊2日の秋田出張で4000円のものに交換。これも半年でダメになり、結局また出張をしてSMC PSE573に交換。最初から1万円くらいは払っておけばよかった。連れていった学生の旅費も含め、20万円はかかりました。

 ではPSE570/PSE573の耐久性はどうか?室内ではまず問題ありません。問題になるのはフィールドのほうです。これはゲージ圧計のため、リード線を接続する箇所のあたりに筐体に開口部があります。これを完全に塞ぐと、ゲージ圧計と絶対圧計の中間の中途半端な挙動になるでしょうし、大気圧がうまく漏れる程度に簡易防水とするしかありません。仕方がないのでゆるくシールテープを巻きました。堤防中に10個ほど埋設し、2年の間に3つくらいは機能しなくなりました。水浸せずとも、地中(土に直接触れるのではなく、塩ビ管の中に入れているのですが)では結露が起こるので、やはり完全防水できないものは原理的に無理があります。メーカーさんも、現地計測用として売り出しているわけではないと思います。一方、上に書いたように室内試験用としてはコストパフォーマンスに優れたよいセンサーだと思います(SMCさんの空圧機器は性能・デザインともによくておススメです)。