前面的章節我們已經學會如果用數位輸出HIGH和LOW,控制LED的亮和滅。現在我們更進一步,要控制LED階段性的明暗變化。而要得到這個效果,我們必須找一個擁有類比輸入(Analog Input)的裝置,最常見的就是「可變電阻」。然後再用類比輸出(Analog Output)的方式,得到LED明暗的效果。
可變電阻,也有人稱可調電阻,英文叫Potentiometer,簡稱Pot,也有人叫它Variable resistance,都OK啦!基本上,它就是電阻,但可以調整電阻值,最常見在Arduino套件中的型號是B10K,最高電阻值為10K歐姆。
雖然名叫電阻,但其實在許多電器的設計上都被用來當作使用介面的旋鈕,大家一定都用過的,像是音量、溫度等等,只是上面加了漂亮的蓋子,外觀上看不出來而已。
以B10K的型號為例,它有3支腳,如上圖所示,A和C兩支腳是可以互換的,如果直接量這兩個腳的電阻值,就是10K。
如果接了AB或BC兩腳,就可以依旋鈕的角度,出現不同的電阻值。AC兩腳雖然可以互換,但交換後後到的數值變化是剛好相反的哦。
我們先來試接一顆LED,用一塊Arduino Uno來供電,透過可變電阻,讓LED燈產生明暗的變化。為了避免旋得太過頭,電阻值太低,造成LED燒掉,所以傑森這邊多加了一根220歐姆的電阻。
這個例子很簡單,透過可變電阻,我們可以把電阻值從0歐姆到10K之間做切換,所以就可以看到LED的燈光亮度產生了變化。
再來我們試一個複雜一點的例子,我們不再單純把可變電阻當電阻用,而是當作一個調節器,我們經由它讀到調整出來的度數,去進起我們想做的調整。這類應該生活中很常見,如溫度調整、音量調整等。
我們依然是調整LED的亮度,但這次改變一下接線方式,可變電阻只是把值經由B腳位傳給Uno,然後我們判讀後,再進行利用。
因為要控制LED的亮度,這裡用到了PWM(Pulse Width Modulation),未來我們會開一個專章做說明。現在簡單的說,就是透過一個PIN腳,輸出類比值0~255。之前我們用過數位輸出,是用digitalWrite()函式,要輸出有PWM的數值,就必須改用類比輸出函式analogWrite()。
但請注意,以Uno為例,並不是每一個PIN腳都有PWM的功能,有PWM的PIN腳數字前面上印上「~」的符號,像是「~3」,而這些PIN腳以Uno來說,就是3、5、6、9、10和11。這個例子我們用PIN 5。
程式碼如下:
int sensorPin = A5; //類比輸入的PIN腳
int ledPin = 5; // 類比輸出的PIN腳,接到LED的正極
int sensorValue = 0; // 類比輸入得到的數值
void setup() {
pinMode(ledPin, OUTPUT); //LED的PIN腳設為輸出
}
void loop() {
sensorValue = analogRead(sensorPin); //讀取類比輸入的值會得到0~1023
sensorValue = map(sensorValue,0,1023,0,255); //將0~1023轉化成0~255
analogWrite(ledPin,sensorValue); //將結果用PWM的方式輸出給LED,改變亮度
}
類比輸出是analogWrite(),那麼類比輸入就是analogRead(),不過請注意,以Uno板為例,類比輸入的PIN腳只有A0~A5,這6個PIN腳,其它的PIN腳可不行哦!
sensorValue = analogRead(sensorPin);
上面這行就是把可變電阻調整出來的值,讀進來,會是0~1023。
sensorValue = map(sensorValue,0,1023,0,255);
map()這個函式非常有用,它可以把一個連續範圍的值,轉換成另一個連續範圍所對映的值。以這次為例,就是把0~1023的值轉化成0~255。
analogWrite(ledPin,sensorValue);
最後就是把計算出來的值,類比輸出給LED,這樣就能得到LED的明暗變化了!