解讀arduino讀取模擬訊號例項
相信無論是51板還是stm32板,甚至是arm板,最簡單的莫過於數字訊號的輸出或輸入,所以Arduino的數字訊號口的操作這裡我們不打算重複,我們要講講Arduino模擬訊號口的操作。
一、基礎知識
這裡我們首先講模擬訊號的輸入(即讀取),首先我們要普及一下基礎知識,什麼是模擬訊號,什麼是數字訊號,模擬訊號與數字訊號有什麼差別?
當然,我不想教科書式的來闡述,我就分別用一句話來說明:
數字訊號只有高電平和低電平(可以理解為要麼就低電壓要麼就高電壓,就兩種電壓來表示0和1,沒有中間電壓);
模擬訊號曾在連續的電壓,它的變化是連續的,不會總從一個高電壓跳崖式的陡降到低電壓,當然也不會陡然爬升;
他們的區別很明顯:數字訊號只有兩個種電壓,且僅僅在這兩種電壓間變化;模擬訊號是真實的自然電壓訊號,其訊號為連續的電壓變化;
好了,明白這些了,我們就可以來一起看看我們的Arduino板的模擬訊號的讀取了。
我們以Arduino的UNO板為例來說明,如下圖:
紅色線框所指的ANALOG IN的A0到A5共六個口都為模擬訊號輸入口。我們要讀取的模擬訊號一定是來自於這六個口。
二、程式中實現
在程式中,我們用analogRead函式來讀取,這個在程式中非常簡單,我們來看看一個典型的讀取模擬訊號口的程式:
/* Name: Sketch1.ino Created: 12/1/2018 9:42:13 AM Author: Administrator */ // the setup function runs once when you press reset or power the board void setup() { Serial.begin(9600); } // the loop function runs over and over again until power down or reset void loop() { int val=analogRead(A0); Serial.write(val); }
這段程式碼用了analogRead讀取A0口的訊號值,然後通過串列埠輸出,如果我們的硬體部分連線好了,在串列埠監視器中就能夠看到讀取到的模擬訊號的數值了。很簡單,僅僅從程式程式碼的角度來說,和數字口比較可以說更為簡單。畢竟數字口我們還需要用pinMode設定數字口的模式然後再讀取。
三、硬體準備和認知
我們很多的感測器都是接在模擬口的,因為感測器得到的訊號來自大自然,如果感測器上沒有進行模數轉換(所謂模數轉換那就是將模擬訊號轉換為數字訊號),我們就必須接到模擬訊號口上作為輸入。
比如,我們在網路上常常會買到很多的arduino實驗配件,很多都是不帶模數轉換的原始器件(當然也有部分是帶有模數轉換的,那個就要貴多了),比如變阻器(又稱電位器)、光敏電阻、搖桿(遊戲杆)等等。那麼要讀取他們的值該如何接線呢?
是不是也像數字訊號的介面一樣,一個接GND一個接訊號口,或者一個接VCC一個接訊號口呢?甚至,我們還可以憑想象,模擬口接收到變化的電壓直接給UNO板來進行模數轉換即可,非也!非也!
但凡模擬訊號輸入的器件和模組,一個訊號都需要三根線,有可能發生電壓變化的那根線接在模擬訊號輸入口,其餘兩根接在GND和VCC。這裡列出幾種器件的接法:
上面就是光敏電阻和電位器的接線,很顯然,他們都是三根接線。
線面,我們來結合光敏電阻的訊號讀取,在Processing中繪製一個刻度圖,看看效果:
Processing的程式碼如下:
Serial sp;
int val;
void setup()
{
size(600,400);
background(255);
sp=new Serial(this,"COM3",9600);
}
void draw()
{
while(sp.available()>0)
{
val=sp.read();
println(val);
background(255);
fill(0,180,0);
//translate(0,400);
rect(40,380-val*2,530,val*2);
line(38,20,38,380);
for(int i=2;i<20;i++)
{
line(38,i*20,48,i*20);
fill(0, 102, 153);
text(20-i, 50, i*20);
}
}
}
隨著我們的光照的變化,綠色矩形的高度就會發生變化,執行效果如下:
當然,這裡的Processing的程式也可以用於電位器的實驗和搖桿左邊變化的圖形顯示。