Arduino 入門
Lesson 18
【サーミスタ編】
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。
少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。
本日はLesson 18 サーミスタ編です。
前回Lesson17にて「液晶ディスプレイ + 超音波センサ」の使い方を学習しました。
本Lessonでは、「液晶ディスプレイ+サーミスタ」に挑戦です。
サーミスタは温度によって抵抗が変化する素子です。
といっても、どんな抵抗でも少なからず温度によって変化はするんですが・・・。
今回はサーミスタ(thermistor)から得た情報を液晶ディスプレイに表示します。
今回もLesson17同様にPCを使わずに、Arduinoと電子部品だけで何かをするための学習も兼ねています。
「サーミスタで取得した値を温度に変換し液晶に表示させる」ことが最終目標です。
これで、簡易的な「温度計」の完成です。
あとは、電池などでArduinoの電源を確保すればパソコン不要となります。
そのため、今回もLesson17と同じく電池を使います。
電源の確保方法は2種類あるのですが、詳細については番外編で説明したいと考えます。
記事を後ほどアップする予定です。
しばらくお待ちください。
本Lesson解説で使用しているのはArduino互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
はじめに
温度の計測はサーミスタの抵抗変化を読み取ることで行います。
サーミスタ(thermistor)とは、温度変化に対して電気抵抗の変化の大きい抵抗体のことである。この現象を利用し、温度を測定するセンサとしても利用される。センサとしてはふつう-50℃から150℃程度までの測定に用いられる。
Wikipediaにあるように、温度変化に対して電気抵抗の変化の大きい抵抗体というのがミソです。
冒頭で記載しましたが、どんな抵抗でも少なからず温度変化によって値は変化します。
サーミスタは、マンガン、ニッケル、コバルトなどで構成されたセラミックスに電極形成します。
セラミックスを使うことで温度変化に対する抵抗の振れ幅を大きくし抵抗値の変化を捉えやすくした電子部品です。
温度に関して言えばLesson11にて温湿度センサ(DHT11) を使ってPCに温度、湿度などを表示させるLessonをしました。
温湿度センサ(DHT11) の中にもサーミスタが入っています。
では、違いは何か?
サーミスタ単体で温度を測定しようとした場合、計測した抵抗値から複雑な計算が必要になります。
Arduinoのライブラリを使うことで計算は可能ですが、計算の処理をArduinoにさせる必要があります。
そこで、計算や温度変換などをさせるICとサーミスタを一緒のモジュールとして1つの電子部品とします。
そうすることで、Arduinoでの処理を減らし比較的簡単に測定できるようにしたものが、温湿度センサ(DHT11) などの各種温度センサとなります。
そのため、通常はサーミスタ単体ではなく、温度センサモジュールなどの電子部品を使うことをおすすめします。
サーミスタ単体は構造が単純であり値段も安価(1個数十円)であることから、たくさんの場所を測定する場合などに用います。
今回は、手元にサーミスタがあるのでサーミスタがどんなものなのかを学習する意味もあっての使用です。
また、Lesson16で使用した1602 LCD ディスプレイモジュールを使用します。
この2つを組み合わせることで簡易的な「温度計」を作ります。
Lesson 18 目標
サーミスタの使い方を理解しましょう。
また、液晶ディスプレイの使い方を思い出しましょう。
さらに、液晶ディスプレイとサーミスタを組み合わせることで「簡易温度計」を作成します。
最後に、本Lessonも、「遊ぶというところが一番大事」なところです。
今回もLesson17と同じようにLesson16のコードを組み合わせることで簡易「温度計」を作成します。
Lesson16またはLesson17を学習しておくことでスムーズに取り組むことができます!
準備
ではLessonの準備に取り掛かりましょう。
サーミスタ以外はこれまでに使ったことがある電子部品ばかりです。
電池を繋ぐというところはLesson17と同じです。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - サーミスタ
- 抵抗 10kΩ 1本
- 1602 LCD ディスプレイモジュール → Lesson 16で解説しています。
- ポテンショメータ(可変抵抗器) → Lesson 12で解説しています。
- 電池スナップDCプラグアダプタ(電池接続のためのアダプタ)
※ハードケース版 - 乾電池9V(電源用)、おすすめは充電式
- M-M Jumper wire(UNOと部品をつなぐための配線)
Jumper wire、抵抗は今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
抵抗も単品で揃えるよりはセットをおすすめします。
抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!
という方は、「電子工作基本部品セット」が使い勝手が良い。
使用部品説明
主要な電子部品は3つです。
サーミスタ、1602 LCD ディスプレイモジュール 、ポテンショメータ(可変抵抗器) です。
また、電池接続のため「電池スナップDCプラグアダプタ」を使用します。
簡単に電源を取るための方法の1つです。
サーミスタ仕様
サーミスタはNTC(負の温度係数)とPTC(正の温度係数)の2種類があります。
一般的に温度測定には、温度と抵抗値の関係が簡単な近似式で表されるNTCが使われます。
NTCは温度検知の他に、温度補償、突入電流抑制などにも使われます。
PTCは温度が上昇すると抵抗が増加します。
つまり、電流を流すと自己発熱によって抵抗が増大し電流を流れにくくします。
その性質を利用して回路を保護する保護素子、加熱検知、ヒータなどにも使われています。
NTCサーミスタ性能(Amazonで販売されている下記の仕様となります)
項目 | 仕様 |
---|---|
断熱材質 | セラミック |
温度範囲 | -30度~+125℃ |
抵抗値 | 10KΩ |
B値 | 3950±1% |
精度 | 5% |
※B値とはサーミスタのB定数と呼ばれ、サーミスタごとに異なります。
サーミスタの温度変換計算方法
NTCのサーミスタから温度を取得するためには次式で計算することが可能です。
※ネットなどで検索すればすぐにでてくるかと思います。
B定数の単位はK(ケルビン)なのでケルビン基準で計算する必要があります。
Rth:計測時の周辺温度による抵抗値
B:3950(サーミスタの仕様によります)
R0:25℃での抵抗値(サーミスタの仕様に記載されています)
T:計測時の周辺温度(ケルビン)
T0:25℃でのケルビン温度 298.15[K]
※摂氏とケルビンの変換は、摂氏温度+273.15となります。
今回使用するのは10kΩ(25℃)のサーミスタを使用するため
R0 = 10kΩです。
温度に変換する場合は上記の式をTについて解きなおせばよいわけです。
解法は exp ⇒ log 変換の数学のため割愛します。
※Tはケルビン、摂氏への変換はT – 273.15
サーミスタからの抵抗値取得
温度を知るためには、サーミスタの抵抗値を計測する必要があります。
Arduinoで抵抗値を測定する方法は電圧を測定することで計算できます。
回路構成例を下図に示します。
Rth:サーミスタの抵抗
R1:分圧測定のための抵抗
今回R1は10kΩを使います。
25℃で10kΩのサーミスタを使う場合は、R1に10kΩを使うことで25℃で出力電圧が1/2中心になるため扱いやすいと考えます。
上図のVoutの計算式は以下となります。
Arduinoではアナログ入力ピンで電圧を読み取ります。
その場合は、ArduinoのA/Dコンバータにより電圧値がデジタル値に変換されるため計算で戻す必要があります。
戻り値 ÷ 1024 × 5[V]
アナログ入力の詳細に関しては下記を参照ください。
1602 LCD モジュール仕様
1602 LCD モジュールについてはLesson 16の解説をご覧ください。
■表面
■裏面
ポテンショメータ仕様
ポテンショメータについてはLesson 12の解説をご覧ください。
電池スナップDCプラグアダプタ
Lesson17で電池接続のために使用したものと同じです。
Arudinoと電池を簡単に接続するための部品です。
これはArduinoの外形5.5mm、内径2.1mmのDCプラグに接続するためのものです。
Arudino側としては7V~12Vの範囲の電圧入力が必要となります。
電源の取り方としては、手軽な方法です。
部品は以下のものとなります。
Arduinoの接続箇所は下記となります。
安い物から、複数個、ハードケースなどがあります。
好みで選択してください。
ハードケースを希望の場合。
実践 回路作成とコード作成
ではさっそく動かしていきましょう。
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、測定した温度をディスプレイに表示しましょう。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
回路図がこちら。
部品は「サーミスタ」「10kΩ」「1602 LCD モジュール」と「ポテンショメータ」です。
電源は「9Vの電池」です。
今回も、Lesson16同様に4bitモードとして動作させるためDB0~DB3は使用しません。
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品は「サーミスタ」「10kΩ」「1602 LCD モジュール」と「ポテンショメータ」です。
電源は9Vの電池をアダプタで接続しています。
「ポテンショメータ」がないかたはVOを直接VDDにつないでいただいてもかまいません。
コントラストの調整ができないだけです。
ただし、明るすぎて見えない場合は数kΩ程度の抵抗をつけて調整してください。
使用するポートは、アナログ入力ピンの「0」、デジタル入力ピンの「7,8,9,10,11,12」。
電源の外部入力電源端子です。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。
今回は、サーミスタ計測用のコードとLesson 16で作成したコードを組み合わせることで作成します。
標準ライブラリ設定
LCDのコードはLesson 16にてライブラリを使いましたので以下の設定をお願いします。
すでに、Lesson 16を学習したかたは飛ばしてください。
「LiquidCrystal.h」を下記のいずれかで使えるようにしてください。
このライブラリを使うことで、HD44780とその互換チップセットを搭載したLCDを制御できるようになります。
4bit、8bit両方のモードをサポートしているライブラリです。
標準ライブラリのため、基本は初めから実装されているはずです。
ない場合は、下記を実施ください。
タイプArduinoを選択して「LiquidCrystal」で検索。
LiquidCrystalをインストール
ライブラリの追加方法の詳細に関しては以下を参照ください。
コマンド説明
サーミスタの計測に使用する関数(復習も兼ねる)と、再度Lesson 16で使用したコマンドを記載します。
下記はサーミスタの計測に使用するコマンドです。
これまでのLessonで学習済みですが、もう一度意味を確認しましょう。
コマンド | 説明 |
---|---|
float | 浮動小数点を持つ数値のためのデータ型。 ※小数が扱えます。 整数よりも分解能が高いアナログ的な値が必要なときに使用。 使用可能な値の範囲:3.4028235E+38~-3.4028235E+38 ※32ビット(4バイト)のサイズ 例:TrigPin変数を不動小数点のデータ型にする。 float TrigPin; |
analogRead(pin) | アナログ値を読み取るアナログ入力ピンを指定。 pin:0,1,2,3,4,5のいずれかを指定 例 アナログ入力ピンに3番を指定する。 analogRead(3); |
delay(val) | valで指定した時間だけ遅延時間をもうける。 単位はms(ミリ秒) 例 1000ms( = 1秒)遅延させる。 delay(1000); |
標準ライブラリである「LiquidCrystal.h」のコマンドも再度記載しておきます。
何回も言いますが・・・何度も見て、何度も書いて覚えてしまいましょう!!
コマンド | 説明 |
---|---|
LiquidCrystal(引数) 引数 rs,rw,enable, d0,d1,d2,d3,d4,d5,d6,d7 |
LiquidCrystal型の変数を生成。 rs:LCDのRSピンに接続するArduino側のピン番号 rw:LCDのRWピンに接続するArduino側のピン番号 enable:LCDのenableピンに接続するArduino側のピン番号 d0~d7:LCDのdataピンに接続するArduino側のピン番号 RWピンをGNDに接続すれば引数を省略できます。 |
begin(cols, rows) | LCDの初期化。 ディスプレイの桁数と行数の指定。 cols:桁数(横方向の字数) rows:行数 |
clear() | LCDの表示を消し、カーソルを左上隅に配置。 |
home() | LCDの左上隅にカーソルを配置。 |
setCursor(col, row) | LCDのカーソルの位置を指定。 |
write(data) | 文字をLCDに表示。 |
print(data) | テキストをLCDに表示。 |
cursor() | LCDのカーソルを表示する。 カーソルはアンダーラインで、その位置に次の文字が表示される。 |
noCursor() | LCDのカーソルを表示しない。 |
blink() | LCDのカーソルを点滅させる。 |
noBlink() | LCDのカーソルを点滅を停止。 |
display() | noDisplay()で消したディスプレイを元に戻す。 表示されていた文字やカーソルもリストアされる。 |
noDisplay() | ディスプレイを消す。 表示中の文字は保持される。 |
scrollDisplayLeft() | LCDに表示中の文字とカーソルを1文字分左へずらします。 |
scrollDisplayRight() | LCDに表示中の文字とカーソルを1文字分右へずらします。 |
autoscroll() | LCDの自動スクロールを開始。 |
noAutoscroll() | LCDの自動スクロールを停止。 |
leftToRight() | LCDの文字列の表示方向をデフォルトの「左から右」に設定。 |
rightToLeft() | LCDの文字列の表示方向を「右から左」に設定。 |
createChar(num, data) | ユーザ定義の文字を作成。 最大8文字まで登録可能。 |
いまいち、「使い方がわからない」というかたは入門番外編05、Lesson 16を見直してみてください。
サンプルコード
サンプルコードを下記に示します。
「サーミスタ計測のコード」と「Lesson 16」を組み合わせたコードです。
これまでの学習が役に立ちます。
これまで学習したことを組み合わせることで色んなことができる!
すこしづつですが、一歩一歩前進していきましょう!
できることが増えると、楽しみがどんどん広がります!
サンプルコード
温度変換の計算はオーバーフローが発生しないように、変数はfloat関数を使用します。
計算は、サーミスタの温度変換計算方法で示した式をそのまま使います。
※補足ですが精度を上げるために計算方法は他にも色々とあります。
また、計算するための基礎値はサーミスタの一般的な値を使用しました。
下記が「サーミスタ計測用コード」と「Lesson 16」を組み合わせたコードです。
//https://omoroya.com/ //Lesson18 サーミスタで簡易温度計 2つの電子部品の組み合わせ #include <LiquidCrystal.h> #define TempPin 0 // アナログ入力ピン0番 float B = 3950; //B定数の設定 float T0 = 298.15; //摂氏25度のケルビン温度 float R0 = 10000; //摂氏25度のサーミスタ抵抗 float R1 = 10000; //分圧測定のための抵抗 int ReadVal = 0; //アナログ入力で読み取るデータの格納変数 // 液晶のPIN割り当て // rs:7 en:8 d4:9 d5:10 d6:11 d7:12 に対応 LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { lcd.begin(16, 2); // LCDの行と列を設定 } void loop() { /* 計算 */ int ReadVal = analogRead(TempPin); //アナログ入力0でデータ読み取り float vout = (float)ReadVal / 1024.0f * 5.0f; //分圧した出力電圧の計算 float rth = ( 5.0f / vout -1 ) * R1; //サーミスタ抵抗計算 float tempK = 1 / ( 1/B * log( rth / R0 ) + ( 1/T0 )); //温度計算(ケルビン) float tempC = tempK -273.15; //摂氏に変換 float tempF = (tempC * 9.0)/5.0 +32.0; //華氏に変換 /* Display 表示 */ lcd.setCursor(0, 0); //1列目1行目に表示 lcd.print("Temp C "); //ディスプレイ表示 lcd.setCursor(5, 0); //5列目1行目に表示 lcd.print(tempC); //測定した摂氏温度をディスプレイに表示 lcd.setCursor(0, 1); //1列目2行目に表示 lcd.print("Res. ohm "); //ディスプレイ表示 lcd.setCursor(5, 2); //5列目2行目に表示 lcd.print(rth); //測定した抵抗値をディスプレイに表示 delay(500); //500ms待機 }
本コードでは、摂氏温度とサーミスタの抵抗値を表示するようにしました。
動作確認
では、さっそく動作を確認していきます。
ディスプレイのコントラストはポテンショメータを動かし調整してください。
まずは、室温を計測した状態。
温度は「Temp 27.98 C」と表示されました。
抵抗は「Res. 8770.64 ohm」と表示されました。
どうやら、うまくいったようです。
ちなみに、自分の体温も測ってみました!
「Temp. 36.51 C」
「Res. 6110.24 ohm」
市販品のデジタル体温計で測った体温が36.4℃でしたので、ばっちりですね!
体温計にしては、ちょっとでかすぎです・・・。
でも、動物を飼うときなどカゴの横にでも置いて温度確認には使えそうです。
半田で基板に実装してしてまおうかなと思案中です。
何と言っても、サーミスタは安いですから。
まとめ
今回は以下の内容について理解してもらいました。
今回も項目3の遊ぶことが一番の目標でした。
2.液晶ディスプレイとサーミスタを組み合わせることで「簡易温度計」を作成する。
3.楽しんで遊ぶ。
最後に、本Lessonも、「遊ぶというところが一番大事」なところです。
いかがだったでしょうか。
Lesson 18 サーミスタ編はここまで。
ぜひ、みなさんも子供と一緒にやられてみることをお勧めします。
ちなみに子供の反応はというと・・・
「超音波センサの方が面白い!!」
でした・・・。
サーミスタ、ちょっと地味でしたかね・・・。
「だって、Arduinoじゃなくても温度計で測れるし・・・。」
言われて確かにと思った次第です。
サーミスタの有用性を、うまく伝えられない私です・・・。
次回Lesson 19はDHT11の温湿度センサを使って液晶表示をさせようかと考えています。
電子部品を変えて、液晶ディスプレイを使うことで液晶ディスプレイの使い方に慣れるのも良いかなと考えています。
ということで「液晶」+「温湿度センサ」で行きましょう!
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
サーミスタでの温度測定、「inf」の出現に耐えられるか?
http://igarage.cocolog-nifty.com/blog/2024/05/post-6262a0.html
こんなタイトルで「ゼロ除算」問題をまとめてみました。
「1023 vs 1024」だけでなく、「ゼロで割るとどうなる?」という算数も絡んできます。
居酒屋ガレージ店主さん、お久しぶりです。
いつも、ためになる記事ありがとうございます!!
アナログ入力ピンで取得した戻り値から電圧の値を求める。
戻り値 ÷ 1023 × 5[V]
この「1023」、正しくは「1024」です。
スケッチも、
void loop()
{
/* 計算 */
int ReadVal = analogRead(TempPin); //アナログ入力0でデータ読み取り
float vout = (float)ReadVal / 1023.0f * 5.0f; //分圧した出力電圧の計算
float rth = ( 5.0f / vout -1 ) * R1; //サーミスタ抵抗計算
「1023.0f」は「1024.0f」でないと「1‰」ほどの誤差が出ます。
Rt = R1の時のA/D値、10bitの中央値になる「512」を入れた時、ちゃんとした
値になるかで、1023が誤りであることが分かるかと。
参考にどうぞ
2020年1月8日:ミスが広まる 1/1023 vs 1/1024
http://igarage.cocolog-nifty.com/blog/2020/01/post-a02d3f.html
2020年5月17日:Arduino なんとかして誤用を正したい:A/Dの1/1023とmap関数
http://igarage.cocolog-nifty.com/blog/2020/05/post-115911.html
2022年9月29日:103JTサーミスタの自己発熱。 5Vで10kΩはちょっとなぁ
http://igarage.cocolog-nifty.com/blog/2022/09/post-473b63.html
居酒屋ガレージ店主さん、お久しぶりです。
コメントありがとうございます!
以前指摘いただいた内容と同じですね。
修正しておきます!!!
お世話になっております 勉強させてもらってます。本当にどうもありがとうございます。
コメントありがとうございます。
そう言っていただけると更新する励みになります。
サーミスターって面白いですね。中身を見てみたいです。
コメントありがとうございます。
安い電子部品の割には、なかなか使える部品かなと思っています。
ガラス部分を割れば、中身が見れるかもしれませんが・・・
サーミスタ 構造
とかで検索してネット画像を見た方が手っ取り早いです!
勉強させていただいています。
回路図のアナログインプットがA2になっています。
※写真及びコードではA0
ほげさん、コメントありがとうございます。何気に自分では気づかないため、ご指摘とても助かります。さっそく回路図を修正しました。これからも、何か気づきましたらよろしくお願いします。