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