歡迎光臨
我們一直在努力

Arduino製作可調速電風扇

暑假到了,隨之而來的是炎熱的天氣,這篇文章將會教大家使用一個電腦主板上淘汰下來的CPU散熱風扇來製作一個電扇。

這個風扇可以通過按下一個開關來進行開,關,和調速。

用到的工具

  • 廢舊的CPU風扇(我的是4pin的)
  • Arduino UNO
  • 麵包板
  • 電阻(1-10千歐)
  • 12V 電源
  • 電腦(用來編程)
  • 按鈕開關

既然是第一次在博客上發關於Arduino的文章,那麼先來介紹一下吧。

Arduino 是一款開源的電子平台 點擊進入官網 , 可以使用這個硬件來進行物聯網方面的DIY,製作飛行器,3D打印機等等都可以用到Arduino,售價低廉,某寶上20元就能拿下,總之,只有你想不到,沒有Arduino做不 到,今天的這個文章只會初步的來使用Arduino。

既然要做個風扇,那麼首先要讓這個風扇可以動起來,根據經驗,任何電器只要給正負極通上電就可以工作,所以先來試一下。 首先,這個風扇的正常工作電壓是12V,壞消息是我手上並沒有這麼高電壓的電源,只有一個10V輸出的電源(一個筆記本電腦電池),不過沒有關係,先湊合用吧。 不過正負極怎麼接呢? 看下一般4pin CPU風扇的規格:

Pin Name Color
1 GND black
2 +12VDC yellow
3 FAN_TACH green
4 FAN_CONTROL blue

所以首先把,電源正極和負極分別接到,pin2 和 pin1 上,風扇就可以工作了。

注:這樣將導線直接接入電池兩級的做法很危險,請不要模仿

既然大概的功能實現了,接下來就要開始調整轉速了。 通常調整電機轉速使用了PWM技術,下面來科普一下PWM,

PWM(Pulse-width modulation)脈衝寬度調製,這個技術可以利用微處理器的數字輸出來對模擬電路進行控制。 簡單地說,PWM信號是一個方形波,在方波中,波峰代表高電平,波谷代表低電平,雖然這個方形波的頻率是固定的,但是高電平的時間除以總時間的值 是可以從0到100%改變的,這個值叫做 佔空比 。 通過控制佔空比,就可以對電路進行進一步控制。

  • Duty Cycle(佔空比)

佔空比就是一個脈衝週期內高電平所在整個週期中占得比例,比如一個脈衝週期10秒,其中9秒是高電平,那麼佔空比就是90%。 具體點的話:如果一個脈衝週期由10個信號(0或1)組成,那麼1111100000信號就代表50%的duty cycle,因為整個信號由5個1,5個0組成.

PWM的用途很廣,舉幾個例子

  • 調整LED亮度(在最高輸出電壓恆定的時候)
  • 控制電機,舵機轉速(使用很廣泛)
  • 生成聲音信號
  • 調整信號

在Arduino中,很容易就能實現PWM,只要調用 analogWrite(pin,dutyCycle) 函數就行,其中,dutyCycle的值是從0到255中的任意一個,pin只能是PWM專用PIN(3,5 ,6,9, 10 或者11)。 雖然這個函數已經提供了一個簡單的方法來控制PWM,但是還不能通過頻率來控制,不過對於這個項目來說夠用了。 想要更深層次的控制,可以使用ATmega的PWM寄存器來直接控制(Arduino的ATmega 168P/328P芯片擁有3個PWM計時器,可以控制6個PWM輸出,通過這些可以實現比 analogWrite() 函數更強大的功能)

知道了PWM,的功能與用法之後,現在開始做開關,這個開關充當調速的功能。

在這裡使用一個很常見的四角開關:四個角分別為A,B,C,D,平時A,B是連通的,C,D是連通的,當開關被按下後,ABCD四個角就 都會被連通。

通過以下方式接線,5V輸出接AB腳,A5 pin接CD腳,A5pin可以讀到當前電路的電壓,當開關按下後,A5的度數會增高,從而知道開關被按下。

電路搭建好了之後測試試一下,編寫以下代碼:

其中,analogRead(int pin),是模擬輸入函數,他把5V電壓分為1024份,也就是說,輸出值為0-1023,我設定當這個值大於1000,也就是4.8V差不多的時候判定 為開,否則視為開關為關。

void setup(){
    Serial.begin(9600);
 }
  
  void loop(){
     handleSwitch();
 }


 void handleSwitch(){
     int i;
     i=analogRead(5); //讀取5號pin
     if(i>1000){
       Serial.println("High");
     } else{
         Serial.println("Low");
     }
 } 

之後運行一下程序,看一下串口監視器,情況並不是我們想像的那樣樂觀:

在輸出結果里居然有很多High,可是我並沒有按下開關,這是由於外界信號對開關的干擾導致的。

需要並聯一個 下拉電阻 來克服這個問題

在開關的接口與GND之間接一個1K-10K Ω的電阻。 其作用是當外界有乾擾源的時候(不確定信號),在斷開狀態下,這個信號會通向GND從而被被電阻消耗掉。

這樣連接電阻後,再運行代碼,會發現一直輸出Low,按下時輸出High,沒有乾擾問題了。

之後就可以去連接電扇了,CPU風扇的Pin 1,Pin2,還是連接電池的正極,負極,pin 3,連接到Arduino的Pin 6, Pin 4連接到 Arduino的Pin 3 。 我又加了3個LED等分別代表低檔,中檔,高檔三個檔位的指示燈。 (圖中的電機是我隨便放的部件,代指CPU風扇)

代碼如下:

int lastStatus = 0; //儲存上一次開關的狀態
 int counter = 0; //計數器
 int fanPulse = 6; //風扇數據讀取pin
 unsigned long pulseDuration;

 int pin_low_speed_led = 13;
 int pin_mid_speed_led = 12;
 int pin_high_speed_led = 11;

 void setup(){
    pinMode(pin_low_speed_led, OUTPUT);
    pinMode(pin_mid_speed_led, OUTPUT);
    pinMode(pin_high_speed_led, OUTPUT);
    Serial.begin(9600);
    pinMode(fanPulse, INPUT);
    digitalWrite(fanPulse,HIGH);
    counter++;
    shift();
 }
  
   void loop(){
   while(1)
   {
     handleSwitch();
   }
 }

 void updateLED(){ //更新led指示燈
   switch(counter%3){
     case 0: digitalWrite(pin_low_speed_led, HIGH);digitalWrite(pin_mid_speed_led, LOW);digitalWrite(pin_high_speed_led, LOW);break;
     case 1: digitalWrite(pin_mid_speed_led, HIGH);digitalWrite(pin_high_speed_led, LOW);digitalWrite(pin_low_speed_led, LOW);break;
     case 2: digitalWrite(pin_high_speed_led, HIGH);digitalWrite(pin_mid_speed_led, LOW);digitalWrite(pin_low_speed_led, LOW);break;
   }
 }

 void handleSwitch(){ //處理開關
  
     int i;
     i=analogRead(5);
     if(i>1000){
      
       if (lastStatus == 0){
         // Serial.println("High");
           counter++;
           shift();
       }
       lastStatus = 1;
      
     } else{
        if (lastStatus == 1){
         // Serial.println("Low");
        }
        lastStatus = 0;
     }
      delay(10);
 }

 void shift(){ //換擋
   Serial.println("Current Fan Speed Mode:");
   switch(counter%3){
     case 0: Serial.println("LOW");analogWrite(3,0); delay(500);readPulse();break;
     case 1: Serial.println("MID");analogWrite(3,150); delay(500);readPulse();break;
     case 2: Serial.println("HIGH"); analogWrite(3,255);delay(500);readPulse();break;
   }
   updateLED();
 }

 void readPulse() { //讀取相關信息
   pulseDuration = pulseIn(fanPulse, LOW);
   double frequency = 1000000/pulseDuration;

   Serial.print("pulse duration:");
   Serial.println(pulseDuration);

   Serial.println("");
 } 

之後燒錄程序,風扇就可以調速了,每次按下按鈕就會調速,不同的指示燈會根據不同的速度亮。

好了,這次就介紹到這裡,不過CPU風扇的扇葉是反的,必須對著底部才能吹到風哦~

我的博客MikeTech app現已登陸iPhone和Android

iPhone版下載
Android版下載

 

 

打賞

微信掃一掃支付

微信logo 微信掃一掃,打賞作者吧~

未經允許不得轉載:頭條楓林網 » Arduino製作可調速電風扇