文章目錄
歡迎來到Arduino的世界,本文主要介紹Arduino是什么,為什么Arduino廣受歡迎,如何選擇一款適合自己的Arduino控制器、Arduino開發(fā)工具、Arduino的數(shù)據(jù)類型、變量和常量,結(jié)合Arduino常用的基本函數(shù),就可以制作各種小作品。想要了解更多信息,請進入Arduino官網(wǎng)。
1 什么是Arduino
Arduino是一個能夠用來感應(yīng)和控制現(xiàn)實物理世界的一套工具。它由一個基于單片機并且開放源碼的硬件平臺,和一套為Arduino板編寫程序的開發(fā)軟件組成。它的硬件包含一個以 Atmel AVR 單片機為核心的開發(fā)板和其他各種 I/O 板;軟件包括一個標(biāo)準(zhǔn)編程語言開發(fā)環(huán)境和在開發(fā)板上運行的燒錄程序。Arduino 主要是為業(yè)余愛好者的使用而設(shè)計的,被設(shè)計成一個小型計算機的形式,可以作為嵌入式計算機平臺,所以說它是一個交互系統(tǒng),可以通過硬件和軟件與它的環(huán)境進行互動。例如,它可以讀取大量的開關(guān)和傳感器信號,可以檢測到光線的有無和強弱、可以檢測到手指按下按鍵、甚至可以檢測到微信上的新消息;并將這些感受到的“信號”轉(zhuǎn)換為動作 比如電機動一下、LED 燈的打開或關(guān)閉、在互聯(lián)網(wǎng)上發(fā)布一條信息等;Arduino也可以開發(fā)出與 PC 相連的周邊裝置,能在運行時與 PC 上的軟件進行通信。
Arduino 本質(zhì)上就是一塊單片機,但它拋開了傳統(tǒng)硬件開發(fā)的復(fù)雜操作,不需要了解硬件的內(nèi)部結(jié)構(gòu)和寄存器設(shè)置(如果是單片機開發(fā),是需要了解寄存器并且設(shè)置各個寄存器),也不需要過多的電子知識和編程知識,開發(fā)者只需要通過簡單學(xué)習(xí),了解各個引腳和函數(shù)的作用,便可利用它開發(fā)出各種出色的項目。
2 為什么選擇Arduino作為開發(fā)平臺
目前市場上還有許多其他的單片機和單片機平臺,例如51單片機、STM32單片機等。但他們對于普通開發(fā)者來說門檻相對較高,需要有一定編程和硬件相關(guān)基礎(chǔ),內(nèi)部寄存器較為繁雜,主流開發(fā)環(huán)境Keil配置相對麻煩,特別是對于STM32的開發(fā),即使使用官方庫也少不了環(huán)境配置,還有就是開發(fā)環(huán)境是收費的。
Arduino 不但簡化了使用單片機工作的流程,同時還為教師、學(xué)生以及興趣愛好者提供了一些其他系統(tǒng)不具備的優(yōu)勢:
1、性價比高
相比于其他單片機平臺而言,Arduino生態(tài)的各種開發(fā)板性價比相對較高,也可以自己動手制作開發(fā)板。
2、跨平臺
Arduino IDE可以在 Windows、Mac OS X和 Linux 三大主流操作系統(tǒng)上運行,而其他的大多數(shù)控制器只能在 Windows 上開發(fā)。
3.簡單清晰的開發(fā)
Arduino IDE基于Processing IDE開發(fā),這對于初學(xué)者來說極易掌握,同時對于高級用戶來說又有著足夠的靈活性。Arduino語言是基于 Wiring 語言開發(fā)的,是對AVR-GCC庫的二次封裝,并不需要太多的單片機基礎(chǔ)和編程基礎(chǔ),只要簡單地學(xué)習(xí)后就可以快速地進行開發(fā)。
4.開放性
Arduino的硬件原理圖、電路圖、IDE軟件及核心庫文件都是開源的,在開源協(xié)議范圍內(nèi)可以任意修改原始設(shè)計及相應(yīng)代碼。
5.社區(qū)與第三方支持
Arduino有著眾多的開發(fā)者和用戶,因此可以找到他們提供的眾多開源的示例代碼和硬件設(shè)計。例如,可以在Github.com、Arduino.cc、 Openjumper.com、Arduino中文社區(qū)等網(wǎng)站上找到 Arduino 的第三方硬件、外設(shè)和類庫等支持,以便更快、更簡單地擴展自己的Arduino項目。
6.硬件開發(fā)趨勢
Arduino 不僅僅是全球最流行的開源硬件,也是一個優(yōu)秀的硬件開發(fā)平臺,更是硬件開發(fā)的趨勢。Arduino簡單的開發(fā)方式使得開發(fā)者更關(guān)注于創(chuàng)意與實現(xiàn),可以更快地完成自己的項目開發(fā),大大節(jié)約學(xué)習(xí)的成本,縮短開發(fā)的周期。
鑒于 Arduino 的種種優(yōu)勢,越來越多的專業(yè)硬件開發(fā)者已經(jīng)或開始使用 Arduino 來開發(fā)項目和產(chǎn)品;越來越多的軟件開發(fā)者使用 Arduino 進入硬件、物聯(lián)網(wǎng)等開發(fā)領(lǐng)域。
3 Arduino硬件
3.1 Arduino開發(fā)板的類型
根據(jù)使用的不同微控制器,可提供各種 Arduino 板。然而,所有 Arduino 板都有一個共同點:它們通過 Arduino lDE 編程。
差異基于輸入和輸出的數(shù)量(可以在單個板上使用的傳感器,LED和按鈕的數(shù)量),速度,工作電壓,外形尺寸等。一些板被設(shè)計為嵌入式,并且沒有編程接口(硬件),因此你需要單獨購買。有些可以直接從3.7V電池運行,其他至少需要5V。
以下是可用的不同Arduino板的列表。
板名稱 | 工作電壓 | 時鐘速度 | 數(shù)字i/o | 模擬輸入 | PWM | UART | 編程接口 |
---|---|---|---|---|---|---|---|
Arduino Uno R3 | 5V | 16MHz | 14 | 6 | 6 | 1 | USB通過ATMega16U2 |
Arduino Uno R3 SMD | 5V | 16MHz | 14 | 6 | 6 | 1 | USB通過ATMega16U2 |
Red Board | 5V | 16MHz | 14 | 6 | 6 | 1 | USB通過FTDI |
Arduino Pro 3.3v/8 MHz | 3.3V | 8MHz | 14 | 6 | 6 | 1 | FTDI兼容頭 |
Arduino Pro 5V/16MHz | 5V | 16MHz | 14 | 6 | 6 | 1 | FTDI兼容頭 |
Arduino mini 05 | 5V | 16MHz | 14 | 8 | 6 | 1 | FTDI兼容頭 |
Arduino Pro mini 3.3v/8mhz | 3.3V | 8MHz | 14 | 8 | 6 | 1 | FTDI兼容頭 |
Arduino Pro mini 5v/16mhz | 5V | 16MHz | 14 | 8 | 6 | 1 | FTDI兼容頭 |
Arduino Ethernet |
5V | 16MHz | 14 | 6 | 6 | 1 | FTDI兼容頭 |
Arduino Fio | 3.3V | 8MHz | 14 | 8 | 6 | 1 | FTDI兼容頭 |
LilyPad Arduino 328 main board | 3.3V | 8MHz | 14 | 6 | 6 | 1 | FTDI兼容頭 |
LilyPad Arduino simply board | 3.3V | 8MHz | 9 | 4 | 5 | 0 | FTDI兼容頭 |
板名稱 | 工作電壓 | 時鐘速度 | 數(shù)字i/o | 模擬輸入 | PWM | UART | 編程接口 |
---|---|---|---|---|---|---|---|
Arduino Leonardo | 5V | 16MHz | 20 | 12 | 7 | 1 | 本機USB |
Pro micro 5V/16MHz | 5V | 16MHz | 14 | 6 | 6 | 1 | 本機USB |
Pro micro 3.3V/8MHz | 5V | 16MHz | 14 | 6 | 6 | 1 | 本機USB |
LilyPad Arduino USB | 3.3V | 8MHz | 14 | 6 | 6 | 1 | 本機USB |
板名稱 | 工作電壓 | 時鐘速度 | 數(shù)字i/o | 模擬輸入 | PWM | UART | 編程接口 |
---|---|---|---|---|---|---|---|
Arduino Mega 2560 R3 | 5V | 16MHz | 54 | 16 | 14 | 4 | USB通過ATMega16U2B |
Mega Pro 3.3V | 3.3V | 8MHz | 54 | 16 | 14 | 4 | FTDI兼容頭 |
Mega Pro 5V | 5V | 16MHz | 54 | 16 | 14 | 4 | FTDI兼容頭 |
Mega Pro Mini 3.3V | 3.3V | 8MHz | 54 | 16 | 14 | 4 | FTDI兼容頭 |
板名稱 | 工作電壓 | 時鐘速度 | 數(shù)字i/o | 模擬輸入 | PWM | UART | 編程接口 |
---|---|---|---|---|---|---|---|
Arduino Mega 2560 R3 | 3.3V | 84MHz | 54 | 12 | 12 | 4 | 本機USB |
注:引用自Arduino概述。
3.2 不同開發(fā)板的對比
在使用 Arduino 控制器完成項目制作之前,應(yīng)該對各個型號有一定的了解,以便選擇適合自己項目的控制器。
1、Arduino UNO
Arduino UNO 是目前使用最廣泛的 Arduino 控制器,具有 Arduino 的所有功能,是初學(xué)者的最佳選擇。在大部分參考書或者開源代碼,都以 UNO 為例子。當(dāng)然,掌握UNO開發(fā)技巧,其他型號控制器也是類似的,可以很輕松地移植代碼。
2、Arduino MEGA
Arduino Mega 是一個增強型的Arduino 控制器,相對于UNO,它提供了更大的存儲空間和更多的輸入/輸出接口,可以控制更多的設(shè)備,是完成較大型項目的較好選擇。
3、Arduino Leonardo
Arduino Leonardo 使用集成了 USB 功能的 AVR 單片機作為主控芯片,具備其他型號 Arduino 控制器的所有功能之外還可以輕松模擬USB鍵盤/鼠標(biāo)等USB設(shè)備。
4、Arduino Due
Arduino Due 突破性使用了32位的 ARM Cortex-M3 作為主控芯片。它集成了多種外設(shè),有著其他Arduino板無法比擬的性能,是目前最為強大的 Arduino 控制器。
5、小型化的Arduino
常見小型 Arduino 控制器有 Arduino Nano,Arduino Mini,Arduino Micro,Arduino LilyPad 等。這些小型控制器雖然在設(shè)計上精簡了許多地方,但使用起來一樣方便。其中 Arduino Mini 和 Arduino Lilypad 需要外部模塊配合來完成程序下載功能。
4 Arduino軟件
4.1 IDE
Arduino提供了Arduino Software IDE,一套以 Java 編寫的跨平臺應(yīng)用軟件。Arduino Software IDE 源自于 Processing 編程語言以及 Wiring 計劃的集成開發(fā)環(huán)境。它是被設(shè)計于介紹程序編寫給藝術(shù)家和不熟悉程序設(shè)計的人們,且包含了一個擁有語法高亮、括號匹配、自動縮進和一鍵編譯并將可執(zhí)行文件燒寫入Arduino 硬件中的編輯器。
Arduino Software IDE 使用與C語言和C++相仿的編程語言,并且提供了包含常見的輸入/輸出函數(shù)的Wiring 軟件庫。在使用 GNU toolchain 編譯和鏈接后,Arduino Software IDE 提供了一個程序“avrdude”用來轉(zhuǎn)換可執(zhí)行檔成為能夠燒寫入Arduino硬件的固件。
4.2 Sketch
使用 Arduino Software IDE 編寫的程序被稱為“sketch”(草圖)。一個典型的 Arduino C/C++ sketch 程序會包含兩個函數(shù),它們會在編譯后合成為 main() 函數(shù):
- setup():在程序運行開始時會運行一次,用于初始化設(shè)置。
- loop():直到Arduino硬件關(guān)閉前會重復(fù)運行函數(shù)放的代碼。
// 打開IDE會自動創(chuàng)建一個sketch模板,如下: void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }
4.3 編程語言
#define led 2 //定義數(shù)字IO 2的名字為led void setup() //初始化部分 { pinMode(led,OUTPUT); //定義led引腳為輸出模式 } void loop() //主循環(huán) { digitalWrite(led,LOW); //led引腳輸出低電平,點亮led delay(1000); //延時1000ms digitalWrite(led,HIGH); //led引腳輸出高電平,熄滅led delay(1000); //延時1s }
Arduino 程序可由五個部分組成 :
(1) 導(dǎo)入庫與定義 (可有可無)
#include <stdint.h> #define LED 2
(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è)計核心庫組合而成,包括 Digital I/O,Analog I/O 等庫.。內(nèi)置的庫可直接調(diào)用,但若有使用第三方庫(例如驅(qū)動感測器模塊所需的庫),則必須使用 include 前置指令引入。此外,也可以用前置指令 define 定義一個常量或宏 (表達式)。
前置指令乃 C 編譯器指令, 不屬于 C 語言本身, 其用途有三 :
- 引入頭文件:例如 #include <myLibrary.h> 或 “myLibrary.h”
- 定義常量:例如 #define PI 3.14159
- 定義宏:例如 #define AREA PIrr
所以前置指令的功能之一就是替換,include 就是在標(biāo)頭處以指定之文件內(nèi)容替換;而 #define 就是在程序中用到所定義之常量與宏名稱時,以其內(nèi)容替換。
宏的功能事實上與函數(shù)類似,不同之處是函數(shù)調(diào)用使用堆棧,而宏則是直接放在源代碼中,由編譯器自動進行替換,運行效率較快 (但若很多地方都要用到時, 編譯后就會比較大)。
注意:
頭文件可用角括號 < > 或雙引號 " ", 差別是:
- 用雙引號時, 前置處理器會先從源文件所在位置開始去搜索頭文件;
- 而用角括號則會先從 libraries 目錄開始找.
5 C/C++語言基礎(chǔ)
5.1 數(shù)據(jù)類型
Arduino 家族中的8位開發(fā)板和32位開發(fā)板的基本數(shù)據(jù)類型是有差別。對于8位開發(fā)板來說,int 占2字節(jié),double 和 float 占4字節(jié)。而對于32位開發(fā)板,int 占用4字節(jié),double 占用8字節(jié)。下表提供了你將在Arduino編程期間使用的所有數(shù)據(jù)類型。
數(shù)據(jù)類型 | 占用字節(jié) | 數(shù)值范圍 | 說明 |
---|---|---|---|
void | 僅用于函數(shù)聲明,表示沒有返回值 | ||
boolean/bool | 1 | true/false | 每個布爾變量占一個字節(jié)的內(nèi)存 |
char | 1 | -128~127 | Arduino中的char是有符號的,等價于signed char;char常被是用于儲存ASCII字符;如果想存儲數(shù)據(jù),建議使用byte類型 |
unsigned char | 1 | 0~255 | 等同于byte和uint8_t類型 |
byte | 1 | 0~255 | byte類型不是C/C++標(biāo)準(zhǔn)類型,他是Arduino平臺下特有的,它實際就是無符號8位整型數(shù)據(jù) |
int | 2 | -32768~32767 | 在基于 ATMega 的8位微控制器的Arduino開發(fā)板如Arduino UNO、Ardunio Mega2560,int占用2字節(jié)內(nèi)存;而對于32位Arduino開發(fā)板(如Arduino Due,SAMD)int占4字節(jié) |
unsigned int | 2 | 0~65536 | 等同于word和uint16_t類型;Due存儲4字節(jié)值 |
word | 2 | 0~65536 | 在Uno和其他基于ATMEGA的板上,一個word存儲一個16位無符號數(shù);在Due和Zero上,它存儲一個32位無符號數(shù) |
long | 4 | -2147483648~2147483647 | 用于數(shù)字存儲的擴展大小變量 |
unsigned long | 4 | 0~2^32-1 | 等同于uint32_t類型 |
short | 2 | -32768~32767 | 短整型 |
float | 4 | -3.4028235E+38~3.4028235E+38 | 只有6~7位小數(shù)精度 |
double | 4 | -3.4028235E+38~3.4028235E+38 | 在Arduino Due上有8個字節(jié),其余的跟float一樣 |
string | 相當(dāng)于char類型的數(shù)組 | ||
array | 數(shù)組 |
5.2 變量與常量
1、變量范圍
Arduino 使用的C語言中的變量具有名為scope(范圍)的屬性。scope是程序的一個區(qū)域,有三個地方可以聲明變量。它們是:
- 在函數(shù)或代碼塊內(nèi)部,稱為局部變量。
- 在函數(shù)參數(shù)的定義中,稱為形式參數(shù)。
- 在所有函數(shù)之外,稱為全局變量。
(1)局部變量
在函數(shù)或代碼塊中聲明的變量是局部變量。它們只能由該函數(shù)或代碼塊中的語句使用。局部變量不能在它們自己之外運行。以下是使用局部變量的示例:
void setup() { } void loop() { int i = 0; }
(2)全局變量
全局變量在所有函數(shù)之外定義,通常位于程序的頂部。全局變量將在程序的整個生命周期中保持其真值。全局變量可以被任何函數(shù)訪問。也就是說,一個全局變量可以在整個程序中聲明后使用。
以下示例使用全局變量和局部變量:
注意:全局變量、靜態(tài)變量、常量應(yīng)使用大寫字母來命名name,防止混淆且有警示作用。
uint16_t NUMBER = 0; void setup() { } void loop() { int i = 0; }
5.3 運算符
運算符是一個符號,它告訴編譯器執(zhí)行特定的數(shù)學(xué)或邏輯函數(shù)。C語言具有豐富的內(nèi)置運算符,并提供以下類型的運算符:
- Arithmetic Operators 算術(shù)運算符
- Comparison Operators 比較運算符
- Boolean Operators 布爾運算符
- Bitwise Operators 位運算符
- Compound Operators 復(fù)合運算符
5.4 選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)
(1)選擇結(jié)構(gòu)又稱選取結(jié)構(gòu)或分支結(jié)構(gòu)。在編程中,經(jīng)常需要根據(jù)當(dāng)前數(shù)據(jù)做出判斷,以決定下一步的操作。
序號 | 控制語句和描述 |
---|---|
1 |
它采用括號中的表達式,后面跟隨語句或語句塊。如果表達式為真,則執(zhí)行語句或語句塊,否則跳過這些語句。 |
2 |
一個 if 語句后面可以跟隨一個可選的else語句,當(dāng)表達式為false時執(zhí)行。 |
3 |
if 語句后面可以跟隨一個可選的 else if ... else 語句,其對于測試各種條件非常有用。 |
4 |
類似于if語句, switch ... case 通過允許程序員指定應(yīng)在各種條件下執(zhí)行的不同代碼來控制程序的流程。 |
5 |
條件運算符? :是C語言中唯一的三元運算符。 |
(2)循環(huán)結(jié)構(gòu)又稱重復(fù)結(jié)構(gòu),即反復(fù)執(zhí)行某一部分的操作。有兩類循環(huán)結(jié)構(gòu):“當(dāng)”( while)循環(huán)和“直到”(until)循環(huán)。
序號 | 循環(huán)及描述 |
---|---|
1 |
while循環(huán)將會連續(xù)、無限循環(huán),直到括號()內(nèi)的表達式變?yōu)閒alse。必須用一些東西改變被測試的變量,否則while循環(huán)永遠不會退出。 |
2 |
do ... while循環(huán)類似于while循環(huán)。在while循環(huán)中,循環(huán)連續(xù)條件在循環(huán)開始時測試,然后再執(zhí)行循環(huán)體。 |
3 |
for循環(huán)執(zhí)行語句預(yù)定的次數(shù)。循環(huán)的控制表達式在for循環(huán)括號內(nèi)完全的初始化,測試和操作。 |
4 |
C語言允許你在另一個循環(huán)內(nèi)使用一個循環(huán)。下面的例子說明了這個概念。 |
5 |
它是沒有終止條件的循環(huán),因此循環(huán)變?yōu)闊o限。 |
[Why]
1、什么是單片機?它與個人計算機有什么不同?
Ans:一臺能夠工作的計算機要有這樣幾個部份構(gòu)成:中央處理單元CPU(進行運算、控制)、隨機存儲器RAM(數(shù)據(jù)存儲)、存儲器ROM(程序存儲)、輸入/輸出設(shè)備I/O(串行口、并行輸出口等)。在個人計算機(PC)上這些部份被分成若干塊芯片,安裝在一個被稱之為主板的印刷線路板上。而在單片機中,這些部份全部被做到一塊集成電路芯片中了,所以就稱為單片(單芯片)機,而且有一些單片機中除了上述部份外,還集成了其它外設(shè)電路如==模擬量/數(shù)字量轉(zhuǎn)換(A/D)和數(shù)字量/模擬量轉(zhuǎn)換(D/A)==等。
2、 為什么用單片機,如Arduino、STm32,MCS-51等.
Ans:實際工作中并不是任何涉及計算和控制的場合都要求處理器或計算機有很高的性能,其應(yīng)用的關(guān)鍵在于使用性能(是否夠用)和經(jīng)濟性(是否有很好的性能價格比)。