【圖形化學習 Arduino】(二)輸入與輸出
Arduinon有一個特點:程序通用性。同一段程序,可以不經過任何修改,運行在不同的 Arduino 板上。這是因為nArduino 對每一塊開發板的引腳(電路板上可以插線的位置)都做了相對應的定義,即使使用的晶元不同,對於使用者來說,引腳號碼也不會發生變化。
例如,Arduino UNO 上的 0 -n13 和 A0 - A5 引腳,在 Arduino LEONARDO 上也能在相同的位置上找到。更高級的開發板上一般會有一些額外的引腳或功能,但對於入門學習而言,可以先不管。
數字信號與模擬信號
在 Arduino 中,電路之間通過電壓來傳遞信息,傳遞的信息可以分為兩大類:數字信號與模擬信號。
數字信號,簡單地理解就是 0 和 1,只有可能是這兩者其中之一,不存在 0.3 或 0.5 的數字信號。在 Arduino 中,用高電壓 5V 代表 1,用低電壓 0V 代表 0。
模擬信號,則可以在 0 到 1 之間取到任意值,可以是 0.5,也可以是 0.14159265…… 在 Arduino 中,模擬信號的電壓可以是 0V - 5V 之間的任意值,一般把模擬輸入分為 1024 份,把模擬輸出分為 256 份。
數字信號的輸出
在 Arduino 中,0 - 13 號引腳是數字引腳,可以用於輸出數字信號或接收數字信號。以 13 號引腳為例,13 號引腳與板載 LED 的連接如下圖所示:
當引腳 13 輸出高電平(1)時,LED 將被點亮;輸出低電平(0)時,LED 將熄滅。以第一課中的程序為例,控制 LED 閃爍,只需要讓引腳 13 周期性輸出高低電平即可。
Arduino 的程序有兩個重要組成部分:初始化和循環,分別是 setup 和 loop 。程序開始時,會執行一次 setup ,然後不斷地運行 loop 函數中的內容。mBlock 中的「forever」積木塊對應 Arduino 的 loop 函數。以上程序對應的 Arduino 代碼是:
#include <Arduino.h>n#include <Wire.h>n#include <Servo.h>n#include <SoftwareSerial.h>nndouble angle_rad = PI / 180.0;ndouble angle_deg = 180.0 / PI;nnvoid setup()n{nn}nnvoid loop()n{n pinMode(13, OUTPUT);n digitalWrite(13, 1);n delay(1000 * 0.5);n pinMode(13, OUTPUT);n digitalWrite(13, 0);n delay(1000 * 0.5);n}n
自動生成的 Arduino 代碼中有些冗餘,但用於學習還是沒有問題的,經過幾次嘗試,應該可以發現幾個函數的功能:
//設置 13 號引腳為輸出模式npinMode(13, OUTPUT);n//令引腳 13 輸出高電平,若第二個參數為 0,則是輸出低電平。第二個參數通常用 HIGH 和 LOW 替代 1 和 0。ndigitalWrite(13, 1);n//等待 500 毫秒,也就是 0.5 秒ndelay(1000 * 0.5);n
數字信號的輸入
接下來看一個數字信號輸入的例子。準備材料:杜邦線 5 條(雙公頭)、Arduino Leonardo 一塊、薄膜鍵盤一張。
用杜邦線把鍵盤和 Leonardo 按照以下的原理圖連接起來。
如下圖。點開大圖可看清接線順序。
編寫程序識別按下的按鍵。當按下按鍵 1 時,讓板載 LED 發亮,否則熄滅。只用到按鍵 1,其他按鍵暫時不用。
對應的代碼為:
#include <Arduino.h>n#include <Wire.h>n#include <Servo.h>n#include <SoftwareSerial.h>nndouble angle_rad = PI / 180.0;ndouble angle_deg = 180.0 / PI;nnvoid setup()n{n pinMode(1, INPUT);n}nnvoid loop()n{n if(digitalRead(1))n {n pinMode(13, OUTPUT);n digitalWrite(13, 0);n }n elsen {n pinMode(13, OUTPUT);n digitalWrite(13, 1);n }n delay(1000 * 0.1);n}n
函數功能介紹:
//設置引腳為輸入模式npinMode(1, INPUT);n//讀取引腳 1 的數字信號,低電平返回 0,高電平返回 1ndigitalRead(1);n
模擬信號的輸出
Arduino 板上標有波浪線的引腳可以輸出模擬信號,常用於控制電機、呼吸燈等器件。控制模擬信號輸出的函數名為 analogWrite,第一個參數是引腳號,第二個參數是模擬電壓(0 - 255,對應 0 V- 5V)。但這個函數執行的動作實際上並不是通過引腳直接輸出一個模擬電壓,而是輸出一個 PWM(脈寬調製)波。
PWM 波,可以理解為是間歇性輸出高電平和低電平,組成一個矩形波,其中高電平所佔的時間比例稱為「占空比」。analogWrite 函數控制的實際上就是占空比。舉個例子:
對應代碼:
#include <Arduino.h>n#include <Wire.h>n#include <Servo.h>n#include <SoftwareSerial.h>nndouble angle_rad = PI / 180.0;ndouble angle_deg = 180.0 / PI;nnvoid setup()n{nn}nnvoid loop()n{n pinMode(5, OUTPUT);n analogWrite(5, 150);n delay(1000 * 0.1);n}n
用示波器測量引腳 5 的波形如下圖:
可以觀察到,PWM 占空比約為 60%(精確值為 58.59%),頻率為 490.2Hz(理想值為 490.196Hz)。此時用電壓表測量,得到引腳 5 輸出的電壓值為 2.95V ≈ 2.93V = 150 / 256 * 5.0V 。
模擬信號的輸入
Arduinon板上有一系列模擬值讀取口,Leonardo 上有 6 個口,為 A0 - A5。結合輸入與輸出,可以製作一個旋鈕變阻器控制 LED 亮度的案例。模擬值讀取使用的函數是 analogRead,參數是管腳號,返回值為 0 - 1023 之間的整數,例如n400 表示的電壓值為 400 / 1024 * 5.0V =n1.95V 。
為了便於理解,這個案例用視頻形式講解,請留意視頻中使用的是 Arduino UNO:
mBlock視頻教程之Arduino可控燈【第一課】—在線播放—優酷網,視頻高清在線觀看 http://v.youku.com/v_show/id_XMTMyMTMzNTk1Mg==.html推薦閱讀:
※【圖形化學習 Arduino】(四)蜂鳴器
※Mixly,初學Arduino的最佳圖形化編程工具
※【圖形化學習 Arduino】(三)串口通信
※【圖形化學習 Arduino】(五)串口調試四神器
※電氣小混混的環境盒子——持續更新
TAG:Arduino |