做者:陳帥華-探索技術藝術與國學之美git
原文連接:www.shuaihuajun.com/article/ard…編程
最近一有時間就研究Arduino開發板,自覺有一些膚淺的入門級的收穫;人(至少我是這樣)對於還不是到達100%熟悉的事物,老是過一段時間就會抹掉關於事物的瑣碎記憶,完整的記憶被腐蝕的模糊不清,以致於不能僅靠殘缺不全的記憶加上自覺得是的猜測認爲這就是記憶自己;若是能讓學習到的知識深刻骨髓那最好了,若是不能奢求這些,那就讓回憶變得容易些吧。
bash
記一次LED流水燈實驗。app
在介紹LED流水燈以前,先來回顧學習到的知識。我對數字信號和模擬信號的理解更深刻了一些,但還沒到成竹在胸的境界,只是有了一點感受,特地總結起來,並搭配一些小插圖,方便快速回憶。函數
之前總據說數字信號就是0和1。但更準確地說,數字信號是電路的通與斷。在Arduino編程中有這樣一些語句(下方代碼段只是語句的羅列,不能直接放到程序中):oop
pinMode(2, OUTPUT);
pinMode(6, OUTPUT);
digitalWrite(2, HIGH);
digitalWrite(6, LOW);
複製代碼
其中,digitalWrite(2, HIGH)
語句的含義就是將Arduino開發板的2號引腳設置爲高電平;digitalWrite(6, LOW)
語句的含義就是將Arduino開發板6號引腳設置爲低電平。輸出高電平的意思就是該引腳能輸出Arduino開發板工做電壓(好比我用的Arduino UNO的工做電壓是5V)。輸出低電平就是該引腳輸出的的電壓爲0V。學習
在Arduino編程中HIGH
是一個常量,也能夠用1
表明;LOW
也是一個常量,也能夠用0
表明。因此,上邊的代碼段能夠這樣寫:ui
pinMode(2, OUTPUT);
pinMode(6, OUTPUT);
digitalWrite(2, 1);
digitalWrite(6, 0);
複製代碼
因此,能夠這樣說。數字信號在Arduino編程中能夠用數字1和0表示,也能夠用HIGH
和LOW
表示。數字信號在電路中可使用電路的通與斷表示。spa
一些參考書中說,HIGH
和LOW
的可讀性更好,可我以爲並不徹底是這樣。使用1
和0
表示,有時候更加簡單直接,反而更便於理解。但不得不認可,HIGH
和LOW
比1
和0
更加語義化。但有些時候,作得太過,拔苗助長。見仁見智,可有可無啦。code
上方代碼中的OUTPUT
(有輸出就會有輸入,INPUT
來也),也可使用1和0表示。因此說1和0並不能表明數字信號,但數字信號在Arduino編程中能用1和0表示。正着說與反着說並不老是成立。用1表明OUTPUT
,用0表明INPUT
。上方代碼就能夠寫成這樣:
pinMode(2, 1);
pinMode(6, 1);
digitalWrite(2, 1);
digitalWrite(6, 0);
複製代碼
作過了幾個Arduino開發實驗。我發現,凡是模式設置爲輸出的引腳,都是用來寫數字信號的;凡是模式設置爲輸入的引腳,都是用來讀取信號的。道理被說明白了,人就會以爲理所固然。
正如上方代碼寫得那樣,2號引腳和6號引腳的模式被設置爲1(輸出模式)。所以,才能使用digitalWrite()
函數向2號引腳和6號引腳寫入數字信號。設爲輸出模式的引腳會產生高/底電壓。而輸出的是一股接着一股的電流,電路的一通一斷就是數字信號在變化的緣故。
設爲輸出模式的引腳產生電壓的變化,設爲輸入模式的引腳感應電壓的變化。
感應電壓變化的引腳用來讀取輸入數字信號。Arduino編程中使用digitalRead()
函數讀取輸入電壓。數字輸入引腳將感應到的電壓以某兩個分界點判斷屬於高電平仍是低電平。參考資料上說,拿個人Arduino UNO開發板爲例,感應到低於1.5V的電壓識別爲低電平,感應到高於3V的電壓就識別爲高電平。digitalRead
函數會返回數字1或者數字0,1和0就表示指定引腳的感應到的是高電平仍是低電平。
我見過的幾乎的影視包裝效果,都擅於使用1010001001這樣的符號形式表達信息化與數字化。但真正的電路中並無1和0,只有電路的通和斷。那只是媒體從業者用一種便於人們直觀理解的可視化呈現手段。
Arduino開發板上有兩組引腳。一組引腳是用來鏈接傳感器,能接收傳感器的模擬輸入信號;另外一組引腳是用來鏈接電路的,能接收(輸入)和發送(輸出)數字信號(上邊講過),還能夠發送(輸出)數字模擬信號,但目前我還沒據說過接收(輸入)數字模擬信號。
這裏先不談傳感器模擬輸入信號,也不談另我還沒據說過的數字模擬輸入信號。這裏就先談談數字模擬輸出信號。
拿個人Arduino UNO開發板爲例。輸出數字信號,因爲計算機不能輸出模擬電壓,高電平就輸出5V,低電平就不輸出電壓(0V)。若是想要產生0-5V之間的電壓,經過控制單位時間內通與斷的佔空比來模擬不一樣的電壓值。在參考資料上這就叫PWM(Pulse Width Modulation)脈衝寬度調製,簡稱脈寬調製。
在引腳上輸出模電電壓,可讓LED時亮時暗,也可讓馬達轉速時快時慢。在Arduino編程中,使用analogWrite()
函數輸出模擬電壓,引腳會產生穩定的方形波。若是1秒內讓Arduino輸出500個數字信號,若是500個全是高電平5V電壓,則爲高電平5V電壓;若是全爲低電平0V電壓,則爲低電平電壓;若是一半高電平,則輸出2.5V電壓;以此類推。
須要準備Arduino UNO開發板一個;麪包板一個;杜邦線7根;220歐姆電阻6枚;LED6支。若是我沒記錯的話,這應該叫作並聯電路:
Arduino編程中用到的結構有for()
循環結構。完整的代碼以下:
void setup() {
Serial.begin(9600);
for(int i=2; i<8; i++){
pinMode(i, 1);
}
}
void loop() {
for(int i=2; i<7; i++){
digitalWrite(i, 1);
delay(100);
digitalWrite(i, 0);
}
for(int i=7; i>2; i--){
digitalWrite(i, 1);
delay(100);
digitalWrite(i, 0);
}
}
複製代碼
delay()
函數是暫停相應毫秒數的意思(這在上一篇中說明過)。上面代碼中用到的pinMode()
函數和digitalWrite()
函數在基礎回顧中介紹過用途。
而後最終的效果是這樣的: