ダイオードI-V特性測定器作成:4-1. マイコン側ソフト設計 – Arduino Uno Rev3 / R4 Minima

2025年8月31日

Google Ad

本記事の主旨

ダイオードI-V特性測定器(カーブトレーサ)作成のArduino Uno Rev3 / R4 Minima用マイコン側ソフトについて記す。

本記事の目的

本記事の目的を以下に記す。

  • Arduino Uno Rev3 / R4 Minima用マイコン側ソフトのソースについての解説を記すこと

本記事の背景

ダイオードI-V特性測定器(カーブトレーサ)作成の中でマイコン側ソフトを作成したため、本記事でその部分的な解説をする。

本記事の位置づけ

以下の流れで作業説明と解説を行った。

記事に対応したリンクを添付した。

概要説明:ダイオードI-V特性測定器作成:0. 概要 | 工事中.com

  1. 取扱説明
  2. 回路設計
    1. ダイオードのI-V特性を手作業で確認
    2. 回路の実装
      1. 回路の実装(PWM平滑化)
      2. 回路の実装(PWM平滑化以外)
  3. PC側ソフト設計
    1. pySerialでUSBシリアル通信
    2. Matplotlibでのグラフ表示
    3. Pythonで最小二乗法の指数関数近似
    4. openpyxlでグラフ描画と最小二乗法の指数関数近似
  4. マイコン側ソフト設計
    1. Arduino Uno Rev3 / R4 Minima★現在のページ
    2. Raspberry Pi Pico / Pico 2
  5. 実験
    1. 1N4148の測定でマイコンとソースの組み合わせを比較
    2. 種々のダイオードを測定
    3. 種々の高精度ゲルマニウムダイオードを測定
  6. まとめと補足

コードの全体

今回解説するコードの全体は、以下にアップロードした。

Arduino Uno Rev3版コード

Arduino IDE用ソースファイル。

Arduino Uno R4 Minima版コード

Arduino IDE用ソースファイル。

Arduino Uno Rev3 コードの解説

Arduino Uno Rev3では、以下のように実装した。

特に難しい処理はないため、マイコン特有の処理についてのみ解説する。

初期化処理

Serial.begin()関数で、シリアル通信をボーレート115200[bps]で開始する。

pinMode()関数で、PWM出力に使う5番ピンを出力に指定する。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);         // シリアル通信開始(ボーレート115200)
  pinMode(5, OUTPUT);           // PWM出力に使う5番ピンを出力に指定
}

ループ処理

シリアルポート監視

Serial.available()関数で、シリアルポートで読むことができるバイト数を取得する。

その結果、戻り値が0でない場合にシリアルポートから情報が取得できるとわかる。

  if (Serial.available())
  {

測定開始判定

Serial.readString()関数で、シリアル通信の文字列を取得する。

Serial.read()関数は、1バイト分しか読みださないことに注意すること。

    if (Serial.readString() == "SerialStart\r\n")  // Serial.read()は1バイト分しか読みださない。https://www.arduino.cc/reference/en/language/functions/communication/serial/read/
    {

測定中処理

analogWrite()関数で、PWM出力をする。

analogRead()関数で、ADCの値を取得する。

      // 以下、計測した電圧\t抵抗の電位差のデータ
      for (i = 0; i <= 505; i++)  // PWMの255段階 + PWM出力のデューティー比が100%になってから少なくとも5τ(時定数)分待つための250回ループ
      {
        if (i <= 255)
        {
          analogWrite(5, i);      // PWM出力
        }
        delay(20);              // 定常状態になるのを待つ
        for (j = 0; j < 10; j++)  // 10回測定
        {
          v_d = analogRead(A0);    // ダイオードの電圧
          v_dr = analogRead(A1);   // ダイオード + 抵抗の電圧
          Serial.print(v_d);
          Serial.flush(); // 書き込み待ち
          Serial.write("\t");
          Serial.flush(); // 書き込み待ち
          Serial.print(v_dr - v_d);
          Serial.flush(); // 書き込み待ち
          Serial.write("\r\n");
          Serial.flush(); // 書き込み待ち
        }
      }

測定終了処理

測定後は測定回路に電圧をかける必要がないため、PWM出力のデューティー比を0にする。

      analogWrite(5, 0);      // PWM出力を初期化
      delay(200);             // 定常状態になるのを待つ

Arduino Uno R4 Minima コードの解説

Arduino Uno R4 Minimaでは、以下のように実装した。

Arduino Uno R3とのコード差分のみを解説する。

初期化処理

analogWriteResolution()関数で、PWMの解像度を変更する。

analogReadResolution()関数で、ADCの解像度を変更する。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);         // シリアル通信開始(ボーレート115200)
  pinMode(5, OUTPUT);           // PWM出力に使う5番ピンを出力に指定
  analogWriteResolution(12);    // 12-bitの解像度に変更
  analogReadResolution(14);     // 14-bitの解像度に変更
}

ループ処理

特に差分はないが、PWMとADCの解像度を変更したため一部の数値が異なる。

前回(3-4. PC側ソフト設計 - openpyxlでグラフ描画と最小二乗法の指数関数近似)

次回(4-2. マイコン側ソフト設計 - Raspberry Pi Pico / Pico 2)

他の回

「ダイオードI-V特性測定器作成 連載記事」でタグ付けを行っている。

広告

Amazonで定番になりそうな、Arduino Uno R4 WiFiスターターキット。

広告