前面幾節講的都是數位的處理,也就是只有 0 和 1 兩種訊號,但我們的世界並不是只有 0 和 1 兩種訊號而已,我們還有更複雜的類比訊號。
諸如電壓、聲音、光亮、溫度等等的,都無法單純的由 0 和 1 構成。
那當我們需要處理這些訊號的時候該怎麼辦呢?
這時候就是 ADC (Analog to Digital Convert, ADC) 出場的時候啦!
Arduino 中的 ADC
Arduino 所採用的 AVR 微控制器內建有一組可多通道輸入多 ADC,根據型號的不同,其通道數目與效能也有所不同。
以我們常用的 Arduino UNO 為例,其所採用的 ATmega328p 微控制器內建有一組 6 通道 10 位元解析度的 A/D 轉換器,這 6 個通道的輸入腳位分別為 A0 ~ A5。
基本語法
在 Arduino 中要讀取 ADC 的輸入很簡單,但一樣要先在 setup()
中加入的設定。
1 2 |
pinMode(腳位, INPUT); // Arduino UNO: A0~A5 |
讀值的語法也很簡單,就這樣:
1 2 |
int val = analogRead(腳位); // Arduino UNO: A0~A5 |
事前準備
- 可變電阻 x1
基本讀取
在這個範例中,我們將直接把可變電阻的電壓值透過 Arduino UNO 讀取後直接回傳到電腦上顯示。
硬體接線
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { // 設定 RS232 Serial.begin(9600); // 設定 A0 輸入 pinMode(A0, INPUT); } void loop() { // 讀值 int val = analogRead(A0); // 傳送資料至電腦 Serial.println( val ); } |
LED 亮度控制
透過可變電阻來改變 LED 的亮度。
硬體接線
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int led = 9; // LED 腳位 int analogPin = A0; // 可變電阻腳位 int val = 0; // 讀到的數值 void setup() { // 設定 led 為輸出 pinMode(led, OUTPUT); // 設定 A0 輸入 pinMode(A0, INPUT); } void loop() { // 讀值 val = analogRead(analogPin); // 將 0 ~ 1023 的 ADC 值轉成可被接收的 0 ~ 255 analogWrite(led, val / 4); } |
LED 跑馬燈速度控制
硬體接線
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
int BASE = 10; // 從腳位 10 開始 int NUM = 4; // LED 的總數 int analogPin = A0; int val = 0; // 存放 ADC 數值 void setup() { // 用迴圈設定腳位 for (int i = BASE; i < BASE + NUM; i ++) { pinMode(i, OUTPUT); } // 設定 A0 為輸入 pinMode(analogPin, INPUT); } void loop() { for (int i = BASE; i < BASE + NUM; i ++) { digitalWrite(i, LOW); val = analogRead(analogPin); delay(val); } for (int i = BASE; i < BASE + NUM; i ++) { digitalWrite(i, HIGH); val = analogRead(analogPin); delay(val); } } |
模擬
到這邊,類比輸入的部分就算介紹完了,希望這篇文章的內容對你有所幫助~
請問如何把監控視窗中的ADC數值顯示在LCD上呢? 有程式嗎?
我記得有相關的套件可以使用,挺方便的