前面的章節我們已經學會如果用數位輸出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的燈光亮度產生了變化。

v-resis-5

再來我們試一個複雜一點的例子,我們不再單純把可變電阻當電阻用,而是當作一個調節器,我們經由它讀到調整出來的度數,去進起我們想做的調整。這類應該生活中很常見,如溫度調整、音量調整等。

我們依然是調整LED的亮度,但這次改變一下接線方式,可變電阻只是把值經由B腳位傳給Uno,然後我們判讀後,再進行利用。

v-resis-1

因為要控制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。

v-resis-3

程式碼如下:

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的明暗變化了!

v-resis-4