Arduino的優勢在於對數位信號的識別和處理,但我們的真實世界並不是數位(digital)的,簡單到只要用0和1就能夠表示所有的現象。
例如溫度的變化,它只能在一個範圍之內連續變化,而不可能發生像從0到1這樣的瞬時跳變,類似這樣的物理量被人們稱為是類比(analog)的。
Arduino是無法理解這些類比量,它們必須在經過類比轉換後變成數位量後(A/D converted),才能被Arduino進一步處理。
像溫度這樣的數據必須先被轉換成微處理器能夠處理的數位形式(比如電壓),才能被Arduino處理,這一任務通常由各類感測器(sensor)來完成的。
例如,電路中的溫度感測器能夠將溫度值轉換成0V到5V間的某個電壓,比如 0.3V 、 3.27V 、4.99V等。由於感測器輸出的是類比信號,它不會像數位信號那樣只有簡單的Hi 和 Lo,而有可能是在這兩者之間的任何一個數值。至於到底有多少可能的值則取決於類比轉換(ADC)的精度,精度越高能夠得到的值就會越多。
Arduino所採用的ATmega8微處理器一其有6個模數轉換器(ADC,Analog to Digital Converter),每一個模數轉換器的精度都是10bit,也就是說能夠讀取1024(2^10
= 1024)個狀態。
在Arduino的每一個類比輸入接腳上,電壓的變化範疇是從0V到5V,因此Arduino能夠感知到的最小電壓變化是4.8毫伏(5V/1024 = 4.8mV)。
電位計(potentiometer)是一種最簡單的類比輸入設備,它實際上就是一個可變電阻,通過控制滑稈所在的位置我們可以得到不同的電壓值,而輸入信號正是從滑稈所在的位置接入到電路中的。
這一實驗我們將通過改變電位計的值來控制發光二極管閃爍的頻率。電位計上一共有三個接腳,分別連接到Arduino的電源、地和類比輸入的5號接腳上,LED則連接到數位I/O的7到14號接腳上,原理圖如下所示:
int BASE = 2;
int NUM = 8;
int index = 0;
int potPin = 5; //analog input
int val=0;
void setup()
{
for (int i = BASE; i < BASE + NUM; i ++) {
pinMode(i, OUTPUT);
}
}
void loop()
{
val= analogRead(potPin);
for (int i = BASE; i < BASE + NUM; i ++) {
digitalWrite(i, HIGH); }
delay(val);
for (int i = BASE; i < BASE + NUM; i ++) {
digitalWrite(i, LOW); }
delay(val);
}
在Arduino中,對類比輸入埠口不需要用 pinMode()函數 將其指定為輸入或者是輸出模式,這點同數位I/O埠口是有所不同的。
通過旋轉電位計的軸,我們能改變電位計中間那根連線同地之間的電阻量,從而也就能改變從類比輸入的5號管腳上所讀入的模擬量的值。當電位計完全旋轉到頭時,輸入到類比輸入接腳上的電壓為0V,用analogRead()函數讀出的值為0;當電位計完全旋轉到另一頭時,輸入到類比輸入接腳上的電壓為5V,此時用analogRead()函數讀出的值為1023;
當電位計旋轉到中間的某個位置時,輸入到模擬輸入管腳上的電壓是0V到5V之間的某個值,而用analogRead()函數讀出的則是位於0到1023之間的某個對應值。
讀出的類比輸入量在我們的實驗中被用來確定LED點亮和熄滅的時間,以反映類比量的變化。
沒有留言:
張貼留言