Arduino程式設計從零開始 使用C和C++(第2版)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- FPGA程式設計從零開始 使用VerilogFPGA程式設計
- 從零開始學習C++(0)C++
- 從零開始學習C++之遞推C++
- 從零開始學習C++(1-1)C++
- 好程式設計師Python教程從零開始學Python系列-第2講程式設計師Python
- Photon物聯網程式設計從零開始程式設計
- 風變程式設計,幫助你從零開始學習程式設計程式設計
- 從零開始學C語言 第3版pdfC語言
- 併發程式設計從零開始(十一)-Atomic類程式設計
- 從零開始學習C++之if判斷語句C++
- 從零開始的Java程式設計之抽象與介面Java程式設計抽象
- 併發程式設計從零開始(九)-ConcurrentSkipListMap&Set程式設計
- 併發程式設計從零開始(十四)-Executors工具類程式設計
- Windows 程式設計簡介從C/C++到Windows程式設計Windows程式設計C++
- <<從0到1學C++>> 第2篇 認識C++程式導向程式設計的特點C++程式設計
- 從零開始設計一個部落格
- 用C++從0開始開發自己的程式語言C++
- 從零開始理解 Laravel 的設計哲學Laravel
- 從零開始學C語言pdfC語言
- C++程式設計開發和指標的關係C++程式設計指標
- OpenSNN推文:從零開始學程式設計 新手小白的全面指南程式設計
- 從零開始入門 K8s | Kubernetes API 程式設計利器:Operator 和 Operator FrameworkK8SAPI程式設計Framework
- 從零開始學設計模式(七)—橋接模式設計模式橋接
- 【C++】從零開始,只使用FFmpeg,Win32 API,實現一個播放器(二)C++Win32API播放器
- 【C++】從零開始,只使用FFmpeg,Win32 API,實現一個播放器(三)C++Win32API播放器
- 【C++】從零開始,只使用FFmpeg,Win32 API,實現一個播放器(一)C++Win32API播放器
- 從零開始
- C++核心程式設計C++程式設計
- java從零開始系列-一個前端程式設計師的自我修養Java前端程式設計師
- 學習程式設計從遊戲開始程式設計遊戲
- C語言/C++程式設計學習:和QT零距離接觸的意義C語言C++程式設計QT
- 不怕從零開始,只怕從未開始!
- 黑馬程式設計師匠心之作|C++教程從0到1入門程式設計--結構體定義和使用程式設計師C++結構體
- 從零開始打造自己的PHP框架――第2章PHP框架
- 程式設計競賽中 C/C++ I/O 的使用程式設計C++
- OC/Swift/C/C++混合使用的程式設計姿勢SwiftC++程式設計
- python和C++ NOI程式設計題解1.1PythonC++程式設計
- C++日期和時間程式設計總結C++程式設計