2013年4月4日 星期四

Arduino : 類比輸入來控制LED 閃爍的頻率


Arduino的優勢在於對數位信號的識別和處理,但我們的真實世界並不是數位(digital)的,簡單到只要用01就能夠表示所有的現象。

例如溫度的變化,它只能在一個範圍之內連續變化,而不可能發生像從01這樣的瞬時跳變,類似這樣的物理量被人們稱為是類比(analog)的。

Arduino是無法理解這些類比量,它們必須在經過類比轉換後變成數位量後(A/D converted),才能被Arduino進一步處理。

像溫度這樣的數據必須先被轉換成微處理器能夠處理的數位形式(比如電壓),才能被Arduino處理,這一任務通常由各類感測器(sensor)來完成的。

例如,電路中的溫度感測器能夠將溫度值轉換成0V5V間的某個電壓,比如 0.3V 、 3.27V 4.99V等。由於感器輸出的是類比信號,它不會像數位信號那樣只有簡單的Hi 和 Lo,而有可能是在這兩者之間的任何一個數值。至於到底有多少可能的值則取決於類比轉換(ADC)的精度,精度越高能夠得到的值就會越多。

Arduino所採用的ATmega8微處理器一其有6個模數轉換器(ADCAnalog to Digital Converter),每一個模數轉換器的精度都是10bit,也就是說能夠讀取10242^10 = 1024)個狀態。

Arduino的每一個類比輸入接腳上,電壓的變化範疇是從0V5V,因此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

當電位計旋轉到中間的某個位置時,輸入到模擬輸入管腳上的電壓是0V5V之間的某個值,而用analogRead()函數讀出的則是位於01023之間的某個對應值。

讀出的類比輸入量在我們的實驗中被用來確定LED點亮和熄滅的時間,以反映類比量的變化。



沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...