質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

312閲覧

Arduinoで複数チャネルでの静電容量測定

toooomuuuu

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2025/04/23 06:57

実現したいこと

下記ページの"Capacitance Meter for 470 uF to 18 pF Capacitors"を参考にシングルチャネルでの静電容量を測定するためのプログラムは組めました。今度はこれを拡張して複数チャネル、例えば5チャネルで同時に静電容量を測定したいと思っています。

https://www.circuitbasics.com/how-to-make-an-arduino-capacitance-meter/

発生している問題・分からないこと

使用しているのはarduino unoのため下記のプログラムのやり方ではアナログ入力端子が足りず拡張しようとしても、回路が組めません。色々ネット上を探しているとアナログ入力端子を使っても5つの入力でもグランドを共通にしてるのか、6本のアナログ入力にしていたり、ディジタル入力端子を使っていそうなものも見られるのですがいずれにしても具体的な配線方法やプログラムが全くわかりません。ちなみに、下記の"Capacitance Meter for 470 uF to 18 pF Capacitors"と同様に外部抵抗無しで測定したいと思ってます。

https://www.circuitbasics.com/how-to-make-an-arduino-capacitance-meter/

該当のソースコード

const int OUT_PIN = A2; const int IN_PIN = A0; const float IN_STRAY_CAP_TO_GND = 24.48; const float IN_CAP_TO_GND = IN_STRAY_CAP_TO_GND; const float R_PULLUP = 34.8; const int MAX_ADC_VALUE = 1023; void setup(){ pinMode(OUT_PIN, OUTPUT); pinMode(IN_PIN, OUTPUT); Serial.begin(9600); } void loop(){ pinMode(IN_PIN, INPUT); digitalWrite(OUT_PIN, HIGH); int val = analogRead(IN_PIN); digitalWrite(OUT_PIN, LOW); if (val < 1000){ pinMode(IN_PIN, OUTPUT); float capacitance = (float)val * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val); Serial.print(capacitance, 3); Serial.print(F("e-12")); Serial.println(F(") ")); } else{ pinMode(IN_PIN, OUTPUT); delay(1); pinMode(OUT_PIN, INPUT_PULLUP); unsigned long u1 = micros(); unsigned long t; int digVal; do{ digVal = digitalRead(OUT_PIN); unsigned long u2 = micros(); t = u2 > u1 ? u2 - u1 : u1 - u2; } while ((digVal < 1) && (t < 400000L)); pinMode(OUT_PIN, INPUT); val = analogRead(OUT_PIN); digitalWrite(IN_PIN, HIGH); int dischargeTime = (int)(t / 1000L) * 5; delay(dischargeTime); pinMode(OUT_PIN, OUTPUT); digitalWrite(OUT_PIN, LOW); digitalWrite(IN_PIN, LOW); float capacitance = -(float)t / R_PULLUP / log(1.0 - (float)val / (float)MAX_ADC_VALUE); if (capacitance > 1000.0){ Serial.print(capacitance / 1000.0, 2); Serial.print(F("e-6")); } else{ Serial.print(capacitance, 2); Serial.print(F("e-9")); } Serial.println(F(") ")); Serial.print(digVal == 1 ? F("Normal") : F("HighVal")); Serial.print(F(", t= ")); Serial.print(t); Serial.print(F(" us, ADC= ")); Serial.print(val); Serial.println(F(")")); } while (millis() % 1000 != 0); }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

アナログ入力を使った静電容量測定に関する情報は比較的出てきますが、デジタル入出力を使ったものはあまり出てきません。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2025/04/24 00:18

で、しつもんはなんでしょうか
toooomuuuu

2025/04/24 00:33

複数チャネルで測定するための上記のような外部抵抗を使わないプログラムと回路の配線方法が知りたいです。
thkana

2025/04/26 06:38

マイコンの多入力ADCは、そもそもADC自体は一つでその入力を切り替えているものがほとんどだと思います。注意深く設計しないと、特に小容量を測定しようとした場合には切り替え回路の残り電荷とかで痛い目をみたりもしそうな気がします。 正直、まともに考えるのならADCを必要数並べてしまった方がよいのではないか、と私は思いますけれど。多入力のADCを使わなきゃいけない合理的な理由があるのでしょうか? で。 > プログラムと回路の配線方法が知りたいです。 なんだか「あなたが自分でやること」が残っていないような気がします。 つまり、全部丸投げで教えろ、あなたの代わりに設計しろ、ということでしょうか?それはなんだかなぁ...
guest

回答1

0

ベストアンサー

単純に、アナログ入力ピンが足りない、という事なので、必要数のあるマイコンボードに変えるか、アナログマルチプレクサ(74HC4053とか)あたりを繋いでピン数を稼ぐか、ではないかな。

ただし、マイコンの内部プルアップ抵抗を使って測定しているようなので精度は良くないと思いますよ。
その辺りの係数はもう一度測り直した方が良いと思います。

《追記》
勧めるわけでは無いが、ちょっと試したので報告。
イメージ説明
中華UNOで添付画像のように

A0~A3:0.33uF 3つ
A3~A5: 0.01uF 2つ

を直接端子に挿して試したところ、

1: Capacitance Value = 327.00 nF (Normal, t= 7548 us, ADC= 496)
2: Capacitance Value = 338.42 nF (Normal, t= 7924 us, ADC= 501)
3: Capacitance Value = 327.33 nF (Normal, t= 7708 us, ADC= 503)
4: Capacitance Value = 12.92 nF (Normal, t= 312 us, ADC= 512)
5: Capacitance Value = 12.52 nF (Normal, t= 312 us, ADC= 523)

のような、思ったよりも正確?に出力してきた。
(条件が悪ければ悪い値がでてくるだろうけど)

投稿2025/04/26 01:43

編集2025/04/28 02:38
nac_tnk

総合スコア512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toooomuuuu

2025/04/26 02:14

回答ありがとうございます。そうですよね、確かに精度のの悪さとかも織り込み済みで現状だと、Arduino Megaにマイコンボードを変更して測定をしようかと思ってます。上記のソースコードをマルチチャネルに拡張するようなイメージだとどのようなソースコードになりますかね。
nac_tnk

2025/04/26 09:06

同じ事をそのチャンネル分おこなうだけです。
toooomuuuu

2025/04/28 03:24

ご回答ありがとうございます。自力でプログラムを拡張して測定できました。あと、端子の繋ぎ方が非常に参考になりました。普通にUNOでも5入力行けるのですね、勢いでMEGAを買ってしまったので余計な買い物をしてしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問