Arduino範例講解(六)

類比輸入和輸出

Arduino上的一些I / O引腳可用作數位輸入和輸出,以測量電壓(輸入)或調光LED(輸出)。

類比輸入

大多數Arduino具有6到12個類比輸入引腳。它們可以測量的電壓從0v到 5v或3v3 的輸入電壓。在控制板上,這些引腳標記為A0-A5,對於Leonardo,數位端的某些引腳也可以用作類比輸入。 控制板上有標示,背面印有(A6-A11)。

注意讀取類比輸入(相對上)與讀取數位引腳相比較慢。這是因為Arduino測量電壓是使用內部參考變壓器(DAC,數位類比轉換器),然後將輸入電壓與參考電壓進行比較,然後更改參考電壓,再進行比較,更改參考電壓,比較…直到兩個電壓相等。

內部DAC的解析度為10 bits。這意味著它可以讀取的最大數字為10 bits長,或者2 10 = 1024,因此從0(B0000000000)到1023(B1111111111)的數字。1023表示輸入為5v(或3v3),0表示0v。

電位器

電位器,可變電阻器或簡稱為電位器,多數具有三個端子,其中有兩個固定接點與一個滑動接點,可經由滑動而改變滑動端與兩個固定端間電阻值的電子零件,屬於被動元件,使用時可形成不同的分壓比率,改變滑動點的電位。

我們把電位器和推子連接為簡單的分壓器。如果您不熟悉此原理,可以在Wikipedia頁面上閱讀更多內容。

如果看原理圖,可以看到2個電阻。R1是電位器右引腳與滑動接點(中心引腳)之間的電阻,R2是左引腳與滑動接點之間的電阻。還要看一下公式。由於我們的電位器具有固定值(例如50kΩ),因此R1 + R2始終為50kΩ,而R2可以在0Ω和50kΩ之間變化。(如果R2 = 50k,則R1 = 0,反之亦然)因此,該分數始終將得到一個介於0和1之間的數字。將該比率乘以5V(Vsubin / sub),你將獲得一個介於0V和0V之間的電壓。輸出電壓為5V。該電壓可由Arduino的ADC(類比數位轉換器)讀取,並表示電位器(或推子)的位置。因此,基本上,您將左引腳接地,將右引腳連接至Arduino的5V引腳,中心引腳連接到類比輸入。(如下圖)

將電位器(可變電阻器)連接到引腳A0,然後開啟範例AnalogReadSerial(檔案>範例> 01.Basics)。

範例中最主要的地方是AnalogRead(pin)。很明顯地是它提供10-bits值,代表給定引腳上的電壓。
該程式碼通過序列方式將測得結果列印出來,因此打開序列埠監控視窗(CTRL + SHFT + M)或序列繪圖家(CTRL + SHFT + L)並轉動可變電阻。應該會看到0到1023之間的值。在序列繪圖家中,將delay設為10或大一點而不是1ms可能會給你帶來更好的結果。

你可以將0-1023範圍內的值對應到任何其他範圍,例如0到100。可以使用map函數完成此操作。看一看AnalogReadSerialMap範例。

map函數的語法為:map(value,lowerLimitInput,upperLimitInput,lowerLimitOutput,upperLimitOutput) value只是要對應的值,在這種情況下,就是我們的感測器讀數。此輸入的範圍是0到1023,因此這是我們輸入的限制。我們希望輸出範圍是0到100,所以這是我們的輸出限制。這意味著,如果感測器讀取1023,則輸出值為100。
使用sensorValue * 100/1023可以達到相同的結果

要將其轉換為比率,我們必須使用int:float(floating point)以外的data type。如果將感測器值除以1023,我們將得到零與一之間的比率。
我們可以將sensorValue變數的data type更改為float,或者將值從int轉換為float。第一種方法用於AnalogReadSerialRatio-a,後一種方法用於AnalogReadSerialRatio-b。

如果我們不先將值轉換為float,則結果也將被視為一個int值。小數點後的值將被忽略,例如1/2 = 0,但1.0 / 2 = 0.5。正常數字(例如“ 1”)將被視為int,除非您添加小數點(1.0),它才會視為float。如果計算中的因素之一是float,則結果也將是float。

要將int轉換為float,可以使用float(number)函數,也可以使用c ++表示法進行類型轉換(typecasting )(從一種data type轉換為另一種data type)(float)number
要將float轉換為int,可以用相同的方法執行此操作:int(number)(int)number,但是請注意,這只會截斷小數點處的數字,就是只會忽略出現在小數點後的值。例如,int(1.1) = 1,而int(1.9) = 1也是如此,即使int(1.99999)也會給出1。要對數字取,請使用round(number)函數,例如round(1.1)= 1,round(1.5) = 2,round(1.99) = 2。

https://www.arduino.cc/en/Reference/Cast

https://www.arduino.cc/en/Reference/FloatCast

測量電壓

由於1023的類比值對應於5v(對於3.3v的微控制器,則為3.3v),因此您可以使用analogRead(A0)* 5.0 / 1023輕鬆將其轉換為電壓在AnalogReadSerialVoltage範例中可以看到。

要讀取高於5v(3.3v)的電壓,您將需要2個電阻來建一個分壓器。如果我們知道Vsubout / sub,我們可以將上面的公式轉換為Vsubin / sub。(見圖)


將一個電阻(R2)從GND連接到類比輸入,然後將要測量的電壓GND連接到Arduino的GND,然後將另一個要測量的電阻(R1)連接到類比引腳。(見圖)

 

使用上面的公式來計算合適的電阻值。10k到100k之間的任何值都可以正常工作。如果電阻太低,則會吸收太多電流,對讀數產生很大影響。

例如,測量12v時,我使用R1 = 47k和R2 = 22k。我們得到最大電壓15.87v,如果高過這個電壓,就會燒壞Arduino。

注意:如果R2由於某種原因斷開或中斷,那麼高壓將直接(通過R1)連接到Arduino,就會損壞或燒壞它。因此,如果施加高電壓,請勿更改電阻。

範例AnalogReadSerialHighVoltage

在程式前面,有一些常數宣告。像變數一樣,常數可以儲存各種值,但是與變數不同的是,在程式執行時不能更改常數值。意味著它們存在程式暫存空間中,而不是動態記憶體(RAM)中,可以為變數和陣列等留出更多空間。

根據你設定更改這些常數的值。該比率是自動計算的,因此你不必更改它。你可以使用電阻的顏色代碼得到理論值,但如果使用萬用表測量電阻,則會得到更好的接近值。工作電壓也是如此。

類比輸出

Arduino無法輸出類比電壓,只能輸出5v或0v。為了在兩者之間輸出電壓,它使用了一種稱為PWM脈衝寬度調變)的技術。
Arduino建一個方波,然後改變該波的打開和關閉時間。例如,打開2毫秒,關閉2毫秒;或1ms on 3ms off。這稱為方波的工作週期。開啟2ms,關閉2ms,工作週期為50%;1ms on 3ms off是25%的工作週期。(見圖)

現在,您可以計算平均電壓,即曲線下的面積除以循環次數。讓我們看一下工作週期為50%的範例:面積(在一個週期內求值)只是5乘0.5的矩形,所以面積是2.5。除以循環次數仍得出2.5,因此平均電壓為2.5v。
換句話說,平均電壓可以寫成工作週期乘以電源電壓。例如,工作週期為25%將是5v·0.25 = 1.25v。
這些平均電壓在圖像中以紅色表示。

您的眼睛太慢,看不到下面的方波,因此該方法非常適合LED調光。

開啟範例analogPotDimmer。

將LED(+電阻)連接到數字引腳5,將可變電阻連接到類比引腳A0。旋轉可變電阻會使LED變暗。

這裏加入新程式碼是analogWrite(pin,工作週期)。它只是在引腳上設置pwm的工作週期。請注意,工作週期是一個介於0到255之間的值,它對應於0%-100%

另一個範例是analogWriteDimmer。

將按鈕連接到引腳2,將LED連接到引腳5。按住按鈕時,LED變亮;放開按鈕後,再次長按住則亮度會變暗。

https://www.arduino.cc/en/Reference/AnalogWrite

發佈留言