暑假到了,隨之而來的是炎熱的天氣,這篇文章將會教大家使用一個電腦主板上淘汰下來的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