ダイオードI-V特性測定器作成:4-1. マイコン側ソフト設計 – Arduino Uno Rev3 / R4 Minima
本記事の主旨
ダイオードI-V特性測定器(カーブトレーサ)作成のArduino Uno Rev3 / R4 Minima用マイコン側ソフトについて記す。
本記事の目的
本記事の目的を以下に記す。
- Arduino Uno Rev3 / R4 Minima用マイコン側ソフトのソースについての解説を記すこと
本記事の背景
ダイオードI-V特性測定器(カーブトレーサ)作成の中でマイコン側ソフトを作成したため、本記事でその部分的な解説をする。
本記事の位置づけ
以下の流れで作業説明と解説を行った。
記事に対応したリンクを添付した。
概要説明:ダイオードI-V特性測定器作成:0. 概要 | 工事中.com
- 取扱説明
- 回路設計
- ダイオードのI-V特性を手作業で確認
- 回路の実装
- 回路の実装(PWM平滑化)
- 回路の実装(PWM平滑化以外)
- PC側ソフト設計
- pySerialでUSBシリアル通信
- Matplotlibでのグラフ表示
- Pythonで最小二乗法の指数関数近似
- openpyxlでグラフ描画と最小二乗法の指数関数近似
- マイコン側ソフト設計
- Arduino Uno Rev3 / R4 Minima★現在のページ
- Raspberry Pi Pico / Pico 2
- 実験
- 1N4148の測定でマイコンとソースの組み合わせを比較
- 種々のダイオードを測定
- 種々の高精度ゲルマニウムダイオードを測定
- まとめと補足
コードの全体
今回解説するコードの全体は、以下にアップロードした。
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スターターキット。













ディスカッション
コメント一覧
まだ、コメントがありません