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