步驟1:Arduino Uno簡介
開發(fā)板概述
1。微控制器
該板的大腦是28針微控制器ATMega328。它放置在28針DIP插座中,因此可以輕松更換。微控制器的大腦是中央處理器-CPU,它控制微控制器內(nèi)部的所有內(nèi)容。它獲取存儲在閃存中的程序指令并執(zhí)行它們。這可能涉及從工作存儲器(RAM)中獲取數(shù)據(jù),對其進行處理,然后再放回去,例如,這可能意味著將數(shù)字輸出之一從0V更改為5V。
2。電源
板可以通過USB連接器或外部電源插座供電。電源調(diào)節(jié)器將電源插座提供的7V至12V之間的任何電壓調(diào)節(jié)為微控制器所需的5V恒定電壓。
3。電源插針
電源插針由8個母頭插針組成。首先是NC-未連接任何東西。第二個是IOREF,它用于屏蔽以確定Arduino板工作的電壓水平(3.3V或5V,對于Arduino Uno是5V)。第三個是RESET引腳,當(dāng)我們將其連接到0V時,微控制器中的程序?qū)?fù)位,這意味著它將從頭開始重新啟動。第四個引腳為3.3V電源引腳,第五個引腳為5V電源引腳。第六和第七引腳為GND-GrouND = 0V。第八個引腳是Vin,該引腳可用于穩(wěn)壓外部電源,對于Arduino Uno,您可以將此引腳連接到5V來為開發(fā)板供電。
4。模擬輸入引腳
模擬輸入引腳由標(biāo)記為A0-A5的6個母頭引腳組成。這些引腳可用于測量與其相連的電壓電平。例如,濕度傳感器輸出,距離傳感器輸出或溫度傳感器輸出等。
5。數(shù)字輸入/輸出引腳
數(shù)字輸入/輸出(I/O)引腳由18個母頭引腳組成,分為兩部分。其中的前14個標(biāo)記為0-13的是數(shù)字I/O引腳,名稱中帶有波浪號(?)的可以設(shè)置為PWM輸出(稍后將詳細介紹PWM)。第十五針為GND。第十六個引腳是Aref引腳,即模擬參考引腳,用作模數(shù)轉(zhuǎn)換(ADC,后面會詳細介紹)的參考電壓電平。該引腳連接到Arduino Uno的5V。第十七和第十八引腳是SDA和SCL引腳,這些引腳用于“兩線制”串行接口(在此Instructable中,我們將不介紹TWI)。數(shù)字I/O引腳0和1也被標(biāo)記為Rx和Tx(接收和發(fā)送),可用于串行通信(串行或UART接口,稍后會有更多介紹)。請勿將這些引腳用作數(shù)字I/O引腳,因為在對微控制器進行編程時會使用它們。
將一個橙色LED連接到數(shù)字I/O引腳13。當(dāng)將板連接到電源時,一個綠色LED點亮,而在斷開電源時,一個綠色LED熄滅。兩個橙色LED連接到串行通信線路(Rx和Tx),并在使用串行通信時閃爍(通常在對微控制器進行編程時)。
7。板載編程電路
Arduino Uno板載板上還有另一個微控制器,它是Atmega 16U2。該輔助微控制器是USB到串行電路的一部分,用于對主微控制器進行編程。 Atmega16U2充當(dāng)橋接器,用于轉(zhuǎn)換來自微控制器的串行接口(UART接口)的信號和USB總線的信號。由于兩個微控制器都具有此程序和預(yù)編程的引導(dǎo)程序,因此我們能夠?qū)rduino Uno板與計算機連接并對其進行編程。
8。將Arduino開發(fā)板與計算機連接
要將Arduino Uno連接到計算機,您需要USB A至B電纜。當(dāng)您從AZ-Delivery購買任何Arduino Uno開發(fā)板時,我們會在開發(fā)板上附帶電纜。但請注意,某些主板出廠時沒有電纜。因此,在購買電子產(chǎn)品時請格外注意。
步驟2:下載和安裝Arduino IDE
IDE表示集成開發(fā)環(huán)境,這是一個類似文字處理器的應(yīng)用程序,我們在其中編寫微控制器的指令集(程序)。此應(yīng)用程序?qū)⑽覀兊拇a轉(zhuǎn)換為微控制器可以理解的機器語言,然后將其上傳到微控制器。
要下載Arduino IDE,請訪問Arduino官方網(wǎng)站,并在軟件選項卡下,單擊下載。 Arduino Web編輯器有一個選項。您可以僅使用瀏覽器和Arduino Web編輯器對Arduino開發(fā)板進行編程。在這里更多。還可以選擇下載應(yīng)用程序并將其安裝在本地計算機上,在下載頁面上找到您的操作系統(tǒng)并為您的操作系統(tǒng)下載文件。
對于Windows,我們建議您使用Windows 10,因為它自行安裝驅(qū)動程序,因此您不必為此煩惱。我們還建議您是否使用Windows下載非管理員安裝的zip文件-這樣安裝起來會容易得多。下載zip文件時,將其解壓縮并轉(zhuǎn)到解壓縮的文件夾并打開arduino應(yīng)用程序。就這樣,您就可以繼續(xù)下一步了。
但是,如果您使用的是Windows的較早版本,請轉(zhuǎn)到此鏈接。了解如何安裝驅(qū)動程序。
對于linux,請選擇您的計算機體系結(jié)構(gòu)并下載適當(dāng)?shù)奈募=鈮嚎s它,然后進入解壓縮的目錄,然后打開終端并輸入。/arduino。這是打開Arduino IDE的方式,您準(zhǔn)備好進行下一步。
對于Mac OS X,您必須按照此指南安裝Arduino軟件。
第3步:第一個程序-心跳
將您剛購買的Arduino Uno連接到計算機。您會看到綠色的LED亮著,橙色的LED(連接到數(shù)字插針13)閃爍。如果您之前使用過Arduino Uno,橙色LED可能不會閃爍(取決于您所使用的應(yīng)用程序)。現(xiàn)在我們準(zhǔn)備繼續(xù)。
當(dāng)您打開Arduino IDE時,為了正確設(shè)置IDE,請轉(zhuǎn)到:工具》端口》……,然后選擇帶有Arduino Uno名稱的端口。
對于Windows,它應(yīng)該類似于“ COM4(Arduino/Genuino Uno)”。
對于Linux,它類似于“/dev/ttyACM0(Arduino/Genuino Uno)”。
,對于操作系統(tǒng)“/dev/cu.usbmodem1461(Arduino/Genuino Uno)”。
然后轉(zhuǎn)到工具》板》 Arduino/Genuino Uno,然后選擇您的板名稱。
在繼續(xù)之前,我們先解釋幾件事。首先,每個程序示例,甚至您編寫的程序都稱為草圖。在Arduino IDE中,我們將向您展示的幾乎所有內(nèi)容都有大量的草圖。因此,當(dāng)您想做某事而又不知道如何做時,應(yīng)該遍歷整個草圖列表,您可能會找到帶有程序示例的草圖。并且每個草圖都被很好地注釋,以便對每個動作進行解釋。
現(xiàn)在,讓我們將第一個草圖和第一個程序示例上傳到Arduino Uno板上。轉(zhuǎn)到:文件》示例》 01.基本》閃爍。帶有閃爍草圖的新IDE將打開。在此草圖中,我們使用一個LED并將其打開和關(guān)閉。因為這是一種檢查一切是否正常的方法,所以此草圖通常稱為“ Hello world”示例。當(dāng)您將此草圖上傳到板上時,您的Arduino會說:“我還活著,你好,世界!” :-)。草圖中有很多注釋,請閱讀它們,通常它們會解釋所有內(nèi)容;-)。
但是我們將對其進行一些更改,因為僅打開/關(guān)閉LED燈很無聊。讓我們模擬一個心跳。為了簡單起見,我們刪除了所有評論。更改像這樣的循環(huán)函數(shù),其余部分保持不變:
void loop() {
digitalWrite(LED_BUILTIN, LOW);
delay(1100);
digitalWrite(LED_BUILTIN, HIGH);
delay(150);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
digitalWrite(LED_BUILTIN, HIGH);
delay(150);
}
現(xiàn)在,轉(zhuǎn)到:“草圖”》“上傳”,或按“ Upload =》”圖標(biāo)上傳。
如果一切順利,您應(yīng)該會看到板載橙色LED以心跳的方式閃爍。
如果您使用的是Linux,并且遇到“打開串口錯誤。..”之類的錯誤,則應(yīng)閱讀此書。
現(xiàn)在,讓我們來解釋一下草圖。在幾乎每個草圖中,都有兩個函數(shù):setup()和loop()函數(shù):
setup()函數(shù)在程序執(zhí)行開始時僅運行一次,當(dāng)您為電路板加電時,或重置板時。在此函數(shù)中,我們設(shè)置所有初始化,例如,聲明我們使用的數(shù)字輸入/輸出引腳的狀態(tài)。在此草圖中,我們聲明數(shù)字I/O引腳13(LED_BUILTIN)為數(shù)字輸出引腳。在這里,我們還初始化了所需的所有內(nèi)容,例如設(shè)置模擬輸入引腳或用于串行通信的串行接口等(稍后對此進行詳細介紹)。
loop()函數(shù)在setup()之后運行,并且無限期地反復(fù)運行,即所謂的“無限”循環(huán)函數(shù)。實際上,在電路板連接到電源時,它始終運行。這是因為電子設(shè)備中的程序永遠都不會到達末尾,因為如果發(fā)生這種情況,則意味著您的設(shè)備與關(guān)閉設(shè)備一樣好。在此草圖中,我們將數(shù)字引腳13設(shè)置為ond,然后將數(shù)字引腳13設(shè)置為低值(0V或GND; LED熄滅),然后延遲該時間或等待1100毫秒(大于一秒),然后將數(shù)字引腳13設(shè)置為到高值(5V; LED亮),并等待150毫秒。關(guān)閉超過100毫秒,然后再次開啟150毫秒。
步驟4:LED褪色
在此草圖中,我們將使用帶有330歐姆電阻的外部綠色LED。加載草圖:“文件”》“示例”》“ 01.Basics”》“淡出”。
在繼續(xù)之前,如果尚未在Arduino IDE中打開行號,則應(yīng)打開行號。轉(zhuǎn)到:文件》首選項。一個新的首選項窗口將打開。選中“顯示行號”框,然后單擊“確定”。
現(xiàn)在我們可以繼續(xù)。在第16、17和18行上,定義了三個變量。首先是“ led”,在其中存儲連接到LED的數(shù)字I/O引腳的數(shù)量。在此草圖中為9。其他兩個變量用于更改LED的亮度,第一個是亮度級別,第二個是代表兩個亮度級別之間增加/減少步長的數(shù)字。
在setup()函數(shù)中,我們聲明要輸出的數(shù)字I/O引腳9的狀態(tài)。沒什么新鮮的,不是嗎。
但是在loop()函數(shù)中,我們鮮有新事物。首先是analogWrite()函數(shù),該函數(shù)定義數(shù)字I/O引腳的PWM“電壓電平”(有關(guān)PWM和analogWrite()的更多信息)。在這種情況下,這就是LED亮度(LOB)的級別。然后剩下的loop()函數(shù)就是改變亮度的算法。這應(yīng)該是不言自明的。如果沒有,讓我們快速進行一下。在第32行上,我們向當(dāng)前LOB添加一個階躍值,然后詢問LOB是否小于或等于0(LOB不能為負值,因為您知道PHYSICS),并且大于255。為什么是255?因為PWM輸出的分辨率為256,所以從0到255的值。這在analogWrite()函數(shù)中使用,因此電壓電平以0到0的255到5V的255的形式表示(稍后將對此進行詳細介紹)。如果不滿足此條件,則程序?qū)⒗^續(xù)執(zhí)行下一條指令,即delay(30)。因為它太快了,所以delay()只是減慢了這個過程。如果沒有這行代碼,您將看不到LED衰落的效果。..但是,如果滿足條件,則我們將LOB步號更改為負,以便LOB開始下降。下次滿足此條件時,負LOB步長將變?yōu)闊o窮大,依此類推,無限大。如果您希望進一步減慢處理速度,只需將delay(30)中的30更改為其他更高的值。
在此示例中,我們使用LED和電阻,因此讓我們解釋一下電阻和LED是什么。
第一個電阻器,它有兩個支路,用于連接到電子電網(wǎng)中,并且用于限制電子電網(wǎng)中那部分的電流(電阻器的方向無關(guān)緊要,它將以兩種方式起作用)。我們使用四分之一瓦的電阻。這是電阻的功率,這意味著當(dāng)電流流過電阻時,電阻會發(fā)熱。該電流越大,電阻將變得越熱。電阻通過其電阻值和以瓦特(W)為單位給出的功率來評級,這些功率可以主要根據(jù)其大小來安全地耗散。它的表面積越大(電阻越大),它可以安全地散發(fā)到周圍空氣或散熱器中的功率就越大。
您可以考慮一下,就像使用水軟管澆灌植物,用手擠壓軟管,限制軟管中的水流。在此示例中,您的手是電阻,水流是電流,水量是電壓。
現(xiàn)在,二極管,它有兩個腿,可以連接到電子電網(wǎng),陽極和陰極。二極管是電子部件,它使電流僅從陽極到陰極的一個方向流動。如果將其反向,將不會有電流通過,但如果超過電流和電壓限制,則可能會損壞二極管。
LED-發(fā)光二極管是一種特殊的二極管,當(dāng)電流流過該二極管時會發(fā)出彩色光(LED的較長腳為陽極,而另一腳為陰極)。當(dāng)我們超過電流和電壓限制時,無論連接的方向如何,二極管也可能被破壞,因此請小心閱讀數(shù)據(jù)表。這就是為什么我們在LED上使用電阻器,以便我們限制電流并防止LED損壞的原因。
現(xiàn)在,連接圖上的所有內(nèi)容并將草圖上傳到Arduino板上,看看LED褪色的魔力。/p》
第5步:按鈕和LED指示燈
現(xiàn)在,讓我們通過按下按鈕或開關(guān)打開/關(guān)閉LED。什么是按鈕,什么是開關(guān)?嗯,它們都是電子部件,具有兩種狀態(tài),分別處于打開和關(guān)閉狀態(tài),并且都用于打開/關(guān)閉電子網(wǎng)格的某些部分。但是不同之處在于,當(dāng)您更改開關(guān)的狀態(tài)時,它將保持該狀態(tài),但是當(dāng)您更改按鈕的狀態(tài)時,僅在將其保持在該狀態(tài)時,它才會保持在該狀態(tài)。當(dāng)您停止按按鈕時,它將返回其默認狀態(tài),在大多數(shù)情況下為關(guān)閉狀態(tài)。有些開關(guān)具有兩個以上的狀態(tài),但是我們不會在Instructable中使用它們。
在此步驟中,我們將使用無焊面包板。面包板是用于制作電子原型的電子部件。有了它,我們無需硬連接即可輕松連接其他電子部件,而無需斷開它們,而無需焊接。面包板引腳。
與Arduino Uno,面包板,按鈕,10k歐姆電阻,LED和330歐姆電阻建立連接,如圖所示。
您可以看到,我們有兩個原理圖該圖,它們分別起作用。您可以使用任何這些原理圖來打開/關(guān)閉LED,因為它們執(zhí)行的功能相同,但方式不同。 Arduino Uno用作穩(wěn)定電源。左圖為上拉電阻,右圖為上拉電阻。通過查看10k ohm電阻器以及連接在哪個導(dǎo)軌上,您可以看到哪個是哪個電阻器(圖中兩個較低的電阻器)。上拉表示將電阻連接到地,上拉表示將電阻連接到5V電源。 LED附近的330歐姆電阻用作LED保護。當(dāng)我們按下一個按鈕時,它將打開相應(yīng)的LED。當(dāng)我們停止按下按鈕時,它將關(guān)閉相應(yīng)的LED。
您可能想知道,為什么所有這些?很簡單,如果您使用數(shù)字I/O引腳作為輸入,則必須始終將數(shù)字I/O引腳連接到GND(下拉電阻)或電源(上拉電阻)。您永遠不能,永遠不要將其斷開,因為您會得到亂碼。為什么?這是因為,數(shù)字輸入引腳將從周圍環(huán)境中讀取電壓,例如來自周圍引腳的電壓水平或來自引腳周圍灰塵的靜電電壓水平等。當(dāng)您讀取未連接的引腳時,將會得到不穩(wěn)定的值。在下一步中介紹串行通信時,我們將向您顯示這些讀數(shù)。
我們現(xiàn)在將讀取數(shù)字I/O引腳2上的按鈕的輸入。連接所有內(nèi)容,如圖所示。
轉(zhuǎn)到草圖:“文件”》“示例”》“ 02.Digital”》“按鈕” ,并將其上傳到Arduino Uno。按按鈕!板載橙色指示燈將點亮。涼!再次,閱讀評論。此草圖是不言自明的,我們不需要遍歷。
步驟6:串行通信
現(xiàn)在終于有了一些有趣的東西。通過串行通信,您可以與Arduino Uno開發(fā)板進行通信。多么酷啊? :)
什么是串行通信?這是微控制器可以相互通信的一種方式。簡而言之,一個微控制器輸出(發(fā)送,傳輸)信號,在連接兩個微控制器的電線上產(chǎn)生高低壓脈沖。另一個單片機處于輸入模式,監(jiān)聽電壓脈沖,并像接收器一樣工作。因此,這里有一個串行協(xié)議,即將數(shù)據(jù)編碼為電壓脈沖并將電壓脈沖解碼回數(shù)據(jù)的規(guī)則。最常見的串行模式是通用異步接收和發(fā)送或UART串行。
要發(fā)送一個字節(jié)的數(shù)據(jù),我們有幾個規(guī)則。
首先,我們必須就電壓脈沖的速度,數(shù)據(jù)的發(fā)送和接收速度達成一致。該速度稱為波特率,以每秒比特數(shù)表示。其值可以是:2400、4800、9600、14400、19200等。它可以高達250000。最常見的是9600。
第二個數(shù)據(jù)的每個字節(jié)必須具有起始和停止位,以便UART可以區(qū)分數(shù)據(jù)字節(jié)的開始和結(jié)束位置。
第三,我們可以調(diào)整數(shù)據(jù)字節(jié)的長度。 (我們不會對此進行詳細介紹)默認值為8位,但也可以為9位或10位。
第四,在數(shù)據(jù)字節(jié)的和的停止位之前有奇偶校驗位。該位是可選的,您不必使用它。用于檢查數(shù)據(jù)字節(jié)中是否有錯誤。 (我們不會對此進行詳細介紹)。
與Arduino設(shè)置串行通信非常容易,只需幾行代碼。讓我們通過計算機通過串行通訊發(fā)送的命令打開板載LED。為此,您只需要將Arduino Uno板連接到計算機即可。
在Arduino IDE中,有一個用于監(jiān)視串行接口的簡潔工具,您可以稱之為串行監(jiān)視器。要啟動它,請轉(zhuǎn)到:工具》串行監(jiān)視器。
將此小圖寫或復(fù)制/粘貼到IDE中,然后將其上傳到您的Arduino Uno中。
void setup() {
// setting digital I/O pin 13 as output
pinMode(LED_BUILTIN, OUTPUT);
// setting up serial communication - 9600 is baud (communication) rate, 9600 bits per second
Serial.begin(9600);
}
void loop() {
// check if there is serial message on serial line
// Serial.available() returns the number of bytes that are in serial buffer
if (Serial.available() 》 0) {
// if it is, read it and store into letter variable
char letter = Serial.read();
if(letter == ‘1’) {
digitalWrite(LED_BUILTIN, HIGH);
// write back on serial line
Serial.println(“LED turned on”);
}
else if(letter = ‘0’) {
digitalWrite(LED_BUILTIN, LOW);
Serial.println(“LED turned off”);
}
}
}
現(xiàn)在,我們將解釋此小圖。首先,Serial.begin()函數(shù)。它用于設(shè)置Arduino Uno的串行接口。為此,我們在括號中輸入波特率,在本草圖中為9600。
現(xiàn)在,您必須設(shè)置偵聽器進行通信。 Serial.available()函數(shù)偵聽串行通信線路上的消息,并且當(dāng)消息緩沖區(qū)中充滿數(shù)據(jù)(即使只有一個字符)時,Serial.available()也會返回消息緩沖區(qū)中的字節(jié)數(shù)。我們等待該消息,然后將該消息放入消息緩沖區(qū)中,進行讀取,然后檢查其特定值。當(dāng)消息為“ 1”時,它將打開一個指示燈,并將消息寫回到串行線“ LED亮”。要寫入串行線,我們使用Serial.println()函數(shù)。您只需用引號將要打印的文本寫上并放在Serial.println()的括號中。
將此草圖上傳到Arduino Uno開發(fā)板時,啟動Serial Monitor工具。寫“ 1”并發(fā)送。而且,現(xiàn)在您正在與Arduino Uno通信:)
現(xiàn)在,讓我們使用上一個示例中的按鈕。讓我們讀取數(shù)字輸入引腳的狀態(tài),然后將其發(fā)送到串行通信,首先斷開連接,然后使用按鈕和Pull Down或Pull Up電阻。為此,我們將使用Arduino Uno,一個按鈕和一個10k歐姆的電阻。任何東西,然后啟動“串行監(jiān)視器”,這就是我們所寫的那個亂碼。這就是為什么當(dāng)我們讀取輸入引腳狀態(tài)時使用上拉或下拉電阻器的原因。
現(xiàn)在,進行連接,以便您可以使用上拉和下拉電阻器和按鈕來創(chuàng)建原理圖,如圖所示。
您可以執(zhí)行兩次此操作,一次是上拉,一次是上拉,以獲取我們得到的結(jié)果。如果您不希望這樣做,則不需要同時制作這兩者。
但是我們將使這項工作生效。我們需要稍微更改一下DigitalReadSerial草圖,以便我們可以同時使用兩個按鈕。將此代碼復(fù)制到IDE中:
int pullUp = 2; // button on digital I/O pin 2 - Pull Down
int pullDown = 3; // button on digital I/O pin 3 - Pull Up
void setup() {
Serial.begin(9600);
pinMode(pullUp, INPUT);
pinMode(pullDown, INPUT);
}
void loop() {
// read buttons states
int buttonUpState = digitalRead(pullUp);
int buttonDownState = digitalRead(pullDown);
// make a message that will be sent to the serial line
String message = “Pull Up: ” + String(buttonUpState);
message = message + “。 Pull Down: ” + String(buttonDownState);
// send the message
Serial.println(message);
delay(1); // delay in between reads for stability
}
在這里,沒有什么新內(nèi)容了,除了該行String message =“ Pull Up:” 。..在這里,我們正在創(chuàng)建將發(fā)送到串行的消息一口氣排隊。首先,我們創(chuàng)建一個名為message的字符串變量,然后向其中添加文本。 String()函數(shù)將整數(shù)值轉(zhuǎn)換為字符串,以便可以將其串聯(lián)為消息字符串。
將此草圖上傳到Arduino Uno,然后啟動串行監(jiān)視器。輸出應(yīng)為:
上拉:1.拉下:0
您看到區(qū)別了嗎?當(dāng)您使用上拉電阻(PUR)讀取未按下的按鈕時,它將讀取數(shù)字1,而對于下拉電阻(PDR),它將讀取數(shù)字0。當(dāng)您按下連接到PUR的按鈕時,串行監(jiān)視器中的輸出將變?yōu)閿?shù)字零。當(dāng)您按下連接到PDR的按鈕時,輸出將變?yōu)閿?shù)字1。當(dāng)兩個按鈕都按下時,輸出應(yīng)如下所示:
上拉:0。下拉:1
步驟7:按鈕彈跳
從上一步中可以看到,當(dāng)您按下一個按鈕時,它將被讀為一系列(對于帶有下拉電阻的按鈕)。無論您按多快然后釋放它,讀取的值仍將是一系列的值,但永遠不會是單個值(0000000 1111111 00000000)。有時,在按下按鈕時此零變?yōu)?之前會有一些值更改(00000 1 0 1 00 11 0 11111111111111 )。或者您可能是一個按鈕的上帝,并且您能夠做到,每個按鈕一個按鈕按xD。 (小笑話)
這稱為反彈效果,解決方案是反跳算法。按鈕彈跳是電子學(xué)中的嚴重問題,并且有numeros硬件和軟件解決方案,但是對于Arduino IDE中的大多數(shù)草圖,最簡單的解決方案是軟件彈跳算法。向下電阻連接到數(shù)字I/O引腳2。
將此代碼復(fù)制到IDE:
// digital pin 2 has a pushbutton attached to it.
int button = 2;
// variable for counting button presses
int count_presses = 0;
// two helper variables, for detecting one physical press
int ones_count = 0;
int real_press = 0;
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// make the button‘s pin an input:
pinMode(button, INPUT);
// to print first value of count_presses which is 0
Serial.println(count_presses);
}
void loop() {
// read the button input pin:
int button_state = digitalRead(button);
// check state of a button, check for digital ones when button is pressed, and count them
if (button_state) {
ones_count++;
}
else {
ones_count = 0;
}
// if number of ones is 10, you pressed button long enough, mark this with real_press
if (ones_count == 10) {
real_press = 1;
}
else {
real_press = 0;
}
// if flag is marked, count that, because it is one actual physical press, and send that number to the serial interface
if (real_press) {
count_presses++;
Serial.println(count_presses);
}
delay(1); // delay in between reads for stability
}
將其上傳到Arduino Uno,然后啟動串行監(jiān)視器。
此代碼所做的全部就是計數(shù)按鈕的按下次數(shù)并將其打印在串行通訊線上。代碼是不言自明的。
步驟8:ADC
ADC代表模數(shù)轉(zhuǎn)換器或轉(zhuǎn)化。為什么我們需要這個?好吧,我們在Arduino Uno中的微控制器是數(shù)字設(shè)備,這意味著它僅適用于數(shù)字信號。如果考慮電壓,電壓數(shù)字信號可以具有兩個電平:數(shù)字零或0V和數(shù)字一或5V。但是,幾乎所有其他功能都可以與模擬信號一起使用,模擬信號可以具有任何電平,電壓范圍在0V至5V之間。您可以在圖像上看到它。
因此,為了使我們的微控制器能夠理解模擬信號,我們需要一個轉(zhuǎn)換器,這就是我們需要ADC的地方。
Aref引腳Arduino Uno用作模擬轉(zhuǎn)換的電壓參考引腳。該參考電壓電平必須盡可能穩(wěn)定,準(zhǔn)確且無噪聲,以便在ADC上獲得準(zhǔn)確的讀數(shù)。我們?yōu)槭裁葱枰@個?好的ADC可以在0V和Aref引腳上的電壓電平之間轉(zhuǎn)換電壓值,在大多數(shù)情況下為5V。但是我們可以根據(jù)應(yīng)用程序更改此值。 Aref = 5V是Arduino Uno的默認設(shè)置,但是使用analogReference()函數(shù)可以更改此設(shè)置。 (我們不會在此Instructable中使用它)
那么ADC實際如何工作? ADC的核心實際上是DAC-數(shù)模轉(zhuǎn)換器和比較器。比較器用于比較兩個值,在這種情況下為兩個模擬信號。最簡單地說,如果一個信號大于另一個信號,比較器將返回數(shù)字一;如果一個信號小于另一個信號,它將返回數(shù)字零。這兩個信號分別是來自模擬輸入引腳的信號和來自DAC的信號。轉(zhuǎn)換開始時,ADC將高數(shù)字值輸入DAC,并將其轉(zhuǎn)換為DAC可以產(chǎn)生的最高模擬電壓(Aref),然后比較器將DAC的該值與模擬輸入引腳的值進行比較。該ADC從比較器讀取值后,確定DAC電壓大于還是小于模擬輸入引腳的電壓。比ADC將DAC值一分為二,并重復(fù)整個比較/讀取過程。重復(fù)此過程,直到ADC將輸入電壓電平定位在DAC可以產(chǎn)生的10位電壓電平中的兩個之間。 ADC的分辨率為10位(對于Arduino Uno主芯片= ATMega328P)。 ADC的分辨率是通過將Aref引腳上的電壓電平除以可能的轉(zhuǎn)換值的總數(shù)10位= 1024來定義的。這意味著ADC可以將0V和Aref之間的許多電壓電平讀取為1024個不同的值。如果參考電壓(Aref)為5V,則ADC可以區(qū)分的最小電壓電平為5/1024 = 0.00488 V = 4.9 mV。
ADC一次只能讀取一個模擬引腳。為了讀取Arduino Uno的6個模擬引腳,讀取過程必須是多路復(fù)用的。這意味著ADC將先讀取一個并存儲其值,然后再讀取另一個,依此類推,直到最后一個第六個模擬輸入引腳。
但是創(chuàng)建Arduino是為了降低將所有ADC寄存器調(diào)整為僅一個函數(shù)AnalogRead()的復(fù)雜性。該函數(shù)返回的數(shù)字是特定模擬輸入引腳上模擬電壓電平的10位表示形式。如果要測量模擬電壓,則必須將該數(shù)字除以1024并從5中減去。然后,我們將在小誤差范圍內(nèi)為模擬輸入引腳提供實際電壓電平的值(對于Aref = 5V,?4.9mV)
所以,理論終于結(jié)束了,讓我們做一些實際的事情。讓我們使用10k歐姆電阻和光電電阻創(chuàng)建一個分壓器。
什么是分壓器?好吧,這個名字說的一切都是由電路來分壓的。我們使用兩個電阻器,將它們串聯(lián)連接,在串聯(lián)連接的兩端,我們連接輸入電壓和GND,輸出在中間部分和GND之間。就像在圖像上一樣。
Т這是一個描述輸入和輸出電壓之間的依存關(guān)系的方程式:
Vout = Vin * R2/(R1 + R2)
如果Vin = 9V,R1 = 10k ohm,R2 = 1k ohm,則我們得到的Vout = 818mV。如果Vin = 9V,但我們用R2代替R1,則我們得到Vout = 8,18V,就像下部的圖像一樣。
您可以使用上面的公式來計算。您將得到相同的結(jié)果。
在下一個示例中,我們將使用Arduino Uno,10k歐姆電阻器,光電電阻器和幾根Jumber電線。像圖中一樣連接所有東西,然后將此草圖上傳到Arduino Uno:文件》示例》 01.Basics》 AnalogReadSerial。啟動串行監(jiān)視器。用光遮蓋光電電阻。看到讀數(shù)的差異。
現(xiàn)在上傳這個小草圖:
double voltageRef = 5.0; // Voltage reference level
double resolution = voltageRef / 1024.0; // smallest value that ADC can read = resolution
double voltageInput = 0; // Input voltage level
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
// equation for converting digital value from ADC into actual voltage level
voltageInput = voltageRef - (resolution * sensorValue);
Serial.println(voltageInput);
delay(10);
}
責(zé)任編輯:wv
-
Arduino
+關(guān)注
關(guān)注
188文章
6471瀏覽量
187308
發(fā)布評論請先 登錄
相關(guān)推薦
評論