前言:項目驅動的學習方法使我們能夠快速的掌握新知識,開發出新產品。該學習筆記是基於《略》機器人項目的底層開發,學習、整理和總結而來,其涵蓋了Arduino的基礎知識和實際開發例程。後續會繼續整理《OpenCV+TensorFlow 》、《Raspberry Pi Linux》、《ROS Fundamental》等內容。
《Arduino學習筆記》由四篇文章來完成,各部分內容安排如下:
第一部分:介紹Arduino開源歷史以及硬件基礎
第二部分:總結Arduino的I/O接口
第三部分:總結Arduino常用函數和功能(C/C++)
第四部分:上電實戰
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)電源輸入。
性能:
- 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,兩條負責傳輸燒錄信息的針腳,再加上一個燒錄電壓針腳,這樣就可以燒錄了。
3. 軟件支持
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硬件的固件。
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. 設置函數 (必要)
void setup() {}
//4. 無限循環 (必要)
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 就是在程序中用到所定義之常量與宏名稱時, 以其內容替換.
宏的功能事實上與函數類似, 不同之處是函數調用使用堆棧, 而宏則是直接放在源代碼中,由編譯器自動進行替換,運行效率較快 (但若很多地方都要用到時, 編譯後就會比較大).
頭文件可用角括號 < > 或雙引號 "", 差別是用雙引號時, 前置處理器會先從源文件所在位置開始去搜索頭文件; 而用角括號則會先從 libraries 目錄開始找.
【Questions】
1.什麼是單片機?它與個人計算機有什麼不同?
Ans:一臺能夠工作的計算機要有這樣幾個部份構成:中央處理單元CPU(進行運算、控制)、隨機存儲器RAM(數據存儲)、存儲器ROM(程序存儲)、輸入/輸出設備I/O(串行口、並行輸出口等)。在個人計算機(PC)上這些部份被分成若干塊芯片,安裝在一個被稱之爲主板的印刷線路板上。而在單片機中,這些部份全部被做到一塊集成電路芯片中了,所以就稱爲單片(單芯片)機,而且有一些單片機中除了上述部份外,還集成了其它部份如模擬量/數字量轉換(A/D)和數字量/模擬量轉換(D/A)等。
2. 爲什麼用單片機,如Arduino、STm32,etc.
實際工作中並不是任何涉及計算和控制的場合都要求處理器或計算機有很高的性能,其應用的關鍵在於使用性能(是否夠用)和經濟性(是否有很好的性能價格比)。