3.1.4 スマートファン

前書き

このコースでは、モーター、ボタン、サーミスターを使用して、風速が調整可能な手動+自動のスマートファンを作成する。

部品

_images/list_Smart_Fan.png

回路図

Tボード名

physical

wiringPi

BCM

GPIO17

Pin 11

0

17

GPIO18

Pin 12

1

18

GPIO27

Pin 13

2

27

GPIO22

Pin 15

3

22

GPIO5

Pin 29

21

5

GPIO6

Pin 31

22

6

GPIO13

Pin 33

23

13

_images/Schematic_three_one4.png

実験手順

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

Smart Fan_bb

注釈

電源モジュールはキットの9Vバッテリーバックルで9Vバッテリーを適用できる。電源モジュールのジャンパキャップをブレッドボードの5Vバスストリップに挿入する。

\_MG_2084

C言語ユーザー向け

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

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

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

gcc 3.1.4_SmartFan.c -lwiringPi -lm

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

sudo ./a.out

コードが実行された後、ボタンを押してファンを起動する。押すたびに、1つのレベルが上下に調整される。5 種類のレベルがある:0〜4。4番目のレベルに設定してボタンを押すと、ファンの風速が**0**で動作が停止する。

注釈

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

温度が2℃以上上昇または下降すると、速度は自動的に1グレード速くまたは遅くなる。

コードの説明

int temperture(){
    unsigned char analogVal;
    double Vr, Rt, temp, cel, Fah;
    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;
    int t=cel;
    return t;
}

Temperature()は、ADC0834によって読み取られたサーミスタ値を温度値に変換することによって機能します。 詳細については、2.2.2 Thermistor を参照してください。

int motor(int level){
    if(level==0){
        digitalWrite(MotorEnable,LOW);
        return 0;
    }
    if (level>=4){
        level =4;
    }
    digitalWrite(MotorEnable,HIGH);
    softPwmWrite(MotorPin1, level*25);
    return level;
}

この機能は、モーターの回転速度を制御する。レベル の範囲:0〜4 (レベル 0 は動作中のモーターを停止する)。1つのレベル調整は風速の 25% の変化を表す。

int main(void)
{
    setup();
    int currentState,lastState=0;
    int level = 0;
    int currentTemp,markTemp=0;
    while(1){
        currentState=digitalRead(BtnPin);
        currentTemp=temperture();
        if (currentTemp<=0){continue;}
        if (currentState==1&&lastState==0){
            level=(level+1)%5;
            markTemp=currentTemp;
            delay(500);
        }
        lastState=currentState;
        if (level!=0){
            if (currentTemp-markTemp<=-2){
                level=level-1;
                markTemp=currentTemp;
            }
            if (currentTemp-markTemp>=2){
                level=level+1;
                markTemp=currentTemp;
            }
        }
        level=motor(level);
    }
    return 0;
}

関数 main()上 には、次のようにプログラムプロセス全体が含まれている:

  1. ボタンの状態と現在の温度を常に読み取る。

  2. ボタンを押すごとに、レベル+1 になり、同時に温度が更新される。レ れベル 範囲 1〜4

  3. ファンが作動すると(レベルは 0ではない )、温度は検出中である。2℃+ 以上変更すると、レベルが上下に変化する。

  4. モーターは レベル に応じて回転速度を変更する。

Python言語ユーザー向け

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

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

ステップ3: 実行する。

sudo python3 3.1.4_SmartFan.py

コードが実行された後、ボタンを押してファンを起動する。押すたびに、1つのレベルが上下に調整される。5 種類のレベルがある:0〜4。4番目のレベルに設定してボタンを押すと、ファンの風速が**0**で動作が停止する。

温度が2℃以上上昇または下降すると、速度は自動的に1グレード速くまたは遅くなる。

コード

注釈

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

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

# Set up pins
MotorPin1   = 5
MotorPin2   = 6
MotorEnable = 13
BtnPin  = 22


def setup():
    global p_M1,p_M2
    ADC0834.setup()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(MotorPin1, GPIO.OUT)
    GPIO.setup(MotorPin2, GPIO.OUT)
    p_M1=GPIO.PWM(MotorPin1,2000)
    p_M2=GPIO.PWM(MotorPin2,2000)
    p_M1.start(0)
    p_M2.start(0)
    GPIO.setup(MotorEnable, GPIO.OUT, initial=GPIO.LOW)
    GPIO.setup(BtnPin, GPIO.IN)

def temperature():
    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
    return Cel

def motor(level):
    if level == 0:
        GPIO.output(MotorEnable, GPIO.LOW)
        return 0
    if level>=4:
        level = 4
    GPIO.output(MotorEnable, GPIO.HIGH)
    p_M1.ChangeDutyCycle(level*25)
    return level


def main():
    lastState=0
    level=0
    markTemp = temperature()
    while True:
        currentState =GPIO.input(BtnPin)
        currentTemp=temperature()
        if currentState == 1 and lastState == 0:
            level=(level+1)%5
            markTemp = currentTemp
            time.sleep(0.5)
        lastState=currentState
        if level!=0:
            if currentTemp-markTemp <= -2:
                level = level -1
                markTemp=currentTemp
            if currentTemp-markTemp >= 2:
                level = level +1
                markTemp=currentTemp
        level = motor(level)


def destroy():
    GPIO.output(MotorEnable, GPIO.LOW)
    p_M1.stop()
    p_M2.stop()
    GPIO.cleanup()

if __name__ == '__main__':
    setup()
    try:
        main()
    except KeyboardInterrupt:
        destroy()

コードの説明

def temperature():
    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
    return Cel

Temperature()は、ADC0834 によって読み取られたサーミスタ値を温度値に変換することによって機能します。 詳細については、2.2.2 Thermistor を参照してください。

def motor(level):
    if level == 0:
        GPIO.output(MotorEnable, GPIO.LOW)
        return 0
    if level>=4:
        level = 4
    GPIO.output(MotorEnable, GPIO.HIGH)
    p_M1.ChangeDutyCycle(level*25)
    return level

この機能はモーターの回転速度を制御する。レバー の範囲: 0〜4 (レベル 0 は動作中のモーターを停止する)。1つのレベル調整は風速の 25% の変化を表す。

def main():
    lastState=0
    level=0
    markTemp = temperature()
    while True:
        currentState =GPIO.input(BtnPin)
        currentTemp=temperature()
        if currentState == 1 and lastState == 0:
            level=(level+1)%5
            markTemp = currentTemp
            time.sleep(0.5)
        lastState=currentState
        if level!=0:
            if currentTemp-markTemp <= -2:
                level = level -1
                markTemp=currentTemp
            if currentTemp-markTemp >= 2:
                level = level +1
                markTemp=currentTemp
        level = motor(level)

関数 main()上 には、次のようにプログラムプロセス全体が含まれている:

  1. ボタンの状態と現在の温度を常に読み取る。

  2. ボタンを押すごとに、レベル+1 になり、同時に温度が更新される。レ れベル 範囲 1〜4

  3. ファンが作動すると(レベルは 0ではない )、温度は検出中である。2℃+ 以上変更すると、レベルが上下に変化する。

  4. モーターは レベル に応じて回転速度を変更する。

現象画像

_images/image246.png