2017年12月4日 星期一

利用可變電阻控制LED

作者:王一哲
日期:2016/9/6



分壓電路



分壓電路是我們在Arduino裡最常用的技巧之一,我們可以利用可變電阻或是光敏電阻與固定電阻串聯,讀取中間接腳的電壓值,並利用這個值來控制其它元件。最簡單的接法如下
分壓電路示意圖


圖中電池和R1、R2電阻串聯,利用歐姆定律可得到電流值 $$ I = \frac{\varepsilon}{R_1 + R_2} $$ 因此R1、R2電阻的端電壓分別為 $$ V_1 = IR_1 = \frac{R_1}{R_1 + R_2} \varepsilon $$ $$ V_2 = IR_2 = \frac{R_2}{R_1 + R_2} \varepsilon $$ 如果我們使用最簡單的可變電阻,將左邊的接腳接到+5V上,右邊的接腳接0V,轉動旋鈕時會改變中間接腳到右邊接腳之間的電阻值,因此電壓值會跟著變化,我們就可以藉此控制其它元件。
單圈碳膜式可變電阻


分壓電路的簡單練習



我們可以用 Arduino 上的 +5 V 接腳供電,將兩個固定電阻串聯,使用三用電表測量電阻的端電壓。為了避免通過電阻器的電流過大,建議使用 10 kΩ 或 100 kΩ 的電阻器。請同學計算一下測量到的電壓值應該是多少?再用三用電表測量看看。
簡單的分壓電路


利用可變電阻控制LED的亮度



我們將可變電阻中間的接腳接到類比輸入(analog in)接腳 A0,讀取數值介於 0 ~ 1023 之間,換算數位接腳5輸出到LED電壓值。接腳的編號前若有 ~ 符號,代表這個可接腳可以作為 PWM 輸入或輸出,數值介於 0 ~ 255 之間。程式碼如下:
/* 實驗2-1: 利用分壓電路調整LED亮度          *
 * 日期: Sep. 5, 2016                         *
 * 作者: 王一哲                               */
int ledPin = 5; //定義LED接腳
int potPin = 0; //定義可變電阻讀取接腳
int val = 0 ; //定義可變電阻讀取數儲暫存用的變數
int voltage = 0; //輸入LED的電壓值

void setup() {
    pinMode(ledPin, OUTPUT); //定義LED接腳為輸出
    pinMode(potPin, INPUT); //定義可變電阻讀取接腳為輸入
    Serial.begin(9600);
}

void loop() { //讀取可變電阻電壓值
    val = analogRead(potPin); //val = 0 ~ 1023
    voltage = map(val, 0, 1023, 0, 255); //將val由0~1023線性變換為0~255並存入voltage
    analogWrite(ledPin, voltage); //點亮LED
    //印出數值檢查執行成果
    Serial.print("val = ");
    Serial.print(val);
    Serial.print(";   voltage = ");
    Serial.println(voltage);
}


以下是程式中用到的函式
  1. analogRead(pin) 讀取指定編號接腳的類比輸入值
  2. analogWrite(pin, value) 將數值value寫入指定編號接腳作為類比輸出
  3. map(value, fromLow, fromHigh, toLow, toHigh) fromLow 對應到 toLow,fromHigh 對應到 toHigh,找出兩組數據對應的關係後將輸入值value換算成對應的值。
電路圖

實際的裝置照片


利用可變電阻控制LED的閃爍頻率



接法與上個實驗相同,請同學想想看如何利用讀取到的數值以及函數 delay 控制 LED 的閃爍頻率。我們會用到的函式為
  1. digitalRead(pin) 讀取指定編號接腳的數位輸入值,數值只有 HIGH 或 LOW
  2. digitalWrite(pin, value) 將數值value寫入指定編號接腳作為數位輸出,數值 HIGH 或 LOW
  3. delay(value) 延遲時間,量值為 value ,單位為毫秒(ms)。
提示:讓LED點亮一小段時間,再讓LED熄滅一小段時間,不斷地重複這個過程。如果最後還是想不通,請參考以下的程式碼:
/* 實驗2-2: 利用分壓電路調整LED閃爍的時間間隔   *
 * 日期: Sep. 5, 2016                             *
 * 作者: 王一哲                                   */
int ledPin = 5; //定義LED接腳
int potPin = 0; //定義可變電阻讀取接腳
int val = 0 ; //定義可變電阻讀取數儲暫存用的變數
int dt = 0; //輸入LED閃爍的時間間隔

void setup() {
    pinMode(ledPin, OUTPUT); //定義LED接腳為輸出
    pinMode(potPin, INPUT); //定義可變電阻讀取接腳為輸入
    Serial.begin(9600);
}

void loop() { //讀取可變電阻電壓值
    val = analogRead(potPin); //val = 0 ~ 1023
    dt = map(val, 0, 1023, 0, 500); //將val由0~1023線性變換為0~255並存入dt
    digitalWrite(ledPin, HIGH);
    delay(dt);
    digitalWrite(ledPin, LOW);
    delay(dt);
    //印出數值檢查執行成果
    Serial.print("val = ");
    Serial.print(val);
    Serial.print(";   dt = ");
    Serial.println(dt);
}



HackMD 版本連結:https://hackmd.io/@yizhewang/SkGyJJv4N

沒有留言:

張貼留言