跳到主要內容

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 微信掃一掃,打賞作者吧~







http://www.buzzfunnews.com/2018037625.html

更多有趣新聞請上:http://www.buzzfunnews.com

留言

這個網誌中的熱門文章

實木床的挑選技巧 軟木床和實木床哪個好

床,對我們每一個人而言都是一個非常重要的生活用具,睡眠的好壞與我們每天睡的床息息相關。 那麼實木床的挑選技巧有哪些、軟木床和實木床到底哪個更好呢,下面,小編就來給大家進行一下介紹吧。 床,對我們每一個人而言都是一個非常重要的生活用具,睡眠的好壞與我們每...

這一次,卷福終於不演天才了

去年一年, “卷福”本尼迪克特·康伯巴奇 非常忙碌。 除了與邁克爾·珊農在熱門的歷史劇《戰爭法》中有合作之外,他去年還花了很多時間參與了大片《復仇者聯盟3:無限戰爭》的拍攝。 另外,康伯巴奇繼續發展著他的製作公司SunnyMarch,並投入到他們迄今為止最大的一筆投資——一部新...

2018華為P20法國巴黎新品發布會視頻直播 3月27日北京時間

日前,華為官方已經宣布將於3月27日在法國·巴黎召開新品發布會,但是並沒有公佈更具體的時間,現在,華為高級副總裁在微博上宣布,華為P20全球發布會將於北京 時間3月27日20:30在法國巴黎舉行,屆時華為視頻會對全程進行視頻直播。    余承東:華為P20發布會3月27日晚8點半(圖片引自微博...