2.2.2 サーミスタ

前書き

フォトレジスターが光を感知できるように、サーミスターは温度に敏感な電子デバイスであり、過熱警報装置の作成など、温度制御の機能を実現するために使用できる。

部品

_images/list_2.2.2_thermistor.png

原理

サーミスタは、温度のわずかな変化に比例して抵抗の予測可能な変化を正確に示す熱に敏感な抵抗器である。その抵抗がどの程度変化するかは、その独自の構成に依存する。サーミスタは、受動部品の大きなグループの一部である。また、対応するアクティブコンポーネントとは異なり、パッシブデバイスは回路に電力上昇または増幅を提供できない。

サーミスタは敏感な要素であり、負の温度係数(NTC)と正の温度係数(PTC)の2つのタイプがあり、NTCとPTCとも呼ばれる。その抵抗は温度によって大きく異なる。PTCサーミスタの抵抗は温度とともに増加するが、NTCの条件は前者とは逆である この実験では、NTCを使用する。

_images/image325.png

その動作原理は、NTCサーミスタの抵抗が外部環境の温度とともに変化することである。環境のリアルタイム温度を検出できる。温度が高くなると、サーミスタの抵抗が減少する。次に、電圧データはA/Dアダプターによってデジタル量に変換される。摂氏または華氏の温度はプログラミングにより出力される。

この実験では、サーミスタと10kプルアップ抵抗が使用される。各サーミスタには通常の抵抗がある。ここでは、25℃で測定されると、10k ohmである。

抵抗と温度の関係は次の通りである:

RT =RN expB(1/TK – 1/TN)

RT は温度が TK のときのNTCサーミスタの抵抗である。

RN は、定格温度 TN でのNTCサーミスタの抵抗である。ここで、 RN の数値は10kである。

TK はケルビン温度で、単位はKである。ここで、 TK の数値は273.15である。+摂氏度である。

TN は定格ケルビン温度で、単位もKである。ここで、 TN の数値は273.15 + 25である。

また、NTCサーミスタの構成要素定数である B(ベータ)は、数値3950の熱感受性指数とも呼ばれる。

exp は指数の略語で、基数eは自然数であり、約2.7に等しくなる。

この式TK=1/(ln(RT/RN)/B+1/TN) を変換して、マイナス273.15が摂氏温度に相当するケルビン温度を取得する。

この関係は実験式である。温度と抵抗が有効範囲内にある場合にのみそれは正確である。

回路図

_images/image323.png _images/image324.png

実験手順

ステップ1: 回路を作る。

_images/image202.png

C言語ユーザー向け

ステップ2: コードのフォルダーに入る。

cd /home/pi/davinci-kit-for-raspberry-pi/c/2.2.2/

ステップ3: コードをコンパイルする。

gcc 2.2.2_Thermistor.c -lwiringPi -lm

注釈

-lmはライブラリの数学をロードする。省略すると、エラーが発生する。

ステップ4: EXEファイルを実行する。

sudo ./a.out

コードを実行すると、サーミスタは周囲温度を検出する。周囲温度は、プログラムの計算が終了すると画面に出力される。

注釈

If it does not work after running, or there is an error prompt: "wiringPi.h: No such file or directory", please refer to Cコードが機能していませんか?.

コード

#include <wiringPi.h>
#include <stdio.h>
#include <math.h>

typedef unsigned char uchar;
typedef unsigned int uint;

#define     ADC_CS    0
#define     ADC_CLK   1
#define     ADC_DIO   2

uchar get_ADC_Result(uint channel)
{
    uchar i;
    uchar dat1=0, dat2=0;
    int sel = channel > 1 & 1;
    int odd = channel & 1;

    pinMode(ADC_DIO, OUTPUT);
    digitalWrite(ADC_CS, 0);
    // Start bit
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    //Single End mode
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    // ODD
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,odd);  delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    //Select
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,sel);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);

    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);

    for(i=0;i<8;i++)
    {
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);

        pinMode(ADC_DIO, INPUT);
        dat1=dat1<<1 | digitalRead(ADC_DIO);
    }

    for(i=0;i<8;i++)
    {
        dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);
    }

    digitalWrite(ADC_CS,1);
    pinMode(ADC_DIO, OUTPUT);
    return(dat1==dat2) ? dat1 : 0;
}

int main(void)
{
    unsigned char analogVal;
double Vr, Rt, temp, cel, Fah;
    if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen
        printf("setup wiringPi failed !");
        return 1;
    }
    pinMode(ADC_CS,  OUTPUT);
    pinMode(ADC_CLK, OUTPUT);

    while(1){
        analogVal = get_ADC_Result(0);
        Vr = 5 * (double)(analogVal) / 255;
        Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
        temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
        cel = temp - 273.15;
        Fah = cel * 1.8 +32;
        printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);
        delay(100);
    }
    return 0;
}

コードの説明

#include <math.h>

一般的な数学的操作と変換を計算する一連の関数を宣言するC数値ライブラリがある。

analogVal = get_ADC_Result(0);

この関数はサーミスタの値を読み取るために使用される。

Vr = 5 * (double)(analogVal) / 255;
Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
cel = temp - 273.15;
Fah = cel * 1.8 +32;
printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);

これらの計算により、サーミスタ値が摂氏値に変換される。

Vr = 5 * (double)(analogVal) / 255;
Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));

Rt(サーミスタの抵抗)を取得するために、これらの2行のコードは読み取り値アナログを使って電圧分布を計算している。

temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));

このコードは、Rtを式 TK=1/(ln(RT/RN)/B+1/TN) に挿入してケルビン温度を取得することを意味する。

temp = temp - 273.15;

ケルビン温度を摂氏に変換する。

Fah = cel * 1.8 +32;

摂氏を華氏に変換する。

printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);

ディスプレイに摂氏度、華氏度とそれらの単位を表示する。

Python言語ユーザー向け

ステップ2: コードのフォルダーに入る。

cd /home/pi/davinci-kit-for-raspberry-pi/python/

ステップ3: EXEファイルを実行する。

sudo python3 2.2.2_Thermistor.py

コードを実行すると、サーミスタは周囲温度を検出する。周囲温度は、プログラムの計算が終了すると画面に出力される。

コード

注釈

以下のコードを 変更/リセット/コピー/実行/停止 できます。 ただし、その前に、 davinci-kit-for-raspberry-pi/python のようなソースコードパスに移動する必要があります。

import RPi.GPIO as GPIO
import ADC0834
import time
import math

def init():
    ADC0834.setup()

def loop():
    while True:
        analogVal = ADC0834.getResult()
        Vr = 5 * float(analogVal) / 255
        Rt = 10000 * Vr / (5 - Vr)
        temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))
        Cel = temp - 273.15
        Fah = Cel * 1.8 + 32
        print ('Celsius: %.2f C  Fahrenheit: %.2f F' % (Cel, Fah))
        time.sleep(0.2)

if __name__ == '__main__':
    init()
    try:
        loop()
    except KeyboardInterrupt:
        ADC0834.destroy()

コードの説明

import math

一般的な数学的操作と変換を計算する一連の関数を宣言するC数値ライブラリがある。

analogVal = ADC0834.getResult()

この関数はサーミスタの値を読み取るために使用される。

Vr = 5 * float(analogVal) / 255
Rt = 10000 * Vr / (5 - Vr)
temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))
Cel = temp - 273.15
Fah = Cel * 1.8 + 32
print ('Celsius: %.2f °C  Fahrenheit: %.2f ℉' % (Cel, Fah))

これらの計算はサーミスタの値を摂氏度と華氏度に変換する。

Vr = 5 * float(analogVal) / 255
Rt = 10000 * Vr / (5 - Vr)

Rt(サーミスタの抵抗)を取得するために、これらの2行のコードは読み取り値アナログを使って電圧分布を計算している。

temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))

このコードは、Rtを式 TK=1/(ln(RT/RN)/B+1/TN) に挿入してケルビン温度を取得することを意味する。

temp = temp - 273.15

ケルビン温度を摂氏に変換する。

Fah = Cel * 1.8 + 32

摂氏を華氏に変換する。

print ('Celsius: %.2f °C  Fahrenheit: %.2f ℉' % (Cel, Fah))

ディスプレイに摂氏度、華氏度とそれらの単位を表示する。

現象画像

_images/image203.jpeg