日期: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);
}
以下是程式中用到的函式
- analogRead(pin) 讀取指定編號接腳的類比輸入值
- analogWrite(pin, value) 將數值value寫入指定編號接腳作為類比輸出
- map(value, fromLow, fromHigh, toLow, toHigh) fromLow 對應到 toLow,fromHigh 對應到 toHigh,找出兩組數據對應的關係後將輸入值value換算成對應的值。
電路圖
實際的裝置照片
利用可變電阻控制LED的閃爍頻率
接法與上個實驗相同,請同學想想看如何利用讀取到的數值以及函數 delay 控制 LED 的閃爍頻率。我們會用到的函式為
- digitalRead(pin) 讀取指定編號接腳的數位輸入值,數值只有 HIGH 或 LOW
- digitalWrite(pin, value) 將數值value寫入指定編號接腳作為數位輸出,數值 HIGH 或 LOW
- delay(value) 延遲時間,量值為 value ,單位為毫秒(ms)。
/* 實驗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
沒有留言:
張貼留言