目錄
1. Arduino簡史
Arduino是一家制作開源計(jì)算機(jī)硬件和軟件的公司,同時兼有項(xiàng)目和用戶社區(qū),他負(fù)責(zé)設(shè)計(jì)和制造單板微控制器和微控制器包,用于構(gòu)建數(shù)字設(shè)備和交互式對象,以便在物理和數(shù)字世界中感知和控制對象。該項(xiàng)目的產(chǎn)品是按照GNU寬通用公共許可證(LGPL)或GNU通用公共許可證(GPL)許可的開源硬件和軟件分發(fā)的,Arduino允許任何人制造Arduino板和軟件分發(fā)。 Arduino板可以以預(yù)裝的形式商業(yè)銷售,也可以作為自己動手(DIY)包購買。
Arduino電路板設(shè)計(jì)使用各種微處理器和控制器。這些電路板配有一組數(shù)字和模擬輸入/輸出(I/O)引腳,可以連接各種擴(kuò)展板或面包板(屏蔽板)和其他電路。這些電路板具有串行通信接口,包括某些型號上的通用串行總線(USB),也用于從個人計(jì)算機(jī)加載程序。微控制器通常使用C/C++編程語言。除了使用傳統(tǒng)的編譯工具鏈之外,Arduino項(xiàng)目還提供了一個基于Processing語言項(xiàng)目的集成開發(fā)環(huán)境(IDE),集成開發(fā)環(huán)境界面如圖 1.1。
Arduino項(xiàng)目始于2003年,作為意大利伊夫雷亞地區(qū)交互設(shè)計(jì)研究所Ivrea的學(xué)生項(xiàng)目,目的是為新手和專業(yè)人員提供一種低成本且簡單的方法,以創(chuàng)建使用傳感器與環(huán)境相互作用的設(shè)備執(zhí)行器。適用于初學(xué)者愛好者的此類設(shè)備的常見示例包括簡單機(jī)器人,恒溫器和運(yùn)動檢測器。
Arduino這個名字來自意大利伊夫雷亞的一家酒吧,該項(xiàng)目的一些創(chuàng)始人過去常常會去這家酒吧。 酒吧以伊夫雷亞的Arduin命名,他是1002年至1014年期間伊夫雷亞三國和意大利國王的統(tǒng)治者。
它使用 Atmel AVR 單片機(jī),采用開放源代碼的軟硬件平臺,構(gòu)建于開放源代碼 simple I/O 接口板,并具有使用類似 Java,C 語言的 Processing/Wiring 開發(fā)環(huán)境。
2. Arduino特點(diǎn)
- 基于知識共享開放源代碼的電路圖設(shè)計(jì)。
- 免費(fèi)下載,也可依需求自己修改,但需遵照姓名標(biāo)示。您必須按照作者或授權(quán)人所指定的方式,表彰其姓名。
- 依相同方式分享,若您改變或轉(zhuǎn)變著作,當(dāng)散布該派生著作時,您需采用與本著作相同或類似的授權(quán)條款。
- Arduino可使用ICSP在線燒入器,將Bootloader燒入新的IC芯片。
- 可依據(jù)Arduino官方網(wǎng)站,獲取硬件的設(shè)計(jì)檔,加以調(diào)整電路板及組件,以匹配自己實(shí)際設(shè)計(jì)的需求。
- 可簡單地與感測器,各式各樣的電子組件連接,如紅外線、超音波、熱敏電阻、光敏電阻、伺服馬達(dá)…等。
- 支持多樣的交互程序,如Adobe Flash, Max/MSP, VVVV, Pure Data, C, Processing…等。
- 使用低價格的微處理控制器(Atmel AVR)(ATMEGA 8,168,328等)。
- USB接口,不需外接電源。另外有提供直流(DC)電源輸入。
2.1 Arduino參數(shù):
- Digital I/O 數(shù)字輸入/輸出端口0—13。
- Analog I/O 模擬輸入/輸出端口0-5。
- 支持ICSP下載,支持TX/RX。
- 輸入電壓:USB接口供電或者5V-12V外部電源供電。
- 輸出電壓:支持3.3V級5V DC輸出。
- 處理器:使用Atmel Atmega168 328處理器,因其支持者眾多,
- 已有公司開發(fā)出來32位的MCU平臺支持arduino。
VIN端口:VIN是input voltage的縮寫,表示有外部電源時的輸入端口。
AREF:Reference voltage for the analog inputs(模擬輸入的基準(zhǔn)電壓)。使用analogReference()命令調(diào)用。
ICSP:也有稱為ISP(In System Programmer),就是一種線上即時燒錄,目前比較新的芯片都支持這種燒錄模式。
我們都知道傳統(tǒng)的燒錄方式,都是將被燒錄的芯片,從線路板上拔起,有的焊死在線路板上的芯片,還得先把芯片焊接下來才能燒錄。只需要準(zhǔn)備一條R232線(連接燒錄器),以及一條連接燒錄器與燒錄芯片針腳的連接線就可以。電源的+5V,GND,兩條負(fù)責(zé)傳輸燒錄信息的針腳,再加上一個燒錄電壓針腳,這樣就可以燒錄了。
2.2 Arduino 板的說明
在本章中,我們將了解Arduino板上的不同組件。將學(xué)習(xí)Arduino UNO板,因?yàn)樗茿rduino板系列中最受歡迎的。此外,它是開始使用電子和編碼的最佳板。有些板看起來與下面給出的有些不同,但多數(shù)Arduino中的這些組件大部分是共同的。
上圖編號 | 引腳定義 |
1 |
電源USB Arduino板可以通過使用計(jì)算機(jī)上的USB線供電。你需要做的是將USB線連接到USB接口。 |
2 |
電源(桶插座) Arduino板可以通過將其連接到電影插口直接從交流電源供電。 |
3 |
穩(wěn)壓器 穩(wěn)壓器的功能是控制提供給Arduino板的電壓,并穩(wěn)定處理器和其他元件使用的直流電壓。 |
4 |
晶體振蕩器 晶振幫助Arduino處理時間問題。Arduino如何計(jì)算時間?答案是,通過使用晶體振蕩器。在Arduino晶體頂部打印的數(shù)字是16.000H9H。它告訴我們,頻率是16,000,000赫茲或16MHz。 |
5,17 |
Arduino重置 你可以重置你的Arduino板,例如從一開始就啟動你的程序。可以通過兩種方式重置UNO板。首先,通過使用板上的復(fù)位按鈕(17)。其次,你可以將外部復(fù)位按鈕連接到標(biāo)有RESET(5)的Arduino引腳。 |
6,7,8,9 |
引腳(3.3,5,GND,Vin)
|
10 |
模擬引腳 Arduino UNO板有六個模擬輸入引腳,A0到A5。這些引腳可以從模擬傳感器(如濕度傳感器或溫度傳感器)讀取信號,并將其轉(zhuǎn)換為可由微處理器讀取的數(shù)字值。 |
11 |
微控制器 每個Arduino板都有自己的微控制器(11)。你可以假設(shè)它作為板的大腦。Arduino上的主IC(集成電路)與板對板略有不同。微控制器通常是ATMEL公司的。在從Arduino IDE加載新程序之前,你必須知道你的板上有什么IC。此信息位于IC頂部。有關(guān)IC結(jié)構(gòu)和功能的更多詳細(xì)信息,請參閱數(shù)據(jù)表。 |
12 |
ICSP引腳 大多數(shù)情況下,ICSP(12)是一個AVR,一個由MOSI,MISO,SCK,RESET,VCC和GND組成的Arduino的微型編程頭。它通常被稱為SPI(串行外設(shè)接口),可以被認(rèn)為是輸出的“擴(kuò)展”。實(shí)際上,你是將輸出設(shè)備從屬到SPI總線的主機(jī)。 |
13 |
電源LED指示燈 當(dāng)你將Arduino插入電源時,此LED指示燈應(yīng)亮起,表明你的電路板已正確通電。如果這個指示燈不亮,那么連接就出現(xiàn)了問題。 |
14 |
TX和RX LED 在你的板上,你會發(fā)現(xiàn)兩個標(biāo)簽:TX(發(fā)送)和RX(接收)。它們出現(xiàn)在Arduino UNO板的兩個地方。首先,在數(shù)字引腳0和1處,指示引腳負(fù)責(zé)串行通信。其次,TX和RX LED(13)。發(fā)送串行數(shù)據(jù)時,TX LED以不同的速度閃爍。閃爍速度取決于板所使用的波特率。RX在接收過程中閃爍。 |
15 |
數(shù)字I/O Arduino UNO板有14個數(shù)字I/O引腳(15)(其中6個提供PWM(脈寬調(diào)制)輸出),這些引腳可配置為數(shù)字輸入引腳,用于讀取邏輯值(0或1) ;或作為數(shù)字輸出引腳來驅(qū)動不同的模塊,如LED,繼電器等。標(biāo)有“〜”的引腳可用于產(chǎn)生PWM。 |
16 |
AREF AREF代表模擬參考。它有時用于設(shè)置外部參考電壓(0至5伏之間)作為模擬輸入引腳的上限。 |
3. 軟件支持
3.1 IDE:
Arduino提供了Arduino Software IDE,一套以Java編寫的跨平臺應(yīng)用軟件。Arduino Software IDE源自于Processing編程語言以及Wiring計(jì)劃的集成開發(fā)環(huán)境。它是被設(shè)計(jì)于介紹程序編寫給藝術(shù)家和不熟悉程序設(shè)計(jì)的人們,且包含了一個擁有語法高亮、括號匹配、自動縮進(jìn)和一鍵編譯并將可執(zhí)行文件燒寫入Arduino硬件中的編輯器。
Arduino Software IDE使用與C語言和C++相仿的編程語言,并且提供了包含常見的輸入/輸出函數(shù)的Wiring軟件庫。在使用GNU toolchain編譯和鏈接后,Arduino Software IDE提供了一個程序“avrdude”用來轉(zhuǎn)換可執(zhí)行檔成為能夠燒寫入Arduino硬件的固件。
3.2 Sketch:
使用Arduino Software IDE編寫的程序被稱為“sketch”。一個典型的Arduino C/C++ sketch程序會包含兩個函數(shù),它們會在編譯后合成為main()函數(shù):
- setup():在程序運(yùn)行開始時會運(yùn)行一次,用于初始化設(shè)置。
- loop():直到Arduino硬件關(guān)閉前會重復(fù)運(yùn)行函數(shù)放的代碼。
4. Arduino編程語言
int LED_PIN=13; void setup () { // 初始化副程式,程式起始時僅執(zhí)行一次 pinMode (LED_PIN, OUTPUT); // 以數(shù)位輸出方式啟用Pin13 } void loop () { // loop副程式,重複不斷執(zhí) digitalWrite (LED_PIN, HIGH); // 打開LED(發(fā)光二極管) delay (1000); // 等待一秒,delay內(nèi)含數(shù)值1000,代表延遲1000毫秒,即一秒。 digitalWrite (LED_PIN, LOW); // 關(guān)閉LED delay (1000); // 等待一秒 } // loop副程式結(jié)束
(Arduino的Blink示例程序)
Arduino 程序可由五個部分組成 :
//1. 導(dǎo)入庫與定義 (可有可無)
#include <SoftEasyTranfer.h>
#define LEDPIN 13;
//2. 聲明常量與全域變量 (可有可無)
const float PI=3.14159;
int r=0 ;
//3. 初始化函數(shù)setup() (必要)
void setup() {}
//4. 循環(huán)函數(shù)loop() (必要)
void loop() {}
//5. 自定義函數(shù) (可有可無)
float area(float r) {
float a=PI*r*r;
return a;
}
其中 setup() 與 loop() 是一定要有的函數(shù) (均無參數(shù)無傳回值), 其他則視需要而定. Arduino 語言采用 C/C++ 語法,加上以 Wiring 為基礎(chǔ)的電子設(shè)計(jì)核心庫組合而成, 包括 Digital I/O, Analog I/O 等庫. 內(nèi)置的庫可直接調(diào)用, 但若有使用第三方庫(例如驅(qū)動感測器模塊所需的庫), 則必須使用 include 前置指令引入. 此外, 也可以用前置指令 define 定義一個常量或宏 (表達(dá)式).
前置指令乃 C 編譯器指令, 不屬于 C 語言本身, 其用途有三 :
- 引入頭文件 : 例如 #include <myLibrary.h> 或 "myLibrary.h"
- 定義常量 : 例如 #define PI 3.14159
- 定義宏 : 例如 #define AREA(r) PI*r*r
所以前置指令的功能一言以蔽之就是替換, include 就是在標(biāo)頭處以指定之文件內(nèi)容替換; 而 #define 就是在程序中用到所定義之常量與宏名稱時, 以其內(nèi)容替換.
宏的功能事實(shí)上與函數(shù)類似, 不同之處是函數(shù)調(diào)用使用堆棧, 而宏則是直接放在源代碼中,由編譯器自動進(jìn)行替換,運(yùn)行效率較快 (但若很多地方都要用到時, 編譯后就會比較大).
注意:
頭文件可用角括號 < > 或雙引號 "", 差別是:
a. 用雙引號時, 前置處理器會先從源文件所在位置開始去搜索頭文件;
b. 而用角括號則會先從 libraries 目錄開始找.
5. Arduino 數(shù)據(jù)類型
C中的數(shù)據(jù)類型是指用于聲明不同類型的變量或函數(shù)的擴(kuò)展系統(tǒng)。變量的類型確定它在存儲器中占用多少空間以及如何解釋存儲的位模式。下表提供了你將在Arduino編程期間使用的所有數(shù)據(jù)類型。
void | Boolean | char | Unsigned char | byte | int | Unsigned int | word |
long | Unsigned long | short | float | double | array | String-char array | String-object |
void
void關(guān)鍵字僅用于函數(shù)聲明。它表示該函數(shù)預(yù)計(jì)不會向調(diào)用它的函數(shù)返回任何信息。
例子
Void Loop ( ) { // rest of the code }
Boolean
布爾值保存兩個值之一,true或false。每個布爾變量占用一個字節(jié)的內(nèi)存。
例子
boolean val = false ; // declaration of variable with type boolean and initialize it with false boolean state = true ; // declaration of variable with type boolean and initialize it with false
Char
一種數(shù)據(jù)類型,占用一個字節(jié)的內(nèi)存,存儲一個字符值。字符文字用單引號寫成:'A',對于多個字符,字符串使用雙引號:"ABC"。
但是,字符是存儲為數(shù)字。你可以在ASCII圖表中查看特定編碼。這意味著可以對使用ASCII值的字符進(jìn)行算術(shù)運(yùn)算。例如,'A'+1的值為66,因?yàn)榇髮懽帜窤的ASCII值為65。
例子
Char chr_a = ‘a(chǎn)’ ;//declaration of variable with type char and initialize it with character a Char chr_c = 97 ;//declaration of variable with type char and initialize it with character 97
unsigned char
unsigned char是一種無符號數(shù)據(jù)類型,占用一個字節(jié)的內(nèi)存。unsigned char數(shù)據(jù)類型編碼數(shù)字為0到255。
例子
Unsigned Char chr_y = 121 ; // declaration of variable with type Unsigned char and initialize it with character y
byte
一個字節(jié)存儲一個8位無符號數(shù),從0到255。
例子
byte m = 25 ;//declaration of variable with type byte and initialize it with 25
int
整數(shù)(int)是數(shù)字存儲的主要數(shù)據(jù)類型。int存儲16位(2字節(jié))值。
這產(chǎn)生-32768至32767的范圍(最小值為-2^15,最大值為(2^15)-1)。
int的大小因板而異。例如,在Arduino Due中,int存儲32位(4字節(jié))值。這產(chǎn)生-2147483648至2147483647的范圍(最小值-2^31和最大值(2^31)-1)。
例子
int counter = 32 ;// declaration of variable with type int and initialize it with 32
Unsigned int
unsigned int(無符號整數(shù))與int相同,存儲2字節(jié)。然而,它們只存儲正值,產(chǎn)生0到65535(2^16)-1的有效范圍。Due存儲4字節(jié)(32位)值,范圍從0到4294967295(2^32-1)。
例子
Unsigned int counter = 60 ; // declaration of variable with type unsigned int and initialize it with 60
Word
在Uno和其他基于ATMEGA的板上,一個word存儲一個16位無符號數(shù)。在Due和Zero上,它存儲一個32位無符號數(shù)。
例子
word w = 1000 ;//declaration of variable with type word and initialize it with 1000
Long
Long變量是用于數(shù)字存儲的擴(kuò)展大小變量,存儲32位(4字節(jié)),從-2147483648到2147483647。
例子
Long velocity = 102346 ;//declaration of variable with type Long and initialize it with 102346
unsigned long
unsigned long變量是用于數(shù)字存儲的擴(kuò)展大小變量,并存儲32位(4字節(jié))。與標(biāo)準(zhǔn)的long不同,unsigned long不會存儲負(fù)數(shù),它們的范圍為0到4294967295(2^32-1)。
例子
Unsigned Long velocity = 101006 ;// declaration of variable with type Unsigned Long and initialize it with 101006
short
short是16位數(shù)據(jù)類型。在所有Arduinos(基于ATMega和ARM)上,一個short存儲一個16位(2字節(jié))值。這產(chǎn)生-32768至32767的范圍(最小值為-2^15,最大值為(2^15)-1)。
例子
short val = 13 ;//declaration of variable with type short and initialize it with 13
float
浮點(diǎn)數(shù)的數(shù)據(jù)類型是具有小數(shù)點(diǎn)的數(shù)字。浮點(diǎn)數(shù)通常用于近似模擬值和連續(xù)值,因?yàn)樗鼈兊姆直媛矢哂谡麛?shù)。
浮點(diǎn)數(shù)可以大到3.4028235E+38,也可以低到-3.4028235E+38。它們被存儲為32位(4字節(jié))信息。
例子
float num = 1.352;//declaration of variable with type float and initialize it with 1.352
double
在Uno和其他基于ATMEGA的板上,雙精度浮點(diǎn)數(shù)占用四個字節(jié)。也就是說,double實(shí)現(xiàn)與float完全相同,精度沒有增益。在Arduino Due上,double具有8字節(jié)(64位)精度。
例子
double num = 45.352 ;// declaration of variable with type double and initialize it with 45.352
6. Arduino 變量和常量
在我們開始解釋變量類型之前,我們需要確定一個非常重要的主題,稱為變量范圍即作用域問題。
6.1 什么是變量范圍?
Arduino使用的C語言中的變量具有名為scope(范圍)的屬性。scope是程序的一個區(qū)域,有三個地方可以聲明變量。它們是:
- 在函數(shù)或代碼塊內(nèi)部,稱為局部變量。
- 在函數(shù)參數(shù)的定義中,稱為形式參數(shù)。
- 在所有函數(shù)之外,稱為全局變量。
6.2 局部變量
在函數(shù)或代碼塊中聲明的變量是局部變量。它們只能由該函數(shù)或代碼塊中的語句使用。局部變量不能在它們自己之外運(yùn)行。以下是使用局部變量的示例:
Void setup () { } Void loop () { int x , y ; int z ; Local variable declaration x = 0; y = 0; actual initialization z = 10; }
6.3 全局變量
全局變量在所有函數(shù)之外定義,通常位于程序的頂部。全局變量將在程序的整個生命周期中保持其真知。
全局變量可以被任何函數(shù)訪問。也就是說,一個全局變量可以在整個程序中聲明后使用。
以下示例使用全局變量和局部變量:
注意:全局變量、靜態(tài)變量、常量應(yīng)使用大寫字母來命名name,防止混淆且有警示作用。
Int T , S ; //全局變量大寫 float c = 0 ; Global variable declaration Void setup () { } Void loop () { int x , y ; // 局部變量小寫 int z ; Local variable declaration x = 0; y = 0; actual initialization z = 10; }
【Questions】
1.什么是單片機(jī)?它與個人計(jì)算機(jī)有什么不同?
Ans:一臺能夠工作的計(jì)算機(jī)要有這樣幾個部份構(gòu)成:中央處理單元CPU(進(jìn)行運(yùn)算、控制)、隨機(jī)存儲器RAM(數(shù)據(jù)存儲)、存儲器ROM(程序存儲)、輸入/輸出設(shè)備I/O(串行口、并行輸出口等)。在個人計(jì)算機(jī)(PC)上這些部份被分成若干塊芯片,安裝在一個被稱之為主板的印刷線路板上。而在單片機(jī)中,這些部份全部被做到一塊集成電路芯片中了,所以就稱為單片(單芯片)機(jī),而且有一些單片機(jī)中除了上述部份外,還集成了其它部份如模擬量/數(shù)字量轉(zhuǎn)換(A/D)和數(shù)字量/模擬量轉(zhuǎn)換(D/A)等。
2. 為什么用單片機(jī),如Arduino、STm32,etc.
實(shí)際工作中并不是任何涉及計(jì)算和控制的場合都要求處理器或計(jì)算機(jī)有很高的性能,其應(yīng)用的關(guān)鍵在于使用性能(是否夠用)和經(jīng)濟(jì)性(是否有很好的性能價格比)。