トランジスタ技術 2022年10・11月号の「E24系列表示付き! Arduino抵抗測定器の製作」のオマケ記事。
装置全体の構成などはトランジスタ技術誌に掲載。
専用基板についてはこちらの記事。
追加機能の構想と仕様
ちょっとした改造で温度計にしてみる。必要な部品はサーミスタとスイッチを一つ。元々が抵抗計なので、被測定抵抗としてサーミスタを使い、その値を測定する。あとは、その測定値(抵抗値)を温度に変換するだけ。スイッチは抵抗計と温度計の切替え(および、温度表示のリセット)。
表示部(LCD)が広いので、現在の温度だけでなく、最低値と最高値も表示させる。
上の写真が完成形。右に見えるのがサーミスタ。画面上段が現在の温度で、下段が起動してからの最低温度と最高温度。
回路(ハードウェア改造)
スイッチはArduinoの空き端子を使う。RMEE02では六つの空き端子を用意している(0、1、2、A1、A2、A3)。どれでもいいのだけど、ここでは「0」を使うことにする。この端子にスイッチ(タクトスイッチ)をつなげる。スイッチのもう一方はGNDにつなぐ。
上の写真のように、ユニバーサルスペースを使ってタクトスイッチを取り付ける。上に書いたとおり、スイッチは0とGNDに接続する(配線は基板裏)。
ハードウェアの改造はこれだけ。普通に考えればスイッチにプルアップ抵抗が必要なように思うが、ATmega328Pではポートを内部でプルアップする機構があるのでそれを使う(ソフトウェアで設定)。また、チャタリングが問題になるようなものでもないので、そうした回路も省略。
測定用のサーミスタの接続は元々ある抵抗の測定端子を使えばよい。バナナ端子につなぐようにするのが実用的だと思う。サーミスタは10kΩのNXFT15XH103FA2B050を使用する(秋月電子扱い)。
ソフトウェア
ソフトウェアで追加する主な機能は三つ。
- モード切替え(抵抗測定モード/温度測定モード)
- 抵抗値→温度変換(および、表示)
- 最低値・最高値保持とリセット
モード切替え
起動時にスイッチを付けたポート(0)の状態を読み取り、どちらのモードで動作するかを決定する。
- High: 抵抗計
- Low(スイッチを押した状態): 温度計
ポートの定義の際、上述のとおり、内部プルアップを指定する。
なお、モードを変更するにはArduinoのリセットから行う(動作中に切り替える必要はないでしょう)。
抵抗値→温度変換
サーミスタの抵抗値と温度の関係は下の式で表される。
\(R=R_0 \times \exp{(B \times (\frac{1}{T}-\frac{1}{T_0}))}\)
ここで、Rはサーミスタの抵抗値、Tがそのときの温度(絶対温度)、R0は温度T0におけるサーミスタの抵抗値、BはサーミスタのB定数。
この式をTについて解けば、サーミスタの抵抗値から温度が計算できる(下のとおり)。
\( \log{\frac{R}{R_0}}=B \times (\frac{1}{T}-\frac{1}{T_0}) \\ \frac{1}{T}-\frac{1}{T_0}=\frac{\log{\frac{R}{R_0}}}{B} \\ \frac{1}{T}=\frac{\log{\frac{R}{R_0}}}{B}+\frac{1}{T_0} \\ T=1/(\frac{\log{\frac{R}{R_0}}}{B}+\frac{1}{T_0}) \)
どのみち計算機に計算させるので、面倒なことは考えずに単純に解いた。なお、温度は絶対温度なので、セ氏温度で扱うには273.15度の補正を行う。
サーミスタNXFT15XH103FA2B050の仕様は以下の通り。
- R0: 10kΩ±1%(25℃)
- B: 3380±1%(25~50℃)
Bの値は上記の温度範囲超えると変る(言い換えれば、25~50℃の範囲以外は精度が落ちる)。
最低値・最高値保持とリセット
最高値と最低値は静的変数を用いれば問題ない。測定値がそれまでの値を更新したら、その変数を書き換える。
最高値と最低値のリセットは、追加したスイッチ(モード設定と同じスイッチ)で行う。温度計測のタイミングでスイッチをチェックし、Lowならリセットする。したがって、温度測定のタイミング(概ね1秒ごと)までスイッチを押し続けないとリセットされない。割り込みを使って実現すれば即座にリセットできるけれど、そこまでは必要ないだろうとの判断(シンプルさ優先)。
ソースコード
以上の機能を組み込んだソースコード(Arduinoスケッチ)は下のリンク先。
少しだけ説明しておく。
- サーミスタのB定数やピン定義などをヘッダ部に追加
- 測定モードの判定をsetup()に追加
- loop()では測定モードに従って抵抗/温度のどちらかの測定を実行
- 温度測定はmeasure_temperature()
- 最低値・最高値の処理(更新)
- 最低値・最高値のリセット処理
- サーミスタの抵抗値を測定
- その抵抗値を温度に変換し、表示
使い方
- 抵抗測定
電源をつなぐと起動し、そのまま放置すれば抵抗測定モード(これまで通り)。 - 温度測定
起動後、電圧表示をしている間にモードスイッチ(今回追加したスイッチ)を押す(電圧表示を終えた時点でスイッチの状態を判断するので、それまで押し続ける)。
最低値・最高値をリセットするには、モードスイッチを押し続ける(温度表示更新のタイミングでスイッチの状態を判定する)。 - モード切替え
Arduinoをリセットし、モードスイッチを適宜操作する。
以上。
ケース付きの一体型はこちら。
コメント