Category: Uncategorized

  • Orangepi + “MOS場效應管” 控制風扇開關

    Orangepi + “MOS場效應管” 控制風扇開關

    我平時試程式或其他Linux service , 都會用 orange pi zore 安裝 armbian 作為 server , 但這板子有點燙 , 所以我就想用板上的 GPIO 上的 5V , 推動5V風扇用作散熱

    把風扇直接接上 pin4 正極 及 pin6 接地 , 風扇就會轉動 , 但在家中安靜時風扇的噪音有點大

    所以我就想用温度控制風扇的開關 , 減少噪音的時間, 但兩腳的風扇開關只能用通電及斷電來控制 .

    我可以選擇 “三極管” 或 “MOS管” 來作開關 , 我手頭上有些 A2SHB N-MOS , 所以我今次用 MOS管 做示範 .

    以我所理解 MOS管用電壓來控制開關 , 三極管用電流控制開關 . 如果想詳細了解可以上網找相關內容, 我提供一個給大家參考

    URL = 用理论告诉你 三极管和MOS管的区别在哪-KIA MOS管 (kiaic.com)

    今次我用的 MOS 是 SI2302 印有 A2SHB 字樣 (好細粒)

    想了解一吓 MOS 管原理, 所以看看以下 youtube 視頻

    我的構想圖如下:

    不是每款MOS管的 vgs(th) 都是 1.2V , 我手上的 SI2302 的 vgs(th) 是1.2V 就能打開MOS管, 其他型號你要上網找找 vgs(th) 參數

    好了我們開始實作吧 , 先把細小的 A2SHB 焊在電路板固定 , MOS管D極焊同風扇負極接上 , MOS管S極同 GPIO (GND) 焊上 , MOS管G極同GPIO控制端口接上(我用了pin8 作為控制端口)

    記住 orangepi zero pin 4 正極 , pin 6 負極 , 我用 pin 7 控制風扇

    把風扇控制板與 orangepi zero 連接後, 以下就來寫控制風扇的程序了 !

    我的 orangepi 是行 armbian linux , 所以我的程序會用 python 3.x 所寫 , 先用 python 的安裝程式 pip , 裝上 OPi.GPIO library

    https://pypi.org/project/OPi.GPIO/

    下載 onoff_fan.zip 內有 onoff_fan.py 程序

    程序內容如下:

    #!/usr/bin/python3
    # -*- coding: UTF-8 -*-
    import OPi.GPIO as GPIO   # 載入 orangepi api
    import time
    FAN_PIN=7    # 風扇控制端
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(FAN_PIN, GPIO.OUT) #把風扇控端設置為輸出模式
    start_temp_value=45   #風扇ON溫度
    stop_temp_value=40   #風扇OFF溫度
    
    def get_temp():   # 讀取 CPU 溫度 function
        with open('/sys/class/thermal/thermal_zone0/temp') as fp:
            return int(fp.read()) // 1000
    
    try:
        while True:  # loop
            cputemp = get_temp()    # call 溫度 function
            if cputemp < stop_temp_value:
                GPIO.output(FAN_PIN, GPIO.LOW) # 如果CPU溫度降低, 控制端輸出低電壓 MOS 關閉
            elif cputemp > start_temp_value:
                GPIO.output(FAN_PIN, GPIO.HIGH) # 如果CPU溫度升高, 控制端輸出高電壓 MOS 開啓
            time.sleep(10)  # 暫停 10 秒
    except Exception as e:
        print(e)
    
    GPIO.cleanup(FAN_PIN)
    

    稍微講解程序內一些段落

    def get_temp():
             with open(‘/sys/class/thermal/thermal_zone0/temp’) as fp: 
                       return int(fp.read()) // 1000

    這一段定義 get_temp()  function  , 內容是讀取系統內CPU溫度的數據 , 之後 result 時把數據   / 1000  , 就會得出我們平時多少  XX 度了

    #循環開始
            while True: 

    #CALL function 讀取溫度數據 
                cputemp = get_temp() 

    #判斷溫度是否低於我們設定風扇停轉的數值, 如果 “TRUE” 就把 pin7 輸出設定為低電壓, MOS 管截止 , 風扇迴路成為開路, 沒有電流流過而停轉
                if cputemp < stop_temp_value:
                     GPIO.output(FAN_PIN, GPIO.LOW) 

    #判斷溫度是否高於我們設定風扇開啟的數值, 如果 “TRUE” 就把 pin7 輸出設定為高電壓, MOS 管導通 , 風扇迴路成為閉路, 有電流流過而轉動
                elif cputemp > start_temp_value:
                    GPIO.output(FAN_PIN, GPIO.HIGH)

    #程序暫停10秒才進入下一個循環
                 time.sleep(10)