工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト

必要なパーツと用品

Arduino UNO ×1
PHPoC WiFi Shield for Arduino ×1
抵抗 100kΩ ×1
抵抗 1MΩ ×1
ジャンパーワイヤー ×1

プロジェクト概要

Arduinoのアナログ入力ピンを使って電圧を測定します。ただし、Arduinoのアナログ入力で測定可能な最大電圧は5Vです。より高い電圧を測定するには、分圧回路(抵抗分圧器)を使用します。

動作原理

理論

Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト

分圧比は以下の式で求められます:

V_measure = (R1 + R2) / R2 × V_in
ratio = (R1 + R2) / R2
⇒ V_measure = ratio × V_in

R1 = 10 × R2 とすると、ratio = 11 となり、測定可能な最大電圧は 5V × 11 = 55V になります。Arduinoのピンに流れる電流を制限し、破損を防ぐため、抵抗値はできるだけ大きく選びます。ここでは R1 = 1MΩ、R2 = 100kΩ を使用します。

実践における課題と解決

実際には以下の問題が発生します:

これらの問題は「キャリブレーション(校正)」の手順で解決します。

キャリブレーション(校正)

1. 実際の分圧比 (R1+R2)/R2 を測定する

この作業は一度だけ行えばOKです。以下のように配線し、抵抗キャリブレーション用スケッチを実行します。

Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
ratio = (R1 + R2) / R2 = V_measure / V_in = A1_read_value / A0_read_value
ratio = A1_read_value / A0_read_value

シリアルプロッタで出力される ratio 値をコピーし、メインスケッチ(Voltmeter.ino)の5行目に書き込みます。

2. 電源電圧の不安定さへの対策

電源電圧の変動はアナログ基準電圧の変動を招き、測定誤差の原因になります。これを解決するため、3.3VピンをA1に接続し、基準電圧を頻繁に測定する方式を採用します。

Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
V_reference = 1023 × 3.3 / A1_value
V_in = mapFloat(A0_value, 0, 1023, 0, V_reference)
V_measure = ratio × V_in
Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト

作り方(手順)

  1. 「抵抗キャリブレーション配線」で配線する
  2. ResistorCalibration.ino をアップロード
  3. シリアルプロッタを開き、ratio 値をコピー
  4. Voltmeter.ino の5行目の ratio 値を書き換え
  5. 「メイン配線」で再配線
  6. Voltmeter.ino をアップロード
  7. Webユーザーインターフェース(voltmeter.php と voltmeter_body.jpg)をPHPoC Shieldにアップロード
  8. ブラウザで https://phpoc_shield_ip_address/voltmeter.php にアクセスし、電圧を確認

スマートフォンからも同様にアクセス可能です。

Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト

配線のコツ

Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト

ソースコード

ResistorCalibration.ino(Arduino)

double ratio;
int analogReadAverage(int pin, int read_time) {
  unsigned long read_value = 0;
  for(int i = 0; i < read_time; i++) {
    read_value += analogRead(pin);
    delay(2);
  }
  read_value /= read_time;
  return read_value;
}
double resistorCalibration() {
  double _ratio;
  double A0_read_value = analogReadAverage(A0, 20);
  double A1_read_value = analogReadAverage(A1, 20);
  _ratio = A1_read_value / A0_read_value;
  return _ratio;
}
void setup() {
  Serial.begin(9600);
}
void loop() {
  ratio = resistorCalibration();
  Serial.print("ratio:");
  Serial.println(ratio);
  delay(200);
}

Voltmeter.ino(Arduino)

double V_measure, V_in, V_reference;
double ratio = 11.59;  // キャリブレーションで得た値に書き換える

double mapFloat(double x, double in_min, double in_max, double out_min, double out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

int analogReadAverage(int pin, int read_time) {
  unsigned long read_value = 0;
  for(int i = 0; i < read_time; i++) {
    read_value += analogRead(pin);
    delay(2);
  }
  read_value /= read_time;
  return read_value;
}

double getVoltageReference() {
  double A1_value = analogReadAverage(A1, 20);  // A1は3.3Vに接続
  double V_REF = 1023 * 3.3 / A1_value;
  return V_REF;
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  V_reference = getVoltageReference();
  double A0_value = analogReadAverage(A0, 20);
  V_in = mapFloat(A0_value, 0, 1023, 0, V_reference);
  V_measure = ratio * V_in;
  Serial.println(V_measure);
  delay(200);
}

voltmeter.php(Web UI / PHP)

PHPoC ShieldにアップロードするWebインターフェースです。背景画像 voltmeter_body.jpg も一緒にアップロードしてください。

<!DOCTYPE html>
<html>
<head>
  <title>PHPoC Shield - VOLTMETER</title>
  <meta name="viewport" content="width=device-width, initial-scale=0.7">
  <link rel="stylesheet" media="screen" href="https://fontlibrary.org/face/segment7" type="text/css"/>
  <style>
    html {height: 100%;}
    body {width: 100%; height: 100%; text-align: center;}
    .container {width: 100%; min-height: 99%; max-height: 100%;}
    canvas {
      background: url(voltmeter_body.jpg);
      background-size: contain;
      font-family: 'Segment7Standard';
      font-weight: bold;
      font-style: italic;
    }
  </style>
  <script>
    // ...(WebSocket通信とキャンバス描画のJavaScriptコード)...
  </script>
</head>
<body onresize="canvas_resize()">
  <div class="container" id="container">
    <canvas id="graph"></canvas>
  </div>
</body>
</html>

回路図

Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト

製造プロセス

  1. Arduino Nano RP2040で作るDIY Photoshopコントロールコンソール
  2. Python連携で信頼性向上: Arduino RFID勤怠管理システム
  3. Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
  4. Arduinoで作る赤外線心拍センサー:低コスト・リアルタイム波形表示のステップバイステップガイド
  5. Arduino UNOで周波数とデューティサイクルを高精度測定
  6. ArduinoとNokia 5110ディスプレイで自作電圧計:ステップバイステップガイド
  7. Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
  8. MobBob:Arduino製ロボットをAndroidスマホでシームレスに制御
  9. Bolt IoTとArduino UNOでLED輝度をシームレス制御
  10. スマートなArduino制御ロボットアームの製作:簡単DIYチュートリアル
  11. Arduino NanoとRDA5807Mで作るコンパクトFMラジオ