Arduino程式設計從零開始 使用C和C++(第2版)

qinghuawenkang發表於2018-10-23


Arduino 程式設計從零開始
使用 C 和 C++

(第 2 版)
[美] 西蒙 • 蒙克 (Simon Monk)
張 懿


北 京
Simon Monk
Programming Arduino: Getting Started with Sketches, Second Edition
EISBN
978-1-25-964163-3
Copyright © 2017 by McGraw-Hill Education.
All Rights reserved. No part of this publication may be reproduced or transmitted in any form or by
any means, electronic or mechanical, including without limitation photocopying, recording, taping, or
any database, information or retrieval system, without the prior written permission of the publisher.
This authorized Chinese translation edition is jointly published by McGraw-Hill Education and
Tsinghua University Press Limited. This edition is authorized for sale in the People’s Republic of
China only, excluding Hong Kong, Macao SAR and Taiwan.
Translation copyright © 2018 by McGraw-Hill Education and Tsinghua University Press Limited.
版權所有。未經出版人事先書面許可,對本出版物的任何部分不得以任何方式或途徑複製或傳
播,包括但不限於影印、錄製、錄音,或透過任何資料庫、資訊或可檢索的系統。
本授權中文簡體字翻譯版由麥格勞-希爾(亞洲)教育出版公司和清華大學出版社有限公司合作出版。
此版本經授權僅限在中國大陸地區銷售,不能銷往中國香港、澳門特別行政區和台灣地區。
版權©2018 由麥格勞-希爾(亞洲)教育出版公司與清華大學出版社有限公司所有。
北京市版權局著作權合同登記號 圖字:
01-2018-0335
本書封面貼有 McGraw-Hill Education 公司防偽標籤,無標籤者不得銷售。
版權所有,侵權必究。侵權舉報電話:
010-62782989 13701121933
圖書在版編目 (CIP) 資料
Arduino程式設計從零開始:使用C和C++:第2版/(美)西蒙• 蒙克(Simon Monk) 著;張懿 譯. —北
京:清華大學出版社, 2018
書名原文: Programming Arduino: Getting Started with Sketches, Second Edition
ISBN 978-7-302-50056-8
Ⅰ. ①A… Ⅱ. ①西… ②張… Ⅲ. ①單片微型計算機-C 語言-程式設計 Ⅳ. ①
TP368.1②TP312.8
中國版本圖書館 CIP 資料核字(2018)第 088825 號
責任編輯: 王 軍 李維傑
裝幀設計: 牛豔敏
責任校對: 孔祥峰
責任印製: 李紅英
出版發行: 清華大學出版社
網 址: ,
地 址:北京清華大學學研大廈 A 座 郵 編: 100084
社 總 機: 010-62770175 郵 購: 010-62786544
投稿與讀者服務: 010-62776969, c-service@tup.tsinghua.edu.cn
質 量 反 饋: 010-62772015, zhiliang@tup.tsinghua.edu.cn
印 裝 者: 北京嘉實印刷有限公司
經 銷: 全國新華書店
開 本: 148mm×210mm 印 張: 6 字 數: 167 千字
版 次: 2018 年 7 月第 1 版 印 次: 2018 年 7 月第 1 次印刷
定 價: 49.80 元
————————————————————————————————————————
產品編號: 078167-01

本書讚譽
多年來,我一直是一個電子愛好者,但主要涉足模擬領域,
對數字方面的興趣不大。在接觸和使用 Arduino 之前,我一直在
程式設計,但從不使用微處理器。現在,我上癮了。但讓人遺憾的是,
普通 Arduino 圖書提供的“幫助”與示例和解釋非常零碎,從來
沒有十分系統的講述。這本書真是太棒了!我剛一拿到手,就迫
不及待地閱讀了,我用筆把其中的內容標記起來,提醒自己幾個
月前我想知道的重要內容。我以前用 FORTRAN 語言和 BASIC
語言程式設計,但從未學習過 C 語言。謝天謝地,這本書不需要 C 語
言基礎,並手把手帶你經歷這個過程。該書很好地解釋了程式設計的
每一部分,解釋了開發板的硬體,以及開發板如何與計算機進行
通訊。最後,書中不只是複製和貼上別人的程式,而是希望讀者
可以對其進行修改以實現自己的功能,讀者可以理解為什麼某些
事情產生的效果遠大於初衷。

II Arduino 程式設計從零開始 使用 C 和 C++(第 2 版)
這本書太適合程式設計新手了,書中的資訊十分切合主題,並且緊
跟技術潮流,因此,我強烈推薦給任何想要涉足或深入 Arduino 程式設計
的人。本書的一大特色,就是可以使用 Arduino 隨時跟進示例。如果
正在尋找哪些書能幫你涉足 Arduino,那麼本書再適合不過了。
本書涵蓋 Arduino IDE的絕大部分功能,包括庫、類、標準 Arduino
庫的用法, 以及足夠的硬體理論來幫助你理解優秀的 Arduino 示例程
序。網上的大多數 Arduino 示例程式都是依葫蘆畫瓢; 本書可以幫助
你理解為什麼要這麼做,並且準確解釋了其中專有詞彙的含義。

譯 者 序
Arduino 是一款便捷靈活、易於上手的開源電子開發平臺,
自 2005 年推出以來,在全球範圍內激起了經久不衰的創客風潮。
它是一款強大的開發工具,可以適應各個層次、不同場合的應用
需求。從可穿戴智慧裝置,到大型工業機器人,從深海自主探測
器,到 NASA 發射的創客衛星,甚至在歐洲原子能機構的大型強
子對撞機上都能見到 Arduino 的身影。革命性技術的誕生都伴隨
著傳統行業門檻的大幅降低。例如,冷兵器時代,騎士們花費一
生時間學習劍術、馬術和各種格鬥技術。但火槍誕生後,只要扣
動扳機就行了。 Arduino 最大的貢獻就是,給極為複雜難懂的電
子製作“裝上了扳機”——它把極客們最頭疼的電子電路和底層
驅動庫都打包整合為黑箱, 進而省略了大部分與電路和硬體驅動相
關的操作,最終只剩下簡單的控制邏輯。這讓程式設計師無須學習複雜
的電子基礎,也能輕鬆製作出精良而可靠的電子創意產品。
對於初學者來說,一本好的入門書籍可以讓你獲益良多,但
目前市面上 Arduino 相關的書籍種類之多,涉及的領域之廣,往
往令人眼花繚亂,難以選擇。《Arduino 程式設計從零開始 使用 C 和
C++(第 2 版)》是眾多 Arduino 學習資源中的經典,在創客圈中影
響頗深。本書的作者是 Arduino 愛好者、電子大師 Simon Monk。
從少年時代起 Simon Monk 就是一名活躍的電子玩家,並擔任業
餘電路雜誌的兼職作者。 Monk 博士撰寫了 20 餘本有關創客和電

IV Arduino 程式設計從零開始 使用 C 和 C++(第 2 版)
子題材的著作,本書作為 Simon Monk 的經典之作,幫助大量電
子愛好者入門 Arduino 程式設計,對 Arduino 的推廣功不可沒。
本書在前一版的基礎上,新增加了一章: Arduino 物聯網程
序設計。其中介紹瞭如何讓 Arduino 像網路伺服器那樣執行並像
dweet 和 IFTTT 那樣與網際網路應用服務交換資料。第 10 章“物聯
網程式設計”在豐富內容的同時,牢牢抓住電子開發的熱點話題,
使得本書緊跟物聯網開發浪潮。此外,本書也隨著硬體裝置不斷
推陳出新對章節內容進行了調整,使用最新的開發板、軟體開發
環境以及外圍硬體裝置,全方位地升級了全書內容。
正所謂“耳聞之不如目見之,目見之不如足踐之”,學習的最
好方法就是親自動手實踐。考慮到程式設計過程的煩瑣和枯燥,本書
作者已將全部專案程式碼上傳至支援網站,並在每一章中都給出了
可供參考的資源連結以方便讀者參考和使用。你可以使用作者提
供的程式碼快速上手,實現專案要求,領略程式之美,但照搬程式碼
終歸不是程式設計之道,知者明其形而深諳其意,所以譯者建議各位
讀者在使用作者的原始碼熟練掌握語法、深入理解程式邏輯後,用
自己的風格重新編寫例程,如此方能成為理論和行動上的“巨人”。
在這裡要感謝清華大學出版社的編輯,他們為本書的翻譯投
入了巨大的熱情並付出了很多心血。沒有你們的幫助和鼓勵,本
書不可能順利付梓。
本書全部章節由張懿翻譯。 對於這本經典之作, 譯者本著“誠
惶誠恐”的態度,在翻譯過程中力求“信、達、雅”,但是鑑於譯
者水平有限,錯誤和失誤在所難免,如有任何意見和建議,請不
吝指正,感激不盡!
最後,希望讀者透過閱讀本書能早日掌握 Arduino 程式設計,體
驗創客樂趣!

序 言
本書的第 1 版於 2011 年 11 月出版, 在亞馬遜網站的 Arduino
同類書籍銷售排行榜中位居第一。
在本書剛剛完成時,最新的 Arduino 型號是 Arduino 2009,
軟體版本是 Beta018。幾乎就在本書上架的同時, Arduino Uno 和
1.0 版本的 Arduino 軟體釋出。很快,本書第 1 版在重印時進行了
一次對新開發板和軟體的次要更新,但並沒有正式成為第 2 版。
本書的第 2 版基於 Arduino1.6 全方位地升級了全書內容。
Arduino Uno R3 依然被公認為一款優秀的 Arduino 開發板。
但也有許多其他的開發板出現,包括官方出品的(如 Leonardo、
Zero、 101、 Due 和 Yun)和其他基於 Ardunio 程式語言的裝置,如
Photon 和 Intel Edison。
本書的第 2 版還介紹了 Arduino 在物聯網專案和包括 OLED
及 LCD 在內的多種顯示裝置上的應用。
Simon Monk


作者簡介
Simon Monk,模擬控制與電腦科學學士,
軟體工程博士。從少年時代起,他就是一名活躍
的電子玩家,並擔任業餘電路雜誌的兼職作者。
Monk 博士撰寫了 20 餘本有關創客和電子題材的
著作,尤其是 Arduino 和樹莓派。你可以在網站
上找到他的更多作品,也可以關注他的推特
@simonmonk2。

致 謝
我想感謝 Linda 給了我時間、場地並支援我完成這本書,她還
忍受我因為製作電子專案在家裡造成的髒亂。
非常感謝 Robert“BobKat” Logan 和許多其他慧眼如炬、報告
本書第 1 版勘誤表的熱心人士,我已經盡我所能修正了你們發現的
錯誤。
最後,我想感謝 Michael McCabe、 Srishti Malasi 和每一個參與
本書出版工作的人,與如此優秀的團隊合作是我的榮幸。

前 言
Arduino 介面的開發板提供了一種低成本、便於使用的技術來創
作基於微控制器的專案。只需要掌握很少的電子學基礎知識,就可
以讓 Arduino 實現從控制藝術裝置的燈光到管理太陽能系統的電力
在內的方方面面。
有 很 多 基 於 項 目 的 書 會 向 你 展 示 如 何 把 設 備 連 接 到 你 的
Arduino 上,包括本書作者的
30 Arduino Projects for the Evil Genius
一書。但是,本書重點關注如何編寫 Arduino 程式。
本書將會向你講解如何讓 Arduino 程式設計變得簡單有趣,避免使
用那些往往會讓專案受阻的、棘手的程式碼。在本書指導下,你會從
Arduino 使用的最基礎的 C 語言開始, 一步步徹底瞭解 Arduino 程式設計
過程。
0.1 什麼是 Arduino
Arduino 是一款小型微控制器開發板,使用 USB (Universal Serial
Bus,通用串列埠匯流排)介面連線到計算機,並且擁有大量可以用來連
接像電機、繼電器、光感測器、鐳射二極體、擴音器、麥克風等外
部電子元件的介面。 這些外部裝置可以透過計算機的 USB 連線、 9V
電池或外部電源供電。它們可以透過計算機直接控制或在程式設計後獨
立執行。
Arduino 開發板的設計是開源的,這意味著任何人都可以製作
Arduino 相容的開發板。這種競爭帶來了低成本的開發板和在“標準”

X Arduino 程式設計從零開始 使用 C 和 C++(第 2 版)
開發板基礎上加以改型的各類板型。
Arduino 主控板可以透過在頂部插入擴充套件板的方式進行功能擴充。
用 於 Arduino 編 程 的 軟 件 簡 單 易 用 , 並 且 可 以 輕 松 地 為
Windows、 Mac 和 Linux 系統免費獲得。
0.2 需要準備什麼?
這是一本面向初學者的書,但也可以為那些已經用過一段時間
Arduino,並且想了解關於 Arduino 程式設計更多知識,或者想更深入了
解其中原理的人帶來幫助。依照這個定位,本書把注意力放在
Arduino Uno 開發板的使用上;當然,幾乎所有的程式碼都可以不經修
改地直接在 Arduino 的其他型號和變種上使用。
不需要擁有任何程式設計經驗或技術背景,本書的全部練習也不需
要焊接。你所需要的全部就是對創造的渴望。
如果想充分利用本書並嘗試其中的一些實驗,那麼手頭有以下
物品是很有幫助的:
· 幾根實心導線
· 一臺便宜的數字萬用表
只需要花幾塊錢就可以很容易地從電子元器件商店或網路經銷
商(如 Adafruit 或 Sparkfun)那裡買到它們。當然,你還需要一塊
Arduino Uno 開發板。
如果想要更進一步瞭解並且嘗試一些使用顯示器和網路連線的
實驗,需要從網上購買一些擴充套件板,詳見第 9 章和第 10 章。
0.3 如何使用本書
本書在內容安排上循序漸進, 可以讓你用一種簡單的方式上手。
但是當你找到合適的定位並開始閱讀本書時,你可能會發現自己可
以跳過或只需要粗略閱讀前面的章節。
本書按如下順序組織章節內容:

前 言 XI
第 1 章: Arduino 介紹。這是關於 Arduino 硬體的引言,該章介
紹 Arduino 的功能和大量可獲得的不同型號的 Arduino 開發板。
第 2 章:啟程。你將使用 Arduino 開發板開始自己的首個實驗:
安裝軟體,上電,下載你的第一個專案。
第 3 章: C 語言基礎。該章涵蓋 C 語言的基礎語法;對於程式設計
初學者,該章也可以作為一本大體的程式設計教材。
第 4 章:函式。該章講解在 Arduino 專案中使用和編寫函式的
關鍵概念。這些專案都包含用來示範的可執行的示例程式碼。
第 5 章:陣列和字串。該章將介紹如何使用比整型變數更高
級的資料結構。 透過逐步開發一個摩爾斯電碼例程來解釋這些概念。
第 6 章:輸入和輸出。該章介紹如何在程式中使用 Arduino 開
發板上的數字和模擬輸入/輸出介面。透過萬用表有助於瞭解
Arduino 輸入/輸出介面上所發生的情況。
第 7 章: Arduino 標準類庫。該章講解如何利用 Arduino 標準類
庫中的函式。
第 8 章:資料儲存。在該章中可以學習如何編寫可以在 EEPROM
(Electrically Erasable Programmable Read Only Memory,電可擦可編
程只讀儲存器)中儲存資料並利用 Arduino 內建快閃記憶體(Flash Memory)
的專案。
第 9 章:顯示器。在該章中,你會學到如何將 Arduino 和顯示
器連線起來並製作 USB 留言板。
第 10 章: Arduino 物聯網程式設計。該章講解如何讓 Arduino
像網路伺服器那樣執行並像 dweet 和 IFTTT 那樣與網際網路應用服務
通訊。
第 11 章: C++和庫。你已經攻克了 C 語言,嘗試一下物件導向
程式設計,然後編寫自己的 Arduino 類庫。

XII Arduino 程式設計從零開始 使用 C 和 C++(第 2 版)
0.4 資源
本書由以下網站提供技術支援: 。
可以從這個網站以及諸如勘誤表之類的其他來源找到本書使用
的所有原始碼。也可以透過掃描封底的二維碼來得到這些資源。

目 錄
1 章 Arduino 介紹 ··································································1
1.1 微控制器 ··············································································· 1
1.2 Arduino 開發板的探索之旅·················································· 3
1.2.1 電源介面··················································································· 4
1.2.2 供電介面··················································································· 4
1.2.3 模擬輸入介面 ··········································································· 4
1.2.4 數字介面··················································································· 5
1.2.5 微控制器··················································································· 5
1.2.6 其他元件··················································································· 6
1.3 Arduino 的起源 ····································································· 7
1.4 Arduino 家族 ········································································· 8
1.4.1 Uno 和 Leonardo······································································· 9
1.4.2 Mega 和 Due ············································································· 9
1.4.3 微型和小型 Arduino 開發板··················································· 10
1.4.4 Yun·························································································· 11
1.4.5 Lilypad ···················································································· 12
1.4.6 其他“官方”開發板 ····························································· 12
1.5 Arduino 複製品和變型························································ 13
1.6 本章小結 ············································································· 13
2 章 啟程 ·············································································15
2.1 上電 ····················································································· 15

XIV Arduino 程式設計從零開始 使用 C 和 C++(第 2 版)
2.2 安裝軟體 ·············································································· 16
2.3 上傳你的第一個專案 ··························································· 16
2.4 Arduino 應用程式································································· 21
2.5 本章小結 ·············································································· 23
3 章 C 語言基礎···································································25
3.1 程式設計 ····················································································· 25
3.2 什麼是程式語言? ······························································ 27
3.3 Blink——再來一次! ························································· 31
3.4 變數 ····················································································· 33
3.5 C 語言實驗·········································································· 35
3.6 數值變數和算術運算子 ······················································ 36
3.7 控制語句 ············································································· 39
3.7.1 if 語句 ····················································································· 39
3.7.2 for 語句··················································································· 41
3.7.3 while 語句··············································································· 44
3.8 常量 ····················································································· 45
3.9 本章小結 ············································································· 45
4 章 函式 ·············································································47
4.1 什麼是函式? ······································································ 47
4.2 引數 ····················································································· 48
4.3 全域性變數、區域性變數和靜態變數······································· 50
4.4 返回值 ················································································· 53
4.5 其他變數型別······································································ 54
4.5.1 float(浮點型)··········································································· 54
4.5.2 boolean(布林型)······································································ 55
4.5.3 其他資料型別 ········································································· 56
4.6 程式碼風格 ············································································· 58
4.6.1 縮排 ························································································ 58
目 錄 XV
4.6.2 花括號····················································································· 59
4.6.3 空白 ························································································ 60
4.6.4 註釋 ························································································ 60
4.7 本章小結 ············································································· 62
5 章 陣列和字串 ·······························································63
5.1 陣列 ····················································································· 63
5.2 字串 ················································································· 67
5.2.1 字串常量············································································· 68
5.2.2 字串變數············································································· 69
5.3 摩爾斯電碼轉換器······························································ 70
5.3.1 資料 ························································································ 71
5.3.2 全域性變數和 setup 函式 ··························································· 72
5.3.3 loop 函式················································································· 72
5.3.4 flashSequence 函式 ································································· 75
5.3.5 flashDotOrDash 函式 ······························································ 76
5.3.6 整合 ························································································ 77
5.4 本章小結 ············································································· 79
6 章 輸入和輸出···································································81
6.1 數字輸出 ············································································· 81
6.2 數字輸入 ············································································· 85
6.2.1 上拉電阻················································································· 85
6.2.2 內部上拉電阻 ········································································· 88
6.2.3 防抖動····················································································· 89
6.3 模擬輸出 ············································································· 94
6.4 模擬輸入 ············································································· 96
6.5 本章小結 ············································································· 98

XVI Arduino 程式設計從零開始 使用 C 和 C++(第 2 版)
7 章 Arduino 標準類庫 ·························································99
7.1 隨機數 ················································································· 99
7.2 數學函式 ··········································································· 102
7.3 位操作 ··············································································· 103
7.4 高階 I/O ············································································· 105
7.4.1 生成音調··············································································· 105
7.4.2 移位暫存器··········································································· 107
7.4.3 中斷 ······················································································ 107
7.5 本章小結 ··········································································· 109
8 章 資料儲存 ···································································· 111
8.1 常量 ··················································································· 111
8.2 將資料儲存在快閃記憶體中························································ 112
8.3 EEPROM ··········································································· 114
8.3.1 在 EEPROM 中儲存整數 ····················································· 116
8.3.2 使用 AVR EEPROM 庫 ························································ 117
8.3.3 在 EEPROM 中儲存浮點數·················································· 118
8.3.4 在 EEPROM 中儲存字串·················································· 118
8.3.5 清除 EEPROM 的內容 ························································· 120
8.4 壓縮 ··················································································· 121
8.5 本章小結 ··········································································· 122
9 章 顯示器········································································123
9.1 字母數字 LCD 顯示器 ······················································ 124
9.2 USB 留言板······································································· 125
9.3 使用顯示器········································································ 127
9.4 其他 LCD 庫函式······························································ 128
9.5 OLED 圖形顯示器 ···························································· 128
9.6 連線 OLED 顯示器 ··························································· 129
9.7 軟體 ··················································································· 130

目 錄 XVII
9.8 本章小結 ··········································································· 132
第 10 章 Arduino 物聯網程式設計···········································133
10.1 與 Web 伺服器通訊························································· 134
10.1.1 HTTP ················································································ 134
10.1.2 HTML··············································································· 134
10.2 將 Arduino Uno 作為 Web 伺服器 ·································· 136
10.3 網路控制的 Arduino························································ 139
10.4 Node MCU Web 伺服器 ·················································· 145
10.5 網路控制的 Node MCU ·················································· 150
10.6 呼叫 Web 伺服器····························································· 153
10.7 Arduino Uno 和 IFTTT···················································· 156
10.8 Node MCU ESP8266 開發板和 IFTTT ··························· 158
10.9 其他物聯網選擇······························································ 160
10.9.1 Arduino Yun······································································ 160
10.9.2 Particle Photon ·································································· 161
10.10 本章小結········································································ 161
11 章 C++和庫···································································163
11.1 物件導向·········································································· 163
11.2 內建庫示例······································································ 164
11.3 編寫自己的庫·································································· 165
11.3.1 標頭檔案 ·············································································· 165
11.3.2 實現檔案 ·········································································· 166
11.3.3 完成你的庫······································································· 167
11.3.4 關鍵字 ·············································································· 168
11.3.5 示例 ················································································· 168
11.4 本章小結·········································································· 171

1
Arduino 介紹
Arduino 是一款能極大激發電子愛好者想象力的微控制器平臺,
易於使用和開源特性使它成為電子專案開發者不錯的選擇。
基本上,把電子元件連線到 Arduino 的介面上, Arduino 就可以控
制這些元件——比如開關燈和電機,或者檢測光照和溫度。這就是為
什麼 Arduino 有時會提供物理運算描述的原因。因為 Arduino 開發板
可以透過 USB 線連線到計算機, 所以可以將 Arduino 用作介皮膚來控
制計算機中相同的電子元件。
本章對 Arduino 作簡單介紹,包括 Arduino 的歷史、背景和硬體
概況。
1.1 微控制器
Arduino的心臟是微控制器。從給開發板供電到允許開發板和桌面
計算機進行通訊在內的幾乎所有東西都與它息息相關。
微控制器本質上是一臺片上微型計算機,擁有組成一臺計算機的
所有結構並且已經超越了第一代家用計算機。微控制器內擁有一臺處
理器, 1KB 或 2KB 容量用來儲存資料的隨機存取儲存器(Random
Access Memory, RAM),幾 KB 容量用來儲存程式的可擦除可程式設計只

讀儲存器(Erasable Programmable Read Only Memory, EPROM)或快閃記憶體,
以及輸入/輸出(I/O)引腳。這些輸入/輸出引腳將其他電子元件連線到
微控制器上。
輸入引腳可以讀取數字量(導通還是關閉? )和模擬量(引腳上的電
壓是多少? )。這讓你有機會可以將許多不同種類的感測器(如用於光
照、溫度、聲音等的感測器)連線到你的微控制器上。
輸出引腳也可以接受模擬量和數字量。因此,可以設定一個引腳
是導通還是關閉(0V 還是 5V),從而可以直接控制一個 LED 開關:也
可以使用輸出引腳來控制一些需要更多供電的裝置,比如電機。輸出
引腳也可以提供模擬量輸出。這代表可以控制輸出引腳的輸出能量大
小,讓你控制電機的轉速或燈的亮度,而不是簡單地控制其開關。
Arduino Uno 開發板上的微控制器是安裝在開發板底座中央的 28
引腳的晶片。這個單獨的晶片包含記憶體、處理器和輸入/輸出引腳的所
有電子元件。它由專業微控制器製造廠商之一的 Atmel 公司製造。每
一家微控制器生產廠商都生產著幾十種不同系列、不同型號的微控制
器。微控制器不僅僅是為了幫助像我們這樣的電子愛好者而被創造出
來。我們只是這個巨大市場中的一小部分。這些裝置將被嵌入消費級
產品,包括汽車、洗衣機、 DVD 播放器、兒童玩具甚至空氣清淨機。
Arduino 最偉大的地方就是用微控制器來代替這些令人眼花繚亂
的選擇並堅持到底(儘管在之後的內容中,這種陳述並不完全正確,但
已足夠接近)。
這意味著當開始一個新的專案時,不需要首先衡量所有利弊和各
種微控制器的缺點。
開發板
我們已經確定微控制器只是一個晶片。一片微控制器在沒有支援
電路提供規範而準確的供電(微控制器對供電敏感),以及一種用來給
微控制器程式設計的與計算機通訊的手段的情況下是不會獨立工作的。

這就是開發板的由來。一塊 Arduino Uno 開發板本質上是一個獨
立且開源設計的微控制器擴充套件板。這代表著所有印製電路板(Printed
Circuit Board, PCB)的設計文件和原理圖都是公開的,任何人都可以
免費使用這些設計,製作和銷售自己的 Arduino 開發板。
所有的微控制器生產廠商,包括把 ATmega328 微控制器應用於
Arduino 開發板的 Atmel,都同樣提供他們自己的開發板和程式設計軟體。
儘管這些開發板相當廉價,但是它們更傾向於面向專業的電子工程師
而不是愛好者。這表明這些開發板和軟體可以說是難以使用,並且在
你能夠從中得到有用的東西之前需要大量學習投入。
1.2 Arduino 開發板的探索之旅
圖 1-1 展示了一塊 Arduino Uno 開發板。讓我們快速瀏覽一遍開
發板上的各個元件。

圖 1-1 一塊 Arduino Uno 開發板
1.2.1 電源介面
參考圖 1-1, USB 介面的正下方是 5V 穩壓晶片。這個元件可以
將直流電源介面接入的 7V~12V 直流電源穩壓至 5V。
與其他晶片相比, 5V 穩壓晶片的體積可以稱得上“巨大”。這是
為了確保晶片在透過電流較大的情況下,有足夠的面積發散在調節電
壓時產生的熱量。當需要用 Arduino 驅動外部電路時,你會發現這個
設計相當有用。
雖然透過直流電源介面連線電池或者透過直流電源為 Arduino 供
電非常有用,但是也可以透過用來燒錄程式的 USB 介面供電。
1.2.2 供電介面
接下來讓我們一起研究圖 1-1 所示開發板底部的介面。可以看一
下這些介面旁邊的名字,有沒有注意到最左邊的 RESET 介面?也許
你會聯想到復位按鈕,是的沒錯,這個介面可以實現和 Arduino 開發
板上覆位按鈕相同的功能。和重啟計算機略有不同,使用 RESET 接
口重啟微控制器,可以讓它從頭開始程式。只需要讓 RESET 介面處
於低電平一小段時間(接到 0V),就可以讓微控制器完成復位操作。
這塊區域剩下的引腳只具有提供它們所標記的電平值(3.3V、 5V、
GND 和 Vin)的功能。 GND 介面,也叫接地端,提供 0V 電壓。這個
數值是相對的,因為在開發板上它是其他所有電壓的參考電壓。
1.2.3 模擬輸入介面
以 A0 到 A5 標記的 6 個模擬輸入引腳可以用來測量輸入它們的電
壓值,這樣就可以在 Sketch(Arduino 專案名稱)中使用這些資料。
必須注意,這些引腳測量的是電壓值而非電流值。由於模擬輸入

引腳的內阻非常大, 只有很小的電流會經過它們, 然後從接地端流出。
換個說法,就是模擬輸入引腳的內阻較大,只允許很小的電流透過。
雖然這些輸入引腳被標記為模擬介面並且預設為模擬輸入,但是
依然可以把它們用作數字輸入/輸出介面。
1.2.4 數字介面
現在,我們開始介紹圖 1-1 所示開發板頂部的介面。在這塊區域
內,可以看到一排被標記為數字 0~13 的介面。這 14 個介面都支援
輸入/輸出兩種模式。當被用作輸出介面時,它們的工作方式與之前
介紹的供電介面相似,除了電源介面會始終保持 5V 電壓輸出,而數
字介面可以用 Sketch 控制其是否工作以外。所以,如果在 Sketch 中
開啟了數字介面,它們就會輸出 5V 電壓;如果關閉它們,電壓就會
變為 0V。和電源介面一樣,必須注意輸出電流大小以確保不會超過
最大驅動電流。最右邊的兩個介面(0 和 1)又被標記為 RX 和 TX,它
們可以用來收發資料。這兩個介面是為與計算機透過 USB 連線進行
直接資料傳輸而預留的。
數字介面可以在 5V 電壓下提供最大 40mA 的驅動電流。這樣
的電流大小足夠點亮一個標準的 LED 燈,但並不足以直接驅動直
流電機。
1.2.5 微控制器
繼續我們的 Arduino 開發板探索之旅,開發板上含有 28 個引腳
的黑色矩形元件就是微控制器晶片。得益於雙列直插式封裝設計,
它可以很方便地進行更換。 Arduino Uno 採用一塊 ATmega328 作為
主控晶片。圖 1-2 提供的框圖展示了這臺裝置的主要構成。

圖 1-2 ATmega328 框圖
中央處理器(Central Processing Unit, CPU)是整臺裝置的心臟,也
許比作大腦更恰當一些。它控制著裝置內部進行的一切活動。中央處
理器取出儲存在快閃記憶體中的程式指令,然後執行。這些指令也許是從
RAM 中讀取資料,對其進行修改,然後放回。當然,這也可能意味
著將其中一個數字引腳的輸出從 0V 改為 5V。
EEPROM 和快閃記憶體有一些相似之處,二者都具有非易失性。通俗來
講,可以安心地重啟裝置而其中的內容不會丟失。但快閃記憶體通常被用來
儲存程式指令(從專案檔案中獲得), 而 EEPROM 被用來儲存那些在復
位或斷電情況下不想丟失的資料。
1.2.6 其他元件
在微控制器的上方有一個小巧的銀色矩形元件。這是石英晶體振
蕩器(晶振)。它一秒鐘振動 1600 萬次,在每一個機器週期
內,微控
① 譯者注:微控制器執行一條指令需要一個機器週期,一般來講,一個機器週期由 12
個振盪週期(時鐘週期)組成,即執行一次操作需要 12 個振盪週期。同時,受限於硬體功能,
不同的數學運算需要的指令週期也不盡相同,這裡不多作贅述。

制器可以執行一次操作——相加、相減或其他數學運算。
在開發板左上方的是復位開關。按下復位開關將會向微控制器的
復位引腳傳送一個邏輯脈衝,使微控制器從頭開始程式並清空記憶體。
請注意所有儲存在裝置上的程式依然會被保留,因為它們都被儲存在
快閃記憶體中——這就是說, 儲存介質依然儲存著這些資料, 即便裝置掉電。
在開發板右側的是序列程式設計介面。它提供了一種不使用 USB 介面
的 Arduino 程式燒錄方法。因為 USB 聯結器和軟體更易於使用,所以
在本書中我們不會利用這個特性。
USB 介面晶片在開發板左上角靠近 USB 介面的位置。這個晶片
將遵循 USB 通訊協議的訊號電平轉換為可供 Arduino 板直接使用的信
號電平。
1.3 Arduino 的起源
最初, Arduino 是作為學生教學的輔助工具開發的。隨後在 2005
年, Massimo Banzi 和 David Cuartielles 對其進行了商業化開發。從那
時起, Arduino 憑藉簡單易用和經久不衰的特點在創客、學生和藝術
家群體中取得了巨大的成功。
Arduino 取得成功的另一個關鍵因素, 就是在 Creative Commons(CC)
授權下,任何基於 Arduino 的硬體設計都可以免費獲得。在該協議下,
任何人都可以製作低成本的原設計的複製品。唯一被保留的只有
Arduino 這個名字,因此許多複製品會在自己的產品名字中加入 duino
以示尊重或表明自己是 Arduino 的衍生產物,例如 Boarduino、
Seeeduino 和 Freeduino。在 2014 年, Arduino 的創始團隊和主要生產
廠商之間出現了嚴重分歧。這次分裂的結果之一就是現在除美國本土
以外的區域, Arduino UNO 都被改稱為 Genuino UNO。許多大的零售
商只銷售官方出品的開發板,因為它們通常包裝更精美,質量更好。

對於 Arduino 而言,所有微控制器都是通用的,這也是其成功要
素之一。市面上有大量相容 Arduino 的擴充套件板,它們可以直接插在
Arduino開發板上使用。由於這些擴充套件板幾乎涵蓋所有的應用方向,因
此常常可以透過堆疊擴充套件板的方式來代替電烙鐵。下面是一部分最常
見的擴充套件板:
● Ethernet:乙太網擴充套件板,它為 Arduino 提供網際網路擴充套件服務。
● Motor:電機擴充套件板,它可以驅動電動馬達。
● USB Host: USB 主機擴充套件板,它可以使 Arduino與一臺 USB
裝置通訊。
● Relays:繼電器擴充套件板,它是一臺外接的開關繼電器。
圖 1-3 展示了電機擴充套件板(左)和繼電器擴充套件板(右)。

圖 1-3 電機擴充套件板和繼電器擴充套件板
1.4 Arduino 家族
稍微瞭解一下各種各樣的 Arduino 開發板的背景是有幫助的。我
們會使用 Arduino Uno 作為標準裝置,更準確一些,是 Arduino Uno
R3(第三次修改版)。事實上,這是到目前為止應用最多的 Arduino 開
發板,但是所有的開發板都用相同的語言程式設計並且大部分採用相同的
外部介面,所以可以很方便地使用不同的開發板。

1.4.1 Uno 和 Leonardo
Arduino Uno 只是眾多 Arduino 開發板中的典型,這個系列包括
Diecimila(義大利語的 10000)和 Duemilanove(義大利語的 2009)。圖 1-4
展示了一塊 Arduino Leonardo 開發板,現在你可能會猜測 Arduino 是
一項義大利發明。
Arduino Leonardo(參見圖 1-4)是另一款受歡迎的 Arduino 開發板,
在絕大多數情況下都可以用來代替 Arduino Uno。它比 Uno 稍微便宜
一點,並且和 Uno 擁有相同的介面。它的處理器焊接在開發板上,所
以不可以移除(Uno 的處理器可以移除)。 Leonardo 的低價部分是因為
使用了一臺自帶 USB 介面的處理器,而不需要使用 Uno 那樣的分離
式晶片。

圖 1-4 Arduino Leonardo
1.4.2 Mega 和 Due
Arduino Mega 是 Arduino 開發板中的重量級代表,擁有大量的輸
入/輸出介面,但 Mega 很機智地將這些介面布置在開發板的尾部,允
許繼續對Arduino Uno、Leonardo和所有Arduino擴充套件板保持引腳相容。
Mega 使用一款永久固定在開發板上,且帶有更多輸入/輸出引腳
的貼片式處理器——ATmega1280。所以,不像 Uno 以及類似的開發
板,如果不慎將處理器損壞,將無法更換。
多出的介面被安排在開發板的尾部。 Mega 提供的額外功能如下:
● 54 個輸入/輸出引腳
● 128KB 容量的用來儲存程式和資料的快閃記憶體(Uno 只有 32KB 容
量)
● 8KB 的 RAM 空間和 4KB 的 EEPROM 空間
Arduino Due(參見圖 1-5)和 Mega 擁有相同的尺寸和介面, 但使用
一塊 32 位 84MHz 頻率的 ARM 處理器。 Due 工作在 3.3V 而不是
Arduino 開發板最常用的 5V,因此一些擴充套件板會無法正常工作。

圖 1-5 一塊 Arduino Due 開發板
1.4.3 微型和小型 Arduino 開發板
Uno 的體積在某些場合下實在是太大了,這裡有一系列更小的
Arduino 和 Arduino 相容開發板。圖 1-6 展示了一些被選出來的開發板。

圖 1-6 Arduino Micro(左)、 Freetronics LeoStick(中)和 Adafruit Trinket(右)

Arduino Micro 使用和 Leonardo 相同的微控制器,但被縮減到一
塊更緊湊的開發板上。像 LeoStick 和 Adafruit Trinket 這樣的第三方開
發板,提供了 Micro 的替代方案。
像 Micro 這樣的小型開發板的不足之處就是:它們比 Uno 小太多,
它們不能使用 Uno 尺寸的擴充套件板。
1.4.4 Yun
Arduino Yun(參見圖 1-7)基本上是一塊 Arduino Leonardo 和執行
Linux 的微型 WiFi 模組的結合體。這種裝置是為需要網路連線的

圖 1-7 Arduino Yun
Arduino 應用而準備的。 Yun 上面的 Arduino 和 Linux 兩部分透過被稱
為橋接的軟體相連線。 Yun 像普通 Arduino 開發板一樣透過 Arduino
IDE 程式設計,但在接入本地網路後也可以透過 Arduino IDE 進行無線編
程。
1.4.5 Lilypad
Lilypad(參見圖 1-8)是一款可以為可穿戴計算應用而被縫進衣服
的小且薄的 Arduino 開發板。

圖 1-8 Arduino Lilypad
Lilypad 沒有 USB 介面,必須使用單獨的介面卡來為它程式設計,它
有著異常完美的設計。
Adafruit 也出售與 Lilypad 在概念上相似, 被稱為 Flora 的開發板。
1.4.6 其他“官方”開發板
之前介紹的 Arduino 開發板都是使用最廣泛、最受歡迎的型號。
但是 Arduino 開發板的種類在不停變化,所以可以瀏覽 Arduino 官方

網站 以瞭解完整的 Arduino 家族和
它們最新的圖片。
1.5 Arduino 複製品和變型
非官方的開發板分兩大類。一類只是採用標準的 Arduino 開源硬
件設計,然後製作成廉價產品。下面是一些可以搜尋到的這類開發板
的名稱:
● Sparkfun RedBoard
● Adafruit Metro
● Olimexino
更有趣的是,一些 Arduino 相容的設計打算在某些方面擴充套件或改
善 Arduino。每時每刻都有新的變體出現,它們太多了以至於難以全
部提及。不過,下面是一些更有趣、更受歡迎的變體:
● Node MCU 開發板,圍繞 ESP8266 晶片上的 WiFi 系統設計。
這在專案需要使用 WiFi 連線 Arduino 時提供了一種非常廉價
的解決方案。更多資訊參考第 10 章。
● Adafruit Trinket,一致非常小的 Arduino 開發板。
● Freetronics EtherTen,一致內建乙太網的 Arduino 板。
● Particle Photon, 一致廉價的 WiFi 開發板。 可以使用 Arduino C
語言進行網路程式設計,但是採用了基於網頁的 IDE 而不是
Arduino IDE。
1.6 本章小結
現在已經探索了 Arduino 硬體世界的一部分,是時候搭建自己的
軟體開發環境了。

購買地址:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26421423/viewspace-2217107/,如需轉載,請註明出處,否則將追究法律責任。

相關文章