No.71

arduinoを利用

地電流データロガー

2022年8月掲載

地電流の設備
気象庁地磁気観測所HPより
https://www.kakioka-jma.go.jp/knowledge/ec_bg.html

  地 電流とは

  大地には色々 な原因によって微弱な電流が流れているそうです。それを地電流とい います。 茨城県にある地 磁気観測所でも1kmあたり電 位0.2〜0.3V の地電流が観測されています。地電流の電位には地磁気の変動と連動して振動するような変 化が見られ、これは太陽活動による電離層の変化が誘導したものです。

 それらの振動分を除いた直流の自然電位の変化は地下で起こる 変化を 反映しているので、地質構造の探査に役立てられており、火山活動や地震活動による異変を知る手段にもなり得るということです。また、自然電 位は微弱なので、人工的に電流を流して抵抗値を観測する方法も行われるということです。



校庭に杭
校庭の地面抵抗

 地電流のことを知った生徒が校庭の地面抵抗を測定 することに取り組みました。
運動場の一角、20mの距離に長さ1.5mの鉄杭を打ち、数ボルトの電源で電流をなが し、 抵抗値を測ります。もちろん、天候や気温で、あるいはひょっとすると地震によっても抵抗値が変化するかもしれない、という期待のもとでで す。

  自動で抵抗を測定し、記録し続ける必要があるので、そのためのデータロガーを製作しました。比 較抵抗と地面抵抗と直列に接続し、比較抵抗の両端の電圧を 測定します。その電圧をマイコンを使ってSDカードに記録させる方式としました。

データロガー デー タロガーの構成
使用したマイコンはArduino-UNOです。SDカードデータロギングシールドの基盤をUNOに上から差し込めば、それだけで ボードの準備はOKです。専用言語のSketchでプログラムを作成します。

 UNOのアナログ端子で電圧を測定することを続けて100回行い、それらの平均値と、その時の内臓時計の時刻を1レコードとしてSDカードに追 記するようにしました。この1回で約0.08秒ほどの時間が経過します。若干の変動はありますが、1秒間に12回くらいのペースで記録されて行き ます。
 これで、SDカードに何日分でも連続して保存されます。しかし、1日分で百万レコードを越えてしまいます。データをexcelにコピーして処理 しますが、読込、抽出やグラフ化などの処理時間が長くなるので、2〜3日分くらいまでが我慢の限界かも知れません。少しキザミが細かすぎました。
 
1st_graph

最 初の測定結果
 左が最初の測定結果です。
 グラフが細かい階段状になっているのは、電圧測定の分解能のためです。Arduinoのアナログ入力の
A/D変換では、0〜5Vのアナログ電圧を10bitの値、つまり0〜1023の整数値にします。した がって電圧の 分解能は約5mVです。このため、電圧変化は階段状に表されます。そこから計算された抵抗値の変化も階段状になります。グラフで抵抗 値変化の狭い範囲を見ようとすると、この階段状の形が目立ちます。特にこの測定では、使った比較抵抗が460Ωと地面抵抗に比べて大 き目 だったため、電圧変化はばが小さくなり、抵抗値変化の階段がよ けい大 きめに表れたのです。
 さて、グラフは、意外にも抵抗値が20%ていどの幅で大きく変化しました。
横 軸の一目盛りが1時間を表しています。測定開始後30分とその約24時間後に極小値があります。これは、放課後の運動場使用のためか、と思われました。
 また、全体に徐々に抵抗値が上昇傾向にあります。当初は、前日雨だった土壌が徐々に乾いているためか、とも思えました。その本当の
理由は何でしょうか。 

その後の測定
 その後の測定から次のことが 分かりました。
 @
測定を続けると抵抗値の上昇はさらに続くこと。

  A電極の正負を逆転させて抵抗値を測定すると、小さい抵抗値になる
 B
最 終的には抵抗値は∞となり、測定不能になった。
   以上の事実から、電極表面の状態が通電によって変化したためではないか、と推測されました。
 

電 極の表面状態の変化
@杭を打ち込んだ場所を深く掘ってみると、約10cmの砂礫層の下は厚い粘土層であることが分かりました。電極の大部分 の表 面は水分を多く含む粘土層に接して いるので、降雨と乾燥による砂礫層の水分変化の影響は比較的少ないと考えられます。
A引き抜いた電極の表面は土中の部分が変色していて、特に陽極側が黒く変色していました。
Bポリバケツ中に砂礫と粘土を入れて測定場所を再現し、短い電極を差して電流を流す実験でも、 電極表面には同様の変化が確認できました。


分極を含めた回路
  このようにして、通電による電極表面の変化 が抵抗値の上昇傾向の原因と分かりました。通電によって、電極表面が溶出したり、電極表面に 析出したりすることで、電極の表面に小さな電池が生じてしまったわけです。

 そうすると、左図のように、測定している電極間の電圧は、地中の抵抗による電圧降下に、電極 表面に形成された電池の起電力を加えたものになります。測定が続くと図のEpがしだいに大きく なり、電極間の見かけの抵抗値はしだいに上昇するということになります。


対策は?
 電極表面の溶出・析出を抑える策を色々と検討しました。
@杭の表面材料を炭素などにすれば、電極の溶出そのものは無くなります。しかし、そのかわり、表面に何かしら別な物 質が溜まるはずです。根本的な解決にはなりません。
A電極を大きくして表面積を増やせば、電流値が同じなら、おそらく面積に反比例して電解の影響は小さくなるはずで す。しかし、巨大な電極の埋設は大ごとです。また、影響を少なくはできるでしょうが、ゼロにすることはできません。
B印加する電圧を小さくした方が影響は少なくなるでしょう。しかし、測定器の電圧の分解能がさらに悪くなってしまい ます。
C電源を交流にしたらどうでしょうか。電流による電解で起こる化学反応を、すぐに逆電流で逆反応させれば元にもどる ことになります。調べると、電気工事の専門家が接地抵抗を測定するときには分極による誤差を回避するため交流を使う そうです。
 このような検討の結果、交流電源を用いて測定する案に至りました。


  

交流による測定
交流印加

 Arduinoマイコンのアナログ端子は0〜5Vの直流電圧しか測れず、しかも 負の電圧をかけることができません。
 そこで、左図のように2.5Vの直流電源を直列に接続して、その負極を電位0Vとします。 瞬間の電圧が+2.5V〜-2.5Vまで変化する交流電源を使えば、V0,V1,V2の電位は何れも0〜5Vの正の値にな るので、Arduinoで測定可能になります。
 ところで、上で言う最大値が2.5Vの交流を普通の交流電圧計で測定すると2.5Vを示しません。1.8Vを表示し ます。これは実効値です。最大値2.5Vの交流の電圧実効値は2.5÷√2≒1.8Vなのです。
   なので、この測定では交流1.8Vの電源を使えば良い、となります。
 V0,V1,V2の電位を測れば、地面の抵抗Rは次式で求められます。



測 定のタイミング
V2の変化
 

 電位差が小さい瞬間に測定すると、A/D変換による分解能が悪くなります。そこで、V2が最大値5.0V近くの値、左 図のVhになった時、 V0,V1,V2の電位を測ることにします。Vh=5.0としな いのは、長時間の測定の際に電源電圧の変 動が心配だからです。また、同じ理由で2.5Vの直流電源の電位V0も毎回測る ことにします。

 これで、交流電源が50Hzなら1秒間に50回の測定になります。50回の平均値を計算して結果をSDカードのtextファイルに 追記します。1秒ごとに1データ記録することになります。

 Sketch は以下のようにしました。


1 //
2 // 地抵抗測定用データロガー(AC版)   
3 // 2022/07/16 Kobayashi .Y  
4 //   交流電源の1周期ごとに1回サンプリング (V2,V1,VC )
5 //   50回分の平均値から Ratio=R/R0 記録データとする。
6 //   時刻,記録データ をSDに追記する。(約1回/秒)

8 #include <SD.h>         //SDライブラリCODEをメモリに転送
9
10 const int chipSelect =10;   //SD基盤SS_pin(digital)
11 const int LEDPIN =7;     //点滅LED(digitalPin) 
12 const int FRZPIN =5;     //フリーズボタン用(analog)
13 const int V2_PIN =2;    //V2 (analog)
14 const int V1_PIN =1;    //V1 (analog)
15 const int VC_PIN =0;    //VC (analog)
16 int V2=0;               //電源電位 
17 int V1=0;               //抵抗体の接続点の電位 
18 int VC=0;               //バイアス電源の電位 
19 int SVAL=0;            //アナログ値読み取り用変数
20 float RATIO=1.000;        //測定抵抗/基準抵抗 の値用
21 unsigned long timeMS=0;  //時刻用の変数       
22 String DATASTRING = "";  //書き込む文字列用変数
23 unsigned long VSUM2=0;   //V2合計用変数
24 unsigned long VSUM1=0;   //V1    〃
25 unsigned long VSUMC=0;   //VC    〃
26 int FLAGP=0;             //サンプリング可不可フラグ
27 int VH=1024*0.95;   //設定値:V2がこれを越えたら測定
28 int VL=1024*0.5;     //設定値:V2がこの値を下回ったら 可に
29 int NSUM=50;        //設定値:何回の測定で平均を求める         
30
31 void setup() {
32   Serial.begin(9600);
33   if (!SD.begin(chipSelect)) {      //カード不良なら停止
34     Serial.println(""Card failed, or not present"");   "
35     while (1);
36     }
37   Serial.println(""card initialized."");"
38   pinMode(LEDPIN, OUTPUT);"
39
40 ADCSRA = ADCSRA & 0xf8;   // AD変換の分周比を
41 ADCSRA = ADCSRA | 0x04;   // 16(100)に変更
42 }
43


44   void loop() {
45   V2=analogRead(V2_PIN);
46   V1=analogRead(V1_PIN);
47   VC=analogRead(VC_PIN);
48   if (FLAGP<500 && V2>VH) {    
49   VSUMC +=VC;
50   VSUM1 +=V1;                       
51   VSUM2 +=V2;
52   NSUM --;                       
53       if(NSUM<1) {             //サンプルが50個たまったら
54         digitalWrite(LEDPIN,HIGH);"
55         RATIO=(float)(VSUM2-VSUM1)/(VSUM1-VSUMC);
56         timeMS=millis();                              
57         DATASTRING=String(timeMS,DEC);
58         DATASTRING += "","";
59         DATASTRING += String(RATIO,DEC);
60         PrintToFile(DATASTRING);    //SD書込みサブルーチンを呼ぶ
61         Serial.println(DATASTRING);     
62         NSUM=50;
63         VSUMC=0;
64         VSUM1=0;                       
65         VSUM2=0;
66         digitalWrite(LEDPIN,LOW);
67       }  
68   FLAGP=1023;                  //サンプリング不可に  
69   }
70   if (FLAGP>500 && V2<VL){  
71   FLAGP=0;                    //可に
72   }
73   SVAL=analogRead(FRZPIN); 
74   if (SVAL<100){              //フリーズボタン
75         exit(0);
76     }
77 }
78 void PrintToFile(String dataIn){      //SD書き込みサブルーチン
79 File dataFile = SD.open("datalog.txt", FILE_WRITE);
80   if (dataFile) {
81     dataFile.println(dataIn);
82     dataFile.close();
83   }
84   else {
85 Serial.println("error opening file");
86   }
87 }


当初気になったのは45、46行、2回のanalogReadの時間差です。V2とV1を連続で測定(A/D変換)し ま すが、この測定に 時間差があるとR/R0の値にズレが生じます。  交流50Hzの1周期は20msですが、デフォルトのanalogReadは1回で0.10msかかり、この時間差が気になります。なので、A/D変換の分周比を 128から16に変更して高速化し、測定1回を0.013msに短縮しました。(40,41行)

生徒は交流を使う測定の準備に取り掛か りました。測定結果が出たら、掲載します。

 実験メニューにもどる