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

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

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

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

Arduino

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

Q&A

2回答

1523閲覧

M5Stackで自動車のバッテリー電圧を計測したいが思ったように動作しない

flds

総合スコア2

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

Arduino

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

0グッド

0クリップ

投稿2022/01/13 05:46

よろしくお願いいたします。
M5stackを用いて自動車のバッテリー電圧を計測するコードを書いていますが、思ったように動作してくれなくて困っています。

回路は分圧回路を構成しており、ハードウェアに問題はなさそうです。
分圧回路の構成は

Vcc(12v~16v)→ 1k2Ω → Vout → 300Ω → GND

です。

ソフトウェアはいくつかのパターンのコードを試してみましたので下記に記します。

C言語

1#include <M5Stack.h> 2#include <M5StackUpdater.h> 3#include "BluetoothSerial.h" 4 5BluetoothSerial SerialBT; 6 7const int ADCPin = 36; 8const float VCC = 3.3; 9const int ADC = 4096; 10const int R1 = 1200; 11const int R2 = 300; 12 13float ADCVolF = 0; 14float ADCRaw = 0; 15 16 17void setup() { 18 // put your setup code here, to run once: 19 M5.begin(); 20 M5.Power.begin(); 21 Wire.begin(); 22 Serial.begin(9600); 23 SerialBT.begin("M5Stack"); 24 25 pinMode(ADCPin, INPUT); 26 27 M5.Lcd.setTextColor(BLACK); 28 M5.Lcd.setTextSize(3); 29 30} 31 32void loop() { 33 M5.Lcd.fillScreen(WHITE); 34 M5.Lcd.setCursor(0,0); 35 36 ///////ADC入力値を補正/////// 37 ADCRaw = analogRead(ADCPin); 38 ADCVolF = ADCRaw * (VCC/ADC)/(R2*(R2+R1)); 39 40 M5.Lcd.printf("%2.2f", ADCVolF); 41 M5.Lcd.println("mV"); 42 43 M5.Lcd.println(ADCRaw); 44 delay(2500); 45 46 // put your main code here, to run repeatedly: 47}

以上のコードを実行すると、LCD画面には

0.00mv(固定。一切変動なし)
3200(おおよそ3000~3300の間で変動が見られます)

と、表示されます。

実現したいこととしては、Lcd画面とシリアル通信先のロガー(teratarmなど。使い方については大体理解しています)に現在の電圧をVで上位2桁、小数点3桁で表示したいです。
ほかにもコードを変更してトライ&エラーしたところ、以下のような結果になりました。

■変更行
以下のコードを二段目の数値に置き換え

C言語

1 ADCVolF = ADCRaw * (VCC/ADC)/(R2*(R2+R1));

置き換え後

C言語

1 ADCVolF = ADCRaw *  2.23609

これは上段の置き換え前のコードで分圧回路の電圧を復号している計算式を手計算して代入しています。
この結果、LCDの電圧値の値が

781400.0123mV(観測写真を撮り損ねましたが、こんな不明な桁数で表示されました)

というようになりました。
久々のコーディングで四苦八苦といったところです。

長々と書いてしまい申し訳ありません。
ご回答御指南よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

(VCC/ADC)/(R2*(R2+R1))
VCCは3300(mV)
ADCフルスケールは4095(12bit)
R1は1.2KΩ (普通にこう書きませんか? 小数点を使えない図面上なら1K2も仕方ないかも知れませんが) R2は300Ωとすると
(3300/4095)/(300*(300+1200))を計算すると、0.00000179...になるので、3000やそこいらかけても小数点以下2位までで0になって当然です。

これは上段の置き換え前のコードで分圧回路の電圧を復号している計算式を手計算して代入しています。

計算し直してみてください。

で。そもそもの計算の式、違ってませんか。
(VCC/ADC)/(R2/(R2+R1))
あるいは同じことですが
(VCC/ADC)/R2*(R2+R1)
では。

投稿2022/01/13 22:51

編集2022/01/13 22:54
thkana

総合スコア7629

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

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

0

まずはテスターでアナログ入力の電圧を測って、
anarogReadの返り値を直接表示させてみてください
その電圧に即した値が出ているかをチェックしましょう

投稿2022/01/13 07:10

y_waiwai

総合スコア87747

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

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

flds

2022/01/13 08:27

ご回答ありがとうございます。 回路をすでに組んでしまっており、手持ちのテスターでは計測困難でした。 ただ、実測電圧が14.2~14.7付近であり、0~4095の返り値のうち3000ちょっとであることや 分圧回路の設計から推測するに、ハードや返り値には問題ないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問