Arduinoでコンデンサの静電容量測定

 

こんなこと、やります。

  • Arduinoでコンデンサの静電容量を測定
  • Arduinoのデジタルピンのしきい値の測定

Arduinoでコンデンサの容量を測定する方法

つかうもの

この記事でつかうものをご紹介します。

Arduino

Arduino Uno Rev3を使用しました。

▼ もちろん、ほかのArduinoをお使いになってもらっても構いません。

もしまだArduinoをお持ちでないようでしたら、オススメArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へをご参考になさってみてください。

コンデンサ

0.01uF〜100uF程度のコンデンサが測定しやすいです。

その他の電子部品

LEDには1kΩ、100kΩ、2MΩの固定抵抗を使用します。2MΩがなければ、2つの1MΩを直列にして作ってください。

ブレッドボードやジャンプワイヤをお持ちでない方は揃えておいてください。

Arduinoで静電容量の測定する方法

Arduinoでコンデンサの静電容量を測定する
Arduinoでコンデンサの静電容量を測定する

Arduinoなどのマイコンボードでコンデンサの静電容量を測定するには、次の2つの方法が考えられます。

  1. 発振回路と組み合わせる
  2. コンデンサの時定数を利用する

ここでは❷の「コンデンサの時定数を利用する」方法でコンデンサの静電容量を測定します。ちなみに❶の方法は、Arduinoと土壌センサを使って土の水分量の測定のセンサ回路にヒントを書いてます。

時定数とは

時定数とは、コンデンサCに、E[V]の電圧を、抵抗R[Ω]の抵抗を介してかけた時、コンデンサCの電圧がEの63.2%まで充電される時間のことです。

つまり、コンデンサの電圧が、電源電圧の63.2%になるまでの時間が「時定数」です。

時定数をτとすると、抵抗値Rと静電容量Cは次の関係になることが知られています。

$$τ = RC$$

時定数の数学的な証明は、RCローパスフィルタのステップ応答をご覧ください。

静電容量の算出

アナログ電圧を測れるピンを備えているArduinoでは、時定数を測ることはカンタンです。

デジタルピンの5V電圧を、抵抗Rを介してコンデンサCへ充電します。コンデンサの電圧が、5Vの63.2%の電圧3.22Vになるまでの時間を計測すれば時定数が分かりますから、次の計算でコンデンサの静電容量を導き出すことができるはずです。

$$C = \frac{τ}{R}$$

Arduinoとコンデンサの配線図

こちらが、Arduinoでコンデンサを測定する配線図です。静電容量が未知なコンデンサCxと、抵抗RおよびArduinoを図のように配線します。

Arduinoでコンデンサを測定する配線図
Arduinoでコンデンサを測定する配線図

デジタルピンD2をHIGHにした瞬間、2MΩの抵抗を介して電流がコンデンサへ蓄電されていきます。コンデンサの両端の電圧は徐々に上がっていき、アナログ入力ピンのA5地点が、電源電圧の63.2%Vになるまで監視します。この時間を測定して時定数を導き出します。

ちなみに、デジタルピンD3と1kΩの抵抗は、コンデンサの電荷を放電してリセットさせるためのものです。

コンデンサの静電容量を測定するプログラム

コンデンサの静電容量を測定するプログラムがこちらになります。

/*
  Created by Toshihiko Arai.
  https://101010.fun/iot/arduino-measure-capacitance.html
*/
#include <Arduino.h>

const int PULSE_PIN = 2;
const int DIGITAL_READ_PIN = 3;
const int ANALOG_READ_PIN = 5;

const double E = 5.06; // GPIO電圧実測値
const double R = 2000000.0; // 2MΩ
const double V = E * 0.632;

void setup()
{
  Serial.begin(9600);
  pinMode(PULSE_PIN, OUTPUT);
  digitalWrite(PULSE_PIN, LOW);
}


void discharge() { 
  pinMode(DIGITAL_READ_PIN, OUTPUT);
  digitalWrite(DIGITAL_READ_PIN, LOW);
  delay(1000);
  pinMode(DIGITAL_READ_PIN, INPUT);
  delay(10);
}

unsigned long charge() {
  digitalWrite(PULSE_PIN, HIGH);
  return micros();
}

void loop() {
  discharge();

  unsigned long time_start = charge();

  double volts = 0;
  while (volts < V)
  {
    volts = double(analogRead(ANALOG_READ_PIN)) / 1023.0 * E;
  }

  double T = micros() - time_start; // T: 時定数
  double c;
  char *farad = "uF";

  if (T < 2500)
  {
    c = T / R * 1000000; // pFに対応
    farad = "pF";
  }
  else if (T < 50000)
  {
    c = T / R * 1000; // nFに対応
    farad = "nF";
  }
  else
  {
    c = T / R; // uF
  }

  
  Serial.print(c);
  Serial.print(farad);

  Serial.println();
  digitalWrite(PULSE_PIN, LOW);
  discharge();

}

実験してみた感想

実際、100pF〜10uFまで測定してみました。かなり良い精度でコンデンサの静電容量を測定することができたことに、正直驚きです。

いろいろなコンデンサ
いろいろなコンデンサ

ちなみにコンデンサの静電容量は、もともと10%程度の誤差があります。

ブレッドボードで実験したので、ブレッドボードの寄生容量も含まれます。その大きさは100pFくらいになります。ですから、1000pF以下のコンデンサの静電容量測定では、寄生容量を含まないようにする工夫が必要です。

同様にして抵抗値の測定も可能です。【ラズパイ】ステップ応答による抵抗値の測定でやってみましたので、ご参考になさってみてください。

【おまけ】Arduinoのデジタルピンのしきい値は?

今度は、 Arduinoのデジタル入力のしきい値を測定してみます。やり方は、Arduinoでコンデンサの静電容量を測定する方法によく似ています。

しきい値とは

しきい値(閾値)とは、境目となる値のことです。

ここでは、Arduinoのデジタル入力がLOWからHIGHへ、またはHIGHからLOWと判断される電圧のことを指します。

デジタル入力の電圧しきい値を調べる方法

コンデンサをゆっくり充電していく
コンデンサをゆっくり充電していく

閾値を調べる方法は次の通りです。

  1. D2ピンをHIGHに設定し、抵抗100kΩを介してコンデンサへ充電していく
  2. その間、コンデンサの電圧をA5とD3で監視する
  3. D3がHIHGになるまでA5で電圧値をシリアルモニターへプロットする
  4. D3がHIGHになった瞬間ループを抜け、コンデンサに溜まった電荷をリリースする

これを数回繰り返し、しきい値を調べていきます。

配線図

Arduinoのデジタルピンのしきい値を調べる配線図です。コンデンサに溜まった電圧をD3から逃すため、1kΩの保護抵抗を入れています。

Arduinoのデジタルピンのしきい値を調べる配線図
Arduinoのデジタルピンのしきい値を調べる配線図

ソースコード

Arduinoのデジタルピンのしきい値を調べるためのソースコードです。

/*
  Created by Toshihiko Arai.
  https://101010.fun/iot/arduino-threshold-volts.html
*/
const int PULSE_PIN = 2;
const int DIGITAL_READ_PIN = 3;
const int ANALOG_READ_PIN = 5;

void setup()
{
  Serial.begin(115200);
  pinMode(PULSE_PIN, OUTPUT);
}
void plot() {
  float value = float(analogRead(ANALOG_READ_PIN));
  float volts = value / 1023.0 * 5.0;
  Serial.println(volts);
}

void loop() {
  pinMode(DIGITAL_READ_PIN, INPUT);
  digitalWrite(PULSE_PIN, LOW);
  delay(10);
  digitalWrite(PULSE_PIN, HIGH);
  while(digitalRead(DIGITAL_READ_PIN)!=true) {
    plot();
  }
  pinMode(DIGITAL_READ_PIN, OUTPUT);
  digitalWrite(DIGITAL_READ_PIN, LOW); // コンデンサの電圧を逃す
  digitalWrite(PULSE_PIN, LOW);  
  delay(3000);
}

測定結果

Arduino UNO R3では、デジタル入力のしきい値は2.57Vという結果になりました。つまり、2.57V以上でHIGHになり、それ以下でLOWと判断されます。

ただし、Arduinoボードの種類によっては、デジタルピンのしきい値が異なりますのでご注意ください。

記事に関するご質問などがあれば、
Twitter または お問い合わせ までご連絡ください。
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事