Arduinoと戯れてみる!

子供と一緒に始める マイコンプログラム Arduino 入門 サーミスタ編 Lesson 18

Arduino-lesson18-00 Arduino入門編
スポンサーリンク
「子供と一緒に始める マイコンプログラム Arduino 入門 サーミスタ編 Lesson 18」

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

 

本日はLesson 18 サーミスタ編です。

前回Lesson17にて「液晶ディスプレイ + 超音波センサ」の使い方を学習しました。

 

本Lessonでは、「液晶ディスプレイ+サーミスタ」に挑戦です。

サーミスタは温度によって抵抗が変化する素子です。

といっても、どんな抵抗でも少なからず温度によって変化はするんですが・・・。

 

今回はサーミスタ(thermistor)から得た情報を液晶ディスプレイに表示します。

今回もLesson17同様にPCを使わずに、Arduinoと電子部品だけで何かをするための学習も兼ねています。

 

サーミスタで取得した値を温度に変換し液晶に表示させる」ことが最終目標です。

これで、簡易的な「温度計」の完成です。

あとは、電池などでArduinoの電源を確保すればパソコン不要となります。

そのため、今回もLesson17と同じく電池を使います。

 

電源の確保方法は2種類あるのですが、詳細については番外編で説明したいと考えます。

記事を後ほどアップする予定です。

しばらくお待ちください。

 

本Lesson解説で使用しているのはArduino互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

スポンサーリンク

はじめに

温度の計測はサーミスタの抵抗変化を読み取ることで行います。

Wikipedia サーミスタ

サーミスタ(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と同じです。

 

必要なもの

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

使用部品説明

主要な電子部品は3つです。

サーミスタ1602 LCD ディスプレイモジュールポテンショメータ(可変抵抗器)です。

また、電池接続のため「電池スナップDCプラグアダプタ」を使用します。

簡単に電源を取るための方法の1つです。

 

サーミスタ仕様

サーミスタはNTC(負の温度係数)とPTC(正の温度係数)の2種類があります。

 

一般的に温度測定には、温度と抵抗値の関係が簡単な近似式で表されるNTCが使われます。

NTCは温度検知の他に、温度補償、突入電流抑制などにも使われます。

 

PTCは温度が上昇すると抵抗が増加します。

つまり、電流を流すと自己発熱によって抵抗が増大し電流を流れにくくします。

その性質を利用して回路を保護する保護素子、加熱検知、ヒータなどにも使われています。

 

NTCサーミスタ性能(Amazonで販売されている下記の仕様となります)
項目仕様
断熱材質セラミック
温度範囲-30度~+125℃
抵抗値10KΩ
B値3950±1%
精度5%

※B値とはサーミスタのB定数と呼ばれ、サーミスタごとに異なります。

 

サーミスタの温度変換計算方法

NTCのサーミスタから温度を取得するためには次式で計算することが可能です。
※ネットなどで検索すればすぐにでてくるかと思います。

Rth = R0×exp(B (1/T-1/T0) )

B定数の単位はK(ケルビン)なのでケルビン基準で計算する必要があります。

Rth:計測時の周辺温度による抵抗値
B:3950(サーミスタの仕様によります)

R0:25℃での抵抗値(サーミスタの仕様に記載されています)
T:計測時の周辺温度(ケルビン)

T0:25℃でのケルビン温度 298.15[K]
※摂氏とケルビンの変換は、摂氏温度+273.15となります。

今回使用するのは10kΩ(25℃)のサーミスタを使用するため

R0 = 10kΩです。

 

温度に変換する場合は上記の式をTについて解きなおせばよいわけです。

解法は exp ⇒ log 変換の数学のため割愛します。

1/T = 1/B × ln(Rth/R0) + 1/T0

※Tはケルビン、摂氏への変換はT – 273.15

 

サーミスタからの抵抗値取得

温度を知るためには、サーミスタの抵抗値を計測する必要があります。

Arduinoで抵抗値を測定する方法は電圧を測定することで計算できます。

 

回路構成例を下図に示します。

Arduino-lesson18-01

 

Rth:サーミスタの抵抗
R1:分圧測定のための抵抗

今回R1は10kΩを使います。

25℃で10kΩのサーミスタを使う場合は、R1に10kΩを使うことで25℃で出力電圧が1/2中心になるため扱いやすいと考えます。

上図のVoutの計算式は以下となります。

Vout = R1/(Rth+R1)×Vin
Rthを左辺に変形すればサーミスタの抵抗値を求めることができます。
Rth=(Vin/Vout-1)×R1

 

Arduinoではアナログ入力ピンで電圧を読み取ります。

その場合は、ArduinoのA/Dコンバータにより電圧値がデジタル値に変換されるため計算で戻す必要があります。

アナログ入力ピンで取得した戻り値から電圧の値を求める。
戻り値 ÷ 1023 × 5[V]

アナログ入力の詳細に関しては下記を参照ください。

Arduino 入門 番外編 05 アナログ入力 とは
今回は、「Arduino 入門 番外編 05 アナログ入力 とは」です。arduino 入門 番外編はarduinoの基本的なことを書いていく方向性にする予定です。今回は、arduinoのアナログ入力について解説していきます。…

 

1602 LCD モジュール仕様

1602 LCD モジュールについてはLesson 16の解説をご覧ください。

 

表面

Arduino-lesson16-02

 

裏面

Arduino-lesson16-03

 

ポテンショメータ仕様

ポテンショメータについてはLesson 12の解説をご覧ください。

 

Arduino-lesson09-03

 

電池スナップDCプラグアダプタ

Lesson17で電池接続のために使用したものと同じです。

Arudinoと電池を簡単に接続するための部品です。

電池スナップDCプラグアダプタ

 

これはArduinoの外形5.5mm、内径2.1mmのDCプラグに接続するためのものです。

Arudino側としては7V~12Vの範囲の電圧入力が必要となります。

電源の取り方としては、手軽な方法です。

 

部品は以下のものとなります。

Arduino-lesson17-01

 

Arduinoの接続箇所は下記となります。

Arduino-lesson17-02

 

安い物から、複数個、ハードケースなどがあります。

好みで選択してください。

 

単品。

 

複数個購入したい場合。

 

ハードケースを希望の場合。

 

実践 回路作成とコード作成

ではさっそく動かしていきましょう。

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、測定した温度をディスプレイに表示しましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

回路図がこちら。

部品は「サーミスタ」「10kΩ」「1602 LCD モジュール」と「ポテンショメータ」です。

電源は「9Vの電池」です。

今回も、Lesson16同様に4bitモードとして動作させるためDB0~DB3は使用しません。

Arduino-lesson18-02

 

こちらがブレッドボード図。

Arduino-lesson18-03

 

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品は「サーミスタ」「10kΩ」「1602 LCD モジュール」「ポテンショメータ」です。

電源は9Vの電池をアダプタで接続しています。

「ポテンショメータ」がないかたはVOを直接VDDにつないでいただいてもかまいません。

コントラストの調整ができないだけです。

ただし、明るすぎて見えない場合は数kΩ程度の抵抗をつけて調整してください。

 

Arduino-lesson18-04

 

 

使用するポートは、アナログ入力ピンの「0」、デジタル入力ピンの「7,8,9,10,11,12」。

電源の外部入力電源端子です。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

今回は、サーミスタ計測用のコードとLesson 16で作成したコードを組み合わせることで作成します。

 

標準ライブラリ設定

LCDのコードはLesson 16にてライブラリを使いましたので以下の設定をお願いします。

すでに、Lesson 16を学習したかたは飛ばしてください。

 

LiquidCrystal.h」を下記のいずれかで使えるようにしてください。

このライブラリを使うことで、HD44780とその互換チップセットを搭載したLCDを制御できるようになります。

4bit、8bit両方のモードをサポートしているライブラリです。

 

標準ライブラリのため、基本は初めから実装されているはずです。

ない場合は、下記を実施ください。

IDEの統合環境から
1.Zip形式のライブラリをインクルード
2.ライブラリの管理
どちらでも可能です。

 

1.Zip形式のライブラリをインクルードする場合
以下から「LiquidCrystal.zip」をダウンロード。
ダウンロードサイト
2.ライブラリの管理からインストールする場合。
タイプ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文字まで登録可能。

 

いまいち、「使い方がわからない」というかたは入門番外編05Lesson 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 / 1023.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」と表示されました。

どうやら、うまくいったようです。

Arduino-lesson18-05

 

 

ちなみに、自分の体温も測ってみました!

Temp.  36.51  C

Res.  6110.24 ohm

市販品のデジタル体温計で測った体温が36.4℃でしたので、ばっちりですね!

Arduino-lesson18-06

 

 

体温計にしては、ちょっとでかすぎです・・・。

でも、動物を飼うときなどカゴの横にでも置いて温度確認には使えそうです。

半田で基板に実装してしてまおうかなと思案中です。

何と言っても、サーミスタは安いですから。

 

まとめ

今回は以下の内容について理解してもらいました。

今回も項目3の遊ぶことが一番の目標でした。

1.サーミスタの使い方を理解する。
2.液晶ディスプレイとサーミスタを組み合わせることで「簡易温度計」を作成する。
3.楽しんで遊ぶ。

 

最後に、本Lessonも、「遊ぶというところが一番大事」なところです。

 

いかがだったでしょうか。

Lesson 18 サーミスタ編はここまで。

ぜひ、みなさんも子供と一緒にやられてみることをお勧めします。

 

ちなみに子供の反応はというと・・・

「超音波センサの方が面白い!!」

でした・・・。

 

サーミスタ、ちょっと地味でしたかね・・・。

だって、Arduinoじゃなくても温度計で測れるし・・・。

言われて確かにと思った次第です。

 

サーミスタの有用性を、うまく伝えられない私です・・・。

 

次回Lesson 19はDHT11の温湿度センサを使って液晶表示をさせようかと考えています。

電子部品を変えて、液晶ディスプレイを使うことで液晶ディスプレイの使い方に慣れるのも良いかなと考えています。

 

ということで「液晶」+「温湿度センサ」で行きましょう!

子供と一緒に始める マイコンプログラム Arduino 入門 LCDと温湿度センサ編 Lesson 19
本日はLesson 19 LCDと温湿度センサ編です。本Lessonでは、液晶ディスプレイ+温湿度センサに挑戦です。今回の目標は温湿度センサで取得した値を液晶に表示させることです。液晶ディスプレイを理解するための最後のLessonです。簡易…

 

疑問点、質問などありましたら気軽にコメントください。

リンク切れなどあればコメントいただけると助かります。

 

本Lessonで使用しているUNOはAmazonにて購入可能です。

Amazon ベストセラーNo.1
ELEGOO UNO キット レベルアップ  チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

コメント

タイトルとURLをコピーしました