2021Arduino家居安全系統(tǒng)構(gòu)建實(shí)戰(zhàn)_第1頁(yè)
2021Arduino家居安全系統(tǒng)構(gòu)建實(shí)戰(zhàn)_第2頁(yè)
2021Arduino家居安全系統(tǒng)構(gòu)建實(shí)戰(zhàn)_第3頁(yè)
2021Arduino家居安全系統(tǒng)構(gòu)建實(shí)戰(zhàn)_第4頁(yè)
2021Arduino家居安全系統(tǒng)構(gòu)建實(shí)戰(zhàn)_第5頁(yè)
已閱讀5頁(yè),還剩80頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Arduino家居安全系統(tǒng)構(gòu)建實(shí)戰(zhàn)第1第2Arduino與ArduinoIDE入門(mén)第3第4第5Arduino和傳感器第6第7歡迎來(lái)到異步社區(qū)!第1章 家居安全系統(tǒng)的入門(mén)知識(shí)在這一章中,我們將會(huì)介紹如下的內(nèi)容:什么是家居安全基礎(chǔ)設(shè)施它是如何工作的部署這樣一個(gè)系統(tǒng)都需要些什么在當(dāng)前條件下為安全系統(tǒng)所做的準(zhǔn)備有線安全系統(tǒng)和無(wú)線安全系統(tǒng)傳統(tǒng)系統(tǒng)與現(xiàn)代化家居安全系統(tǒng)為了緊緊跟隨硬件的發(fā)展趨勢(shì),本書(shū)介紹了隨處可見(jiàn)且價(jià)格極為低廉的平臺(tái)——Arduino或者公共機(jī)構(gòu)見(jiàn)到這個(gè)小電路板的身影。Arduino平臺(tái)因其眾多的優(yōu)勢(shì)而著名,例如低廉的成本、開(kāi)放性的設(shè)計(jì)、簡(jiǎn)單易行的組裝性以及可進(jìn)行調(diào)整的性能。這也就是幾乎所有的項(xiàng)目,無(wú)論專(zhuān)業(yè)還是業(yè)余,通過(guò)這些神奇的板子,都能從一張紙上的簡(jiǎn)單設(shè)計(jì)快速地在真實(shí)世界中成為現(xiàn)實(shí)的原因。本書(shū)中我們將介紹采用這種技術(shù)來(lái)創(chuàng)建我們的家居安全系統(tǒng)。本章將會(huì)帶你步入家居安全系統(tǒng)的世界。此外,你也將會(huì)了解到傳統(tǒng)的監(jiān)控系統(tǒng)與家庭自動(dòng)化系統(tǒng)之間的差異,也會(huì)了解它們的工作方式、進(jìn)行安裝的需求以及如何就環(huán)境進(jìn)行準(zhǔn)備。你應(yīng)該在對(duì)電子產(chǎn)品和計(jì)算機(jī)的基本概念有一些了解之后,再來(lái)深入地研究本書(shū)的內(nèi)容,并在隨后的章節(jié)中深入地學(xué)習(xí)更先進(jìn)的原理(但是請(qǐng)不必為此過(guò)度擔(dān)憂,本書(shū)的每一個(gè)知識(shí)點(diǎn)都通過(guò)實(shí)例進(jìn)行了仔細(xì)的說(shuō)明,還關(guān)聯(lián)了大量的相關(guān)信息,以此來(lái)方便讀者的理解)。請(qǐng)弄清楚一件事,本書(shū)并不僅僅是一本帶領(lǐng)你一步一步地創(chuàng)建一個(gè)簡(jiǎn)單系統(tǒng)的指導(dǎo)書(shū),同時(shí)還是一本向你提供了能夠打造一個(gè)自己專(zhuān)屬的家居系統(tǒng)的相關(guān)知識(shí)的工具書(shū)。安全建議:在整個(gè)項(xiàng)目的開(kāi)發(fā)過(guò)程中,你要采取最嚴(yán)格的安全措施,注意你周?chē)沫h(huán)境,永遠(yuǎn)不要獨(dú)自一人施工,除非你擁有極為豐富的高級(jí)技術(shù)經(jīng)驗(yàn)。另外,盡量少使用或者避免使用高電壓的電氣設(shè)備。家居安全的基礎(chǔ)設(shè)施當(dāng)然,如果你被問(wèn)到一個(gè)關(guān)于安全系統(tǒng)組成部分的問(wèn)題,你可能會(huì)毫不猶豫地對(duì)這個(gè)問(wèn)題做出回答,例如,你可能會(huì)就監(jiān)控?cái)z像頭、運(yùn)動(dòng)傳感器和報(bào)警器等設(shè)備侃侃而談。但是你確實(shí)了解這些不同的組成模塊了嗎?你能清楚地說(shuō)出它們之間所有的關(guān)聯(lián)嗎?你能詳細(xì)地講出它們的工作方式嗎?你能準(zhǔn)確地說(shuō)出傳統(tǒng)的系統(tǒng)和當(dāng)前的系統(tǒng)的區(qū)別嗎?不要著急,這些答案都將為你揭曉。好了,現(xiàn)在我們這里已經(jīng)有這些問(wèn)題的答案了。安全基礎(chǔ)設(shè)施包括了所有的硬件設(shè)備、軟件部分以及它們之間關(guān)聯(lián)的設(shè)計(jì),將所有這些組件組合在一起構(gòu)成了一個(gè)整體。這里以一個(gè)訪問(wèn)接入控制點(diǎn)基礎(chǔ)設(shè)施為例,在這個(gè)例子中,你使用一個(gè)連接到了數(shù)據(jù)庫(kù)的讀卡器,通過(guò)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)讀取可以實(shí)現(xiàn)對(duì)卡的ID(卡片序列號(hào))的檢查,以此來(lái)確定門(mén)禁的放行或者禁止操作,還有攝像頭提供支持,以實(shí)時(shí)地顯示事件動(dòng)態(tài)。在這種情況下,如果有人試圖破壞安全措施時(shí),系統(tǒng)將會(huì)觸發(fā)警報(bào)。然后,你可以決定下一步該怎么做。正如你在這個(gè)簡(jiǎn)單的例子中看到的,我們使用了大量協(xié)同工作的要素來(lái)保證環(huán)境的安全。所有這些共同構(gòu)成了一個(gè)安全的基礎(chǔ)設(shè)施。工作原理之前討論了家居安全系統(tǒng)基本的組成部分,但是這些要素都是什么,它們是如何工作的呢?通過(guò)對(duì)它們進(jìn)行分類(lèi),我們可以將一個(gè)安全系統(tǒng)分成兩個(gè)部分。硬件部分一個(gè)基礎(chǔ)設(shè)施的硬件要素必須能夠勝任軟件的所有技術(shù)需求。可以將它們進(jìn)一步細(xì)分為3個(gè)不同的子類(lèi)別。這種分類(lèi)方式不應(yīng)該被理解為具有排斥性,因?yàn)橐粋€(gè)要素經(jīng)??梢员环值蕉鄠€(gè)子類(lèi)別中,這種分類(lèi)方式反而有助于你理解系統(tǒng)所執(zhí)行的功能。傳感器:傳感器將作為系統(tǒng)的感覺(jué)器官,其作用就如同人類(lèi)的身體感官。它們的功能就是從環(huán)境中搜集信息,并將這些信息轉(zhuǎn)化為數(shù)字信號(hào),然后將這些信號(hào)發(fā)送給另外一些組件,這些組件就是被設(shè)計(jì)用來(lái)控制這些信號(hào)的,所獲取的數(shù)據(jù)將會(huì)作為我們?cè)O(shè)備的輸入。這個(gè)類(lèi)別中包括了攝像機(jī)、聲音傳感器、運(yùn)動(dòng)檢測(cè)傳感器、煙霧傳感器、紅外傳感器以及溫度傳感器等。執(zhí)行器:如果說(shuō)傳感器是提供了環(huán)境中的所有必要信息的感覺(jué)器官,那么執(zhí)行器就是執(zhí)行所有行動(dòng)的肌肉組織。一旦我們做出了一個(gè)行動(dòng)的決定,我們將會(huì)發(fā)出一個(gè)信號(hào)來(lái)命令該要素開(kāi)始工作。這個(gè)類(lèi)別中的典型設(shè)備有警報(bào)器、揚(yáng)聲器、鎖和開(kāi)關(guān)??刂破鳎哼@個(gè)部分就如同系統(tǒng)的大腦。一個(gè)典型的實(shí)例就是微處理器開(kāi)發(fā)板,例如一個(gè)Arduino控制器,它可以存儲(chǔ)并運(yùn)行程序??刂破骺梢越邮崭兄男盘?hào),并對(duì)它們進(jìn)行處理,然后激活并控制執(zhí)行器設(shè)備和警報(bào)器。軟件部分定系統(tǒng)的行為機(jī)制。這個(gè)過(guò)程要依賴軟件資源,也就是你系統(tǒng)中的一套程序,來(lái)進(jìn)行管理。更具體地說(shuō),我們需要編寫(xiě)代碼來(lái)創(chuàng)建自己的程序,并將它們存儲(chǔ)在我們的微處理器芯片中。因此,當(dāng)我們得到了需要的數(shù)據(jù)(例如,用來(lái)檢測(cè)火災(zāi)的室內(nèi)監(jiān)控溫度數(shù)值),對(duì)這些數(shù)據(jù)進(jìn)行了處理(通過(guò)是否超過(guò)了溫度的閾值,來(lái)判斷火災(zāi)的發(fā)生),處理過(guò)程無(wú)需人工干預(yù),然后,著手實(shí)施必要的措施(觸發(fā)警報(bào)并執(zhí)行滅火措施)。在這里我并不會(huì)向你指定具體的一門(mén)編程語(yǔ)言。我們單就軟件部分進(jìn)行討論,隨后將會(huì)深入地研究各種不同的編程語(yǔ)言和應(yīng)用程序(在本書(shū)中,我們將會(huì)使用到很多種編程語(yǔ)言,例如Python)。讀到此處,讀者們應(yīng)該已經(jīng)熟悉了相關(guān)的基本術(shù)語(yǔ)以及系統(tǒng)的組成部分,并對(duì)它的功能有了一定的了解。但是現(xiàn)在你能確切地講出,創(chuàng)建一個(gè)安全系統(tǒng)都需要些什么嗎?在哪里安裝又如何對(duì)其進(jìn)行安裝呢?它是否被安裝在了正確的位置呢?這就需要你先來(lái)對(duì)這個(gè)系統(tǒng)進(jìn)行設(shè)計(jì)。部署安全系統(tǒng)的先決條件如果你正在考慮部署一個(gè)安全系統(tǒng),那么最有可能的原因就是你有這方面的關(guān)鍵需求。因此,在這里最重要的事情就是要準(zhǔn)確地確定這種需求。如果做不到這一點(diǎn),我們最終會(huì)步入歧途并造成損失或者導(dǎo)致半途而廢。如果并沒(méi)有這種需求,你只是擁有著一顆對(duì)現(xiàn)代科技勇于探索的心,那么你可能是出于學(xué)習(xí)和娛樂(lè)的目的來(lái)設(shè)計(jì)這個(gè)系統(tǒng),或者試圖將自己的家打造成一個(gè)現(xiàn)代化的場(chǎng)所。你可以瀏覽一下這個(gè)行業(yè)的先進(jìn)企業(yè)的網(wǎng)站以獲得參考。我們可以看到,大多數(shù)企業(yè)的系統(tǒng)是類(lèi)似的,只是在某些部分存在一些差異,而這些差異大多是源于客戶的需求。舉個(gè)例子,許多系統(tǒng)都使用了相同的或者相類(lèi)似的電子元件,那么它們的區(qū)別在哪里呢?就在于圖形化用戶界面(GraphicalUserInterface,GUI)的細(xì)節(jié)。對(duì)于系統(tǒng)而言,圖形化用戶界面就如同我們每個(gè)人的臉一樣,它的設(shè)計(jì)同樣也要考慮到最終用戶的方便易用。如果你設(shè)計(jì)了一套任何人都無(wú)法理解和控制的程序,結(jié)局只能是徒勞無(wú)功。一旦你在腦海中有了一個(gè)設(shè)計(jì)思路,那么下一步就是考慮你要安裝的系統(tǒng)所在的環(huán)境,此外,還要考慮到你所能利用到的物資資源以及所能投入的經(jīng)濟(jì)成本。這些事情看起來(lái)可能很簡(jiǎn)單,可你搜集的信息越多,工作起來(lái)的時(shí)候就會(huì)越順利。這里舉一個(gè)說(shuō)明性的例子,就是必須弄清楚光源、管道以及提供給我們網(wǎng)絡(luò)接入的布局。當(dāng)你掌握了這些布局情況后,就可以很容易地構(gòu)建我們的項(xiàng)目了。說(shuō)到這本書(shū)所使用的材料,我們采用了一款最為著名的Arduino模塊——ArduinoUNO的3.0版本。在下一章中,我們將會(huì)對(duì)它進(jìn)行更多的了解。需要的其他材料也都是隨處可見(jiàn)并且價(jià)格低廉的,它們當(dāng)中很多都是由免費(fèi)的硬件或者開(kāi)源的硬件(本身也都是很便宜的資源)所創(chuàng)建的。因此,如果你愿意的話,可以使用相對(duì)裝配模塊而言成本極為低廉的方案在家中建立一個(gè)這樣的系統(tǒng)。如果想獲得關(guān)于免費(fèi)硬件更多的信息,請(qǐng)?jiān)L問(wèn)如下網(wǎng)址:\h/wiki/Opensource_hardware在當(dāng)前條件下要為安全系統(tǒng)做的準(zhǔn)備當(dāng)你選定了安裝的地址之后,這里就有許多的因素(甚至要考慮到周邊行人)需要你進(jìn)行考慮,以此來(lái)保證系統(tǒng)組件的安全性、完整性以及可靠性。只需要一個(gè)連接的配備條件下,你可以將Arduino板和其他的一些模塊放入墻體的變電箱中。如果你的環(huán)境中不具備使用電源的條件,或者想要一個(gè)后備系統(tǒng)(例如一個(gè)UPS[不間斷電源]),可以選擇可充電式鋰離子(Li-ion)電池,甚至太陽(yáng)能電池板來(lái)作為系統(tǒng)的能源等。警告:無(wú)論在什么時(shí)候使用電池,你都需要考慮到極端的溫度會(huì)對(duì)電池產(chǎn)生的影響,例如電池電流承載能力降低,在低溫情況下電池放電能力的減弱,高溫帶來(lái)的熱損壞風(fēng)險(xiǎn),以及在某些極端情況下可能會(huì)有爆炸風(fēng)險(xiǎn)。同樣地,我們也必須要小心濕氣、水凝結(jié)和露水,這些都可能會(huì)對(duì)我們的基礎(chǔ)設(shè)施產(chǎn)生破壞。這里建議你最好能保證網(wǎng)絡(luò)的連接,倒不一定是必須要連接到互聯(lián)網(wǎng)上。如果連接到了一臺(tái)內(nèi)部網(wǎng)絡(luò)的路由器上,通過(guò)這個(gè)連接你可以訪問(wèn)每一個(gè)獨(dú)立的部分,修改它們的設(shè)置或者訪問(wèn)它們的服務(wù)(例如,一個(gè)用戶圖形界面顯示警報(bào)是否已經(jīng)觸發(fā))。能是由于我們連續(xù)地使用某些技術(shù)設(shè)備產(chǎn)生的。這些設(shè)備以不同的頻率向外發(fā)射電磁輻射,而這些電磁輻射可能會(huì)導(dǎo)致系統(tǒng)的行為被改變。另一方面,如果安裝是在室外進(jìn)行的,你應(yīng)該對(duì)設(shè)備進(jìn)行妥善的安置,以使得它們免于惡劣天氣(例如閃電以及接地)的傷害。所有這一切都可以摧毀系統(tǒng)的電路,而且也會(huì)給人身安全帶來(lái)危險(xiǎn)。最后,我必須指出一點(diǎn),如果你在家里養(yǎng)了寵物的話,那么在你安裝那些價(jià)格可能十分昂貴的傳感器和執(zhí)行器的時(shí)候,一定要加倍小心。這些設(shè)備很有可能會(huì)被破壞,而針對(duì)它們的修復(fù)工作是十分困難的。另外,如果你的設(shè)備沒(méi)有選好合適的定位,那么可能每當(dāng)你的狗或者貓穿過(guò)花園的時(shí)候,都可能會(huì)激活報(bào)警系統(tǒng)。請(qǐng)牢牢記住,要定期對(duì)設(shè)備進(jìn)行維護(hù)。這里建議你最好在日程表中預(yù)留一些時(shí)間來(lái)專(zhuān)門(mén)執(zhí)行系統(tǒng)的維護(hù)。有線以及無(wú)線安全系統(tǒng)中被深入地討論,這個(gè)設(shè)備適合在很多地方進(jìn)行放置,并能快速地進(jìn)行安裝(在環(huán)境中部署線路)。多都相當(dāng)接近。目前最受歡迎的無(wú)線技術(shù)Wi-Fi和藍(lán)牙所使用的頻段都是2.4GHz,考慮到都會(huì)成為通信的障礙。如果你想獲得更多的相關(guān)信息,建議訪問(wèn)負(fù)責(zé)監(jiān)管這些技術(shù)標(biāo)準(zhǔn)的組織IEEE的官方網(wǎng)站:\h/的普通線路。這里有一些措施(例如X10技術(shù)),可以實(shí)現(xiàn)一棟建筑內(nèi)的所有房間的互聯(lián),只需要它們的電源相數(shù)相同即可。X10技術(shù)可以使用電力線路來(lái)傳送信號(hào)以及進(jìn)行控制操作。這種部署方案的缺點(diǎn)主要在于初期的經(jīng)濟(jì)投入。注意:如果你想獲得更多關(guān)于X10技術(shù)的相關(guān)信息請(qǐng)?jiān)L問(wèn)如下網(wǎng)址:\h/wiki/X10_(industry_standard)傳統(tǒng)系統(tǒng)與現(xiàn)代化的家居安全系統(tǒng)的比較最后,我們將給出一個(gè)傳統(tǒng)系統(tǒng)與現(xiàn)代化系統(tǒng)之間的比較,值得指出的是,在面對(duì)不同需求的時(shí)候,它們各自都有著特定的用處,這些需求例如減少模型的復(fù)雜性,提高系統(tǒng)的可靠性,增加系統(tǒng)可用性以及向開(kāi)發(fā)者提供豐富的信息。以前,如果綜合考慮到多種因素,例如價(jià)格、技術(shù)的成熟度以及現(xiàn)有的基礎(chǔ)設(shè)施(連接)等,以一個(gè)較低的成本來(lái)實(shí)現(xiàn)一個(gè)可以實(shí)時(shí)管理的系統(tǒng)幾乎是不可能的。的一個(gè)系統(tǒng)變成現(xiàn)實(shí)。更進(jìn)一步地說(shuō),你甚至可以利用擁有更強(qiáng)大處理能力的云計(jì)算系統(tǒng),這種方案可以真正的實(shí)現(xiàn)零維護(hù)。在這里我還要補(bǔ)充一點(diǎn),只需要具備基本的編程和電子方面的知識(shí),就可以完成系統(tǒng)的安裝、維護(hù)和遷移。如果有一天你要搬家了,你可以輕松地將系統(tǒng)中最重要的設(shè)備帶走并再次利用。最后一點(diǎn),你在世界上的任何地方都可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問(wèn)。只需要在智能手機(jī)上安裝一個(gè)簡(jiǎn)單易用的應(yīng)用程序,你就可以檢查家中的所有事務(wù)是否井然有序。因此,可以這樣說(shuō),如今我們擁有了更智能、更經(jīng)濟(jì)的系統(tǒng)。這些系統(tǒng)運(yùn)行速度更快,也為我們的家庭和環(huán)境提供了更大的安全保障。小結(jié)在這一章的學(xué)習(xí)中,本書(shū)詳細(xì)地介紹了一個(gè)安全家居系統(tǒng)的各個(gè)部分,但是并沒(méi)有涉及相關(guān)的任何具體設(shè)備。通過(guò)理論講解的方式,我們了解了系統(tǒng)的組成部分以及它們各自的功能。在擁有了這些知識(shí)之后,我們已經(jīng)做好了在下一章中深入學(xué)習(xí)的準(zhǔn)備了。我可以向你保證,下一章中內(nèi)容將會(huì)是引人入勝的。在下一章中,我們將了解Arduino的概念和歷史,以及ArduinoUno的各個(gè)組成部分。同樣我們也將學(xué)習(xí)到它們的工作方式,以及如何使用shield對(duì)ArduinoUNO進(jìn)行擴(kuò)展。第2章 Arduino與ArduinoIDE入門(mén)在這一章中,我們將會(huì)介紹如下的內(nèi)容:ArduinoUNO的介紹Arduino開(kāi)發(fā)板項(xiàng)目實(shí)施中的安全預(yù)防措施Arduino集成開(kāi)發(fā)環(huán)境(IntegratedDevelopmentEnvironment,IDE)編寫(xiě)第一個(gè)Arduino程序——“HelloWorld”P(pán)ython編程語(yǔ)言和Arduino在經(jīng)過(guò)了上一章中對(duì)家居安全系統(tǒng)簡(jiǎn)單的學(xué)習(xí)之后,我們現(xiàn)在即將進(jìn)入神奇而又強(qiáng)大的Arduino世界。隨著本章內(nèi)容的展開(kāi),我們將會(huì)一步步地了解到Arduino的特點(diǎn)、編程環(huán)境以及它那強(qiáng)大的功能。在這一章中,我們還將會(huì)介紹創(chuàng)建自己的第一個(gè)Arduino程序。不過(guò)在此之前,我們首先還是先來(lái)了解一下ArduinoUNO。Arduino項(xiàng)目最初于2005年在意大利的伊夫雷亞被設(shè)計(jì)并開(kāi)發(fā)出來(lái),最初是為了給學(xué)生在開(kāi)發(fā)項(xiàng)目時(shí)提供一種價(jià)格低廉而又性能優(yōu)越的開(kāi)發(fā)板。在Arduino平臺(tái)出現(xiàn)以前,市面上并沒(méi)有性價(jià)比如此優(yōu)越的同類(lèi)產(chǎn)品。Arduino平臺(tái)具有極大的優(yōu)勢(shì),它具備了多種功能,成本又十分低廉,價(jià)格不超過(guò)30美元,對(duì)于所有人而言開(kāi)發(fā)都十分簡(jiǎn)單,即使你完全沒(méi)有專(zhuān)業(yè)方面的知識(shí)也可以輕松掌握,學(xué)習(xí)效果十分理想。另外,Arduino所使用的編程語(yǔ)言是基于C#(C-Sharp)。在Arduino出現(xiàn)之前,我們建立系統(tǒng)可不是一件簡(jiǎn)單的事。例如,我們建立一個(gè)簡(jiǎn)單的發(fā)光系統(tǒng),它的功能是每隔固定的一段時(shí)間就閃爍一次。那么我們必須使用一種特定的芯片并對(duì)其進(jìn)行處理,使得這個(gè)芯片可以按照要求來(lái)控制燈的閃爍。另外,我們還需要手動(dòng)的將這個(gè)芯片焊接到一個(gè)PCB上。Arduino的軟件和硬件自從推出就一直遵循著開(kāi)源的原則。尤其是Arduino的開(kāi)源硬件,得到了社會(huì)各界的認(rèn)可并直接促進(jìn)了硬件廠商的技術(shù)變革。借助于互聯(lián)網(wǎng)的傳播,Arduino在短短的10年成長(zhǎng)過(guò)程中已經(jīng)成為了世界上最流行的開(kāi)發(fā)板產(chǎn)品。需要注意的是,目前世界上有很多家的廠商都在生產(chǎn)Arduino開(kāi)發(fā)板,例如Adafruit、SparkFun等,當(dāng)然Arduino本身也提供這些產(chǎn)品。因此,你經(jīng)常會(huì)發(fā)現(xiàn)一些不同品牌的開(kāi)發(fā)板卻有著相同的設(shè)計(jì)。Arduino的成功得益于其優(yōu)秀的開(kāi)源措施。Arduino的開(kāi)發(fā)團(tuán)隊(duì)鼓勵(lì)所有人去查看和下載他們的設(shè)計(jì)圖紙,參與對(duì)Arduino的學(xué)習(xí)和研究,將資料進(jìn)行分享或者使用Arduino和其他設(shè)備聯(lián)合工作。隨著Arduino相關(guān)的開(kāi)源社區(qū)和開(kāi)源論壇的完善,你可以隨時(shí)從這里獲得知識(shí)和解除疑惑。這里推薦一個(gè)由MassimoBanzi在TED-Talks上錄制的關(guān)于Arduino短片,你可以訪問(wèn)如下地址進(jìn)行查看:\hhttp://youtube/UoBUXOOdLXYArduino開(kāi)發(fā)板從現(xiàn)在開(kāi)始,我們將開(kāi)始講述Arduino的特性,Arduino的標(biāo)識(shí)如圖2-1所示。下面列舉了開(kāi)發(fā)板的一些性質(zhì),我們可以根據(jù)這些性質(zhì)作為標(biāo)準(zhǔn)來(lái)對(duì)其進(jìn)行分類(lèi):所擁有輸入/所使用的芯片類(lèi)型系列Intel規(guī)格用途連接類(lèi)型前面給出的分類(lèi)標(biāo)準(zhǔn)并不是絕對(duì)的,但是這些標(biāo)準(zhǔn)可以幫助我們快速對(duì)各種開(kāi)發(fā)板有一個(gè)大概的認(rèn)識(shí),從而根據(jù)自身的需求做出最適合的選擇。當(dāng)然,正如前文所提到的,所有的開(kāi)發(fā)板都是基于相同的原理,從一個(gè)到另外一個(gè)并不會(huì)有太大的差異。下面列舉了當(dāng)前市場(chǎng)上流行的開(kāi)發(fā)板。圖2-1Arduino的標(biāo)識(shí)ArduinoMEGA這種開(kāi)發(fā)板擁有數(shù)目眾多的輸入輸出引腳,用來(lái)實(shí)現(xiàn)和大量的傳感器或者執(zhí)行器的互聯(lián),這樣就無(wú)需再使用復(fù)用器之類(lèi)進(jìn)行信號(hào)交換的設(shè)備。使用MEGA作為開(kāi)發(fā)板的優(yōu)勢(shì)在于,在無(wú)需擴(kuò)展板的情況下,我們就可以通過(guò)它來(lái)控制大量的硬件。MEGA經(jīng)常應(yīng)用在氣象站和3D打印機(jī)等場(chǎng)合。ArduinoNANOArduinoNANO是這個(gè)系列開(kāi)發(fā)板中體積最小的一種。由于體積上的優(yōu)勢(shì),ArduinoNANO可以輕易地被集成到任何已建成的裝置中,從而為其提供新的屬性。對(duì)于一些對(duì)計(jì)算能力要求不強(qiáng)的系統(tǒng),ArduinoNANO是十分理想的智能模塊,它擁有著極低的功耗(5V)和較輕的重量。它擁有一個(gè)microUSB接口,所有的輸出接口都設(shè)計(jì)在了開(kāi)發(fā)板的背面(我們可以通過(guò)電纜或者焊接的方式對(duì)其進(jìn)行連接)。ArduinoNANO在一些受到環(huán)境限制的最終解決方案(例如無(wú)人機(jī)或者火箭)中是極為理想的。ArduinoETHERNET這個(gè)開(kāi)發(fā)板和ArduinoUNO十分相似,它的優(yōu)勢(shì)在于擁有一個(gè)以太網(wǎng)接口。如果以前一直使用有線連接,那么現(xiàn)在是時(shí)候來(lái)考慮一下無(wú)線連接的方案了。IntelGALILEOIntelGalileo是一款使用了英特爾處理器的新型開(kāi)發(fā)板。它擁有一個(gè)以太網(wǎng)接口,兩個(gè)microUSB(雙向)接口,一個(gè)多功能的輸入輸出接口。利用這個(gè)接口可以實(shí)現(xiàn)多個(gè)開(kāi)發(fā)板的集群工作,而每一個(gè)開(kāi)發(fā)板本身都可以作為一個(gè)獨(dú)立單元來(lái)工作。ArduinoUNOArduinoUNO(如圖2-2所示)是目前市面上通用性最好使用范圍最廣的開(kāi)發(fā)板,大小適中的特點(diǎn)使得它幾乎可以部署在任何的環(huán)境中。乍一看這個(gè)開(kāi)發(fā)板似乎很簡(jiǎn)單,但是,它擁有著大量的擴(kuò)展模塊,例如Wi-Fi、藍(lán)牙、NFC和I/O擴(kuò)展模塊板,這個(gè)特點(diǎn)使得ArduinoUNO可以滿足我們?cè)诟鞣矫娴男枨蟆_@使得ArduinoUNO成為了一款極為靈活的微處理器。在目前的市場(chǎng)上,ArduinoUNO得到了開(kāi)發(fā)者們最大的支持。圖2-2 ArduinoUNO(Fritzing工具)ArduinoUNO開(kāi)發(fā)板上包含了13個(gè)數(shù)字接口、6個(gè)模擬接口、一個(gè)5V和一個(gè)3.3V的電源引腳。另外它還有一個(gè)可以更換的ATmega328芯片,這個(gè)特性使得將來(lái)對(duì)其進(jìn)行升級(jí)和修理都成為可能。技巧:在某些情況下,你可以拔下微控制器芯片,然后將Arduino開(kāi)發(fā)板作為一個(gè)串行端口適配器,但是這個(gè)技術(shù)在本書(shū)中并沒(méi)有詳細(xì)介紹(注意:如果你這么做的話,可能要冒著設(shè)備被損壞的風(fēng)險(xiǎn))。當(dāng)芯片被移除以后,我們將會(huì)使用引腳0(RX)和1(TX)。想獲得有關(guān)于開(kāi)發(fā)板的規(guī)格、功能的更多信息或想購(gòu)買(mǎi)各種開(kāi)發(fā)板,你可以訪問(wèn)如下鏈接:http://www.arduino.cc/en/pmwiki.php?n=Main/Boards\hhttp://store.arduino.cc/https://\h/https://\h/安全注意事項(xiàng)孩子們也可以參與到本書(shū)的實(shí)例中。但是至關(guān)重要的一點(diǎn)是,孩子們不可以獨(dú)立完成這些任務(wù),這一切必須在一個(gè)負(fù)責(zé)任的成年人的監(jiān)督下來(lái)進(jìn)行,整個(gè)過(guò)程中要嚴(yán)格遵守安全措施。盡管我們使用的組件都工作在一個(gè)很微弱的電壓下,通常在3.3V到5V之間,但是疏忽或者某些技術(shù)的不當(dāng)使用同樣會(huì)給使用者帶來(lái)危險(xiǎn)。因此,建議你要遵守如下的注意事項(xiàng)。始終保持干凈、整潔的工作環(huán)境。在使用電器或者進(jìn)行加熱操作的時(shí)候,你一定要遠(yuǎn)離可燃物品。要知道一個(gè)裝滿了油漆或者化學(xué)藥品的倉(cāng)庫(kù)可不是一個(gè)能進(jìn)行焊接的地點(diǎn)。對(duì)于孩子來(lái)說(shuō),Arduino可以算是一個(gè)完美的選擇,它不需要進(jìn)行線路焊接。但是要注意Arduino包含了許多的細(xì)小的零件,因此一定要小心處理。如果你工作在一個(gè)高電壓的環(huán)境下,在對(duì)任何模塊和組件進(jìn)行操作時(shí)一定要記得關(guān)閉電源。還有一定要注意的一點(diǎn)是,盡量保護(hù)你項(xiàng)目中使用的材料,不要使其受到惡劣天氣的影響。在最終安裝設(shè)備之前,一定要進(jìn)行長(zhǎng)時(shí)間的測(cè)試(這樣做是為了保證組件在運(yùn)行過(guò)程中的穩(wěn)定性和安全性)。如果你在項(xiàng)目的哪個(gè)環(huán)節(jié)卡住了或者不了解自己現(xiàn)在正在做什么,又或者對(duì)某個(gè)環(huán)節(jié)產(chǎn)生了疑問(wèn),那么有很多的方法來(lái)解決這些問(wèn)題。首先你可以嘗試通過(guò)上互聯(lián)網(wǎng)(這里有很多的制造商論壇)來(lái)尋找問(wèn)題的解決方案,又或者你可以研究項(xiàng)目的裝配簡(jiǎn)圖來(lái)對(duì)其進(jìn)行分析。如果你十分了解這些設(shè)備的原理,你還可以使用萬(wàn)用表來(lái)解決一些問(wèn)題。但是人非圣賢,孰能無(wú)過(guò),那些將自己的設(shè)計(jì)上傳到網(wǎng)絡(luò)的人也同樣會(huì)出錯(cuò)誤。如果你選擇了別人的設(shè)計(jì),在這里還是要建議你盡量聯(lián)系到設(shè)計(jì)者,以獲得更詳細(xì)的設(shè)計(jì)信息。這將幫助你對(duì)設(shè)計(jì)有更多的了解,同時(shí)也確保了你能搞清楚為什么這個(gè)設(shè)計(jì)可以工作起來(lái),以及這個(gè)設(shè)計(jì)是如何工作的。ArduinoIDE我們現(xiàn)在介紹ArduinoIDE的安裝過(guò)程。安裝在完成了對(duì)相關(guān)概念的理解之后,我們就要開(kāi)始步入實(shí)踐環(huán)節(jié)中了。你將使用到ArduinoUNO,一個(gè)USB的A型公頭對(duì)B型母頭轉(zhuǎn)接線,一臺(tái)個(gè)人計(jì)算機(jī)或者一個(gè)樹(shù)莓派。接下來(lái),我們將介紹在各種操作系統(tǒng)下ArduinoIDE的安裝步驟。這些不同系統(tǒng)的安裝過(guò)程具有一定的復(fù)雜性,因此在處理時(shí)應(yīng)該十分仔細(xì)(關(guān)于其他的發(fā)布版的安裝信息或者在安裝的過(guò)程中遇到的麻煩,你可以通過(guò)閱讀在線操作指南來(lái)查詢或解決)。如果你需要下載ArduinoIDE,可以訪問(wèn):\hhttp://arduino.cc/en/Main/Software在Windows操作系統(tǒng)上安裝IDE如果想在Windows操作系統(tǒng)上安裝ArduinoIDE,你必須先獲得系統(tǒng)的管理員權(quán)限。在成功取得了必需的管理權(quán)限之后,你就可以按照如下步驟進(jìn)行安裝操作了。將安裝文件下載到桌面上,并對(duì)其進(jìn)行解壓縮操作。雙擊運(yùn)行可執(zhí)行文件(.exe文件)。當(dāng)安裝過(guò)程結(jié)束后,你就可以將這個(gè)模塊連接到你的計(jì)算機(jī)上了。在Mac操作系統(tǒng)上安裝IDE如果想在Mac操作系統(tǒng)上安裝ArduinoIDE,你必須先獲得系統(tǒng)的管理權(quán)限。在成功取得了必需的管理權(quán)限之后,你就可以按照如下步驟進(jìn)行安裝操作了。將安裝文件下載到桌面上,并對(duì)其進(jìn)行解壓縮操作。運(yùn)行.dmg安裝文件并按照屏幕中的指示進(jìn)行操作。當(dāng)安裝過(guò)程結(jié)束后,你就可以將這個(gè)模塊連接到你的Mac計(jì)算機(jī)上了。GNU-Linux(Debian-Ubuntu)如果想在Linux操作系統(tǒng)上安裝ArduinoIDE,你可以按照如下步驟進(jìn)行安裝操作。在你確認(rèn)了自己擁有超級(jí)用戶的權(quán)限(命令之前都會(huì)有一個(gè)美元符號(hào)($))后,打開(kāi)一個(gè)終端窗口,運(yùn)行如下的命令:George:~$sudoapt-getupdate //更新存儲(chǔ)庫(kù)George:~$<strong>sudoapt-getinstallarduino</strong> //下載并安George:~$echo$? //測(cè)試在最后一個(gè)命令輸入完成之后,如果屏幕上輸出了一個(gè)字符0功完成。如果不成功的話,請(qǐng)?jiān)俅巫屑?xì)執(zhí)行前面的步驟。如果錯(cuò)誤仍然存在,請(qǐng)參閱Arduino網(wǎng)站上的官方指南。Linux發(fā)行版,而這些發(fā)行版并不含有高級(jí)程序包工具(AdvancedPackageTool,APT)。那么你可以從Arduino的網(wǎng)站下載一個(gè)官方的.tgz庫(kù)文件,然后執(zhí)行以下步驟:George:~$tarxvzf(filename.tgz) //解壓縮文George:~$cdArduino-1.X.Y… //修改文件目錄George:~$./arduino //測(cè)試使用ArduinoIDE開(kāi)始工作在成功地安裝了ArduinoIDE之后,讓我們來(lái)繼續(xù)了解它的各個(gè)組成部分,并逐步熟悉如何利用ArduinoIDE來(lái)配置ArduinoUno。當(dāng)然,首先必須將ArduinoUno和你的計(jì)算機(jī)連接到一起。接下來(lái),按照如下步驟來(lái)配置IDE。所示,首先要在IDE窗口最頂端的導(dǎo)航欄處選中Tools選項(xiàng),然后在Tools下拉菜單中選中Board,在Board的下一級(jí)菜單中選中ArduinoUNO。圖2-3 在ArduinoIDE中選中ArduinoUNO然后,還是在最頂端的導(dǎo)航欄處選中Tools選項(xiàng),然后在Tools下拉菜單中選中SerialPort,這表示我們?cè)谶@里選擇使用串口來(lái)連接ArduinoUno。如果選中的端口不能工作的被一個(gè)連接到了你計(jì)算機(jī)上的真實(shí)或者虛擬設(shè)備占用。到此為止,我們成功建立了用來(lái)進(jìn)行項(xiàng)目開(kāi)發(fā)的軟件工作環(huán)境。怎么樣,很簡(jiǎn)單吧?如果你之前有過(guò)其他微控制器開(kāi)發(fā)的經(jīng)驗(yàn),那么你一定會(huì)發(fā)現(xiàn)Arduino開(kāi)發(fā)環(huán)境的搭建多么容易。接下來(lái)我們來(lái)介紹這個(gè)界面友好的開(kāi)發(fā)環(huán)境的詳細(xì)信息,如圖2-4所示。在界面的上方,你可以看到一個(gè)綠色的圖形化工具條,它包含了6個(gè)小圖標(biāo),第一個(gè)圖標(biāo)是對(duì)勾,最后一個(gè)圖標(biāo)是一個(gè)放大鏡。下面是這些圖標(biāo)的詳細(xì)功能。編譯(Verify):這個(gè)操作負(fù)責(zé)在代碼載入到芯片之前對(duì)其進(jìn)行檢查,并對(duì)這些代碼進(jìn)行編譯,將這些代碼轉(zhuǎn)化為一種機(jī)器可以理解的語(yǔ)言。上傳(Upload):這個(gè)選項(xiàng)可以將代碼燒錄到ArduinoUNO上。新建程序(New):使用這個(gè)選項(xiàng),你可以打開(kāi)一個(gè)空白的項(xiàng)目文件,然后在文件中編寫(xiě)新的代碼。打開(kāi)程序(Open):使用這個(gè)選項(xiàng),你可以打開(kāi)一個(gè)保存在計(jì)算機(jī)中的代碼文件。保存程序(Save):使用這個(gè)選項(xiàng),你可以用來(lái)保存你編寫(xiě)完的代碼文件。串口監(jiān)視器(SerialMonitor):這是最常用的選項(xiàng)之一,通過(guò)它可以實(shí)現(xiàn)計(jì)算機(jī)和Arduino開(kāi)發(fā)板之間的通信。一般而言,它是一個(gè)可以記錄向ArduinoUNO發(fā)送和從ArduinoUNO接收信息的界面。圖2-4 ArduinoIDE的細(xì)節(jié)在白色的畫(huà)布部分可以輸入項(xiàng)目的代碼,隨后我們將講解代碼,并對(duì)代碼進(jìn)行檢查和編譯,然后將其發(fā)送到ArduinoUno。最后的一部分是屏幕最下方的控制臺(tái)(黑色盒狀區(qū)域),這是一個(gè)調(diào)試用的工具。如果某些代碼中出現(xiàn)了錯(cuò)誤,它將會(huì)在這里被顯示出來(lái)以便我們發(fā)現(xiàn)。HelloWorld現(xiàn)在是時(shí)候來(lái)開(kāi)始學(xué)習(xí)和Arduino相對(duì)應(yīng)的軟件/代碼部分了。ArduinoUNO允許你使用多種編程語(yǔ)言來(lái)進(jìn)行項(xiàng)目的開(kāi)發(fā),但是如果你此前對(duì)編程開(kāi)發(fā)并不熟悉或者現(xiàn)在想采用一種快速而簡(jiǎn)潔的編程解決方案,在這里我推薦你采用項(xiàng)目本身自帶的Arduino語(yǔ)言(這是一種過(guò)程語(yǔ)言演變而來(lái)的語(yǔ)言)。一個(gè)程序的結(jié)構(gòu)如下所示,它將作為我們今后程序的范例://這一行是一個(gè)注釋語(yǔ)句,ArduinoIDE并不會(huì)編譯這句代碼//我們必須使用注釋來(lái)保證代碼的可讀性#includeNAMELIBRARY //將NAMELIBRARY庫(kù)文件添加到項(xiàng)目中voidsetup(){ //函數(shù)入口,運(yùn)行一次//準(zhǔn)備設(shè)置Arduino的輸入輸出引腳pinMode(10,OUTPUT); //將10引腳設(shè)置為輸出引pinMode(11,INPUT); //將11引腳設(shè)置為輸入引腳}voidloop(){ //在函數(shù)"setup"完成后開(kāi)始執(zhí)行//迭代執(zhí)行多次}到此為止,我們已經(jīng)有了足夠的知識(shí)儲(chǔ)備來(lái)創(chuàng)建一個(gè)小型的程序。如果愿意,你可以通過(guò)IDE環(huán)境自帶的一些代碼范例來(lái)進(jìn)行學(xué)習(xí)。查看這些代碼的方法是:首先選擇File選項(xiàng),然后在下拉菜單中選擇Examples選項(xiàng),在彈出的對(duì)話框中選中目錄C:\ProgramFiles(x86)\Arduino\examples\,就可以打開(kāi)并查看實(shí)驗(yàn)項(xiàng)目的源代碼(前提是你已經(jīng)擁有了實(shí)例中所使用的必備硬件)。下面就是一個(gè)用于ArduinoUno的基礎(chǔ)代碼實(shí)例://我的第一個(gè)Arduino項(xiàng)目voidsetup(){Serial.begin(9600);//打開(kāi)串行端口}voidloop(){delay(1000);//等待1秒=1000毫秒Serial.print("Hello,I'mArduino\n");//輸出“Hello...”//"\n"相當(dāng)于ENTER鍵}前面的例子展示了一個(gè)用來(lái)打開(kāi)串行端口(如圖2-5所示),并等待1000毫秒的簡(jiǎn)單任務(wù)。在任務(wù)的最后打印輸出了一句話“Hello,I'mArduino”。圖2-5 Arduino串行接口——輸出Python和Arduino在了解了串行接口的工作原理之后,我們的學(xué)習(xí)將邁上一個(gè)新的臺(tái)階?,F(xiàn)在我們使用Python編程語(yǔ)言(Python的標(biāo)識(shí)如圖2-6所示)和ArduinoUNO進(jìn)行交互,在這個(gè)過(guò)程中將不會(huì)使用到串行監(jiān)視器。圖2-6 Python的標(biāo)識(shí)這里先對(duì)Python語(yǔ)言做一個(gè)簡(jiǎn)短的回顧,它是一門(mén)解釋型的語(yǔ)言,這門(mén)語(yǔ)言的設(shè)立宗旨就是增加代碼的可讀性,使其具備模塊化、靈活性以及多用性的特點(diǎn)。使用Python語(yǔ)言,我們可以完成數(shù)學(xué)運(yùn)算,對(duì)復(fù)雜的方程式求解,創(chuàng)建圖形化的界面,甚至可以將它應(yīng)用于聲音和圖像方面。這是一門(mén)十分優(yōu)秀的編程語(yǔ)言,所以真的很難用三言兩句就講清楚,這也是我向你推薦多閱讀一些Python相關(guān)書(shū)籍的原因。如果你是剛剛接觸到這種語(yǔ)言的話,請(qǐng)?jiān)L問(wèn)https://www.python.org/來(lái)獲得關(guān)于Python的基本思想作為這個(gè)項(xiàng)目的開(kāi)始。在本節(jié)中,你需要首先了解安裝Python2.7的細(xì)節(jié),并熟悉控制臺(tái)或者圖形化環(huán)境的使用。如果這是你第一次聽(tīng)到這些內(nèi)容,也不用為此擔(dān)心,之前給出的鏈接中提供了簡(jiǎn)明的教程和學(xué)習(xí)指南,相信這些內(nèi)容可以使你快速地開(kāi)始學(xué)習(xí)并持續(xù)提高開(kāi)發(fā)能力。PySerial從PySerial官方網(wǎng)站下載壓縮文件:/pypi/pyserial(注意Linux操作系統(tǒng)對(duì)應(yīng)的版本為pyserial-2.7.tar.gz,Windows操作系統(tǒng)對(duì)應(yīng)的版本為pyserial-2.7.win32.exe)??梢园凑杖缦碌牟襟E來(lái)安裝PySerial。在Windows操作系統(tǒng)環(huán)境下,雙擊執(zhí)行.exe文件然后按照屏幕上的提示完成安裝的過(guò)程。在Mac/Linux操作系統(tǒng)環(huán)境下,你需要下載并解壓正確的安裝文件。在終端中使用如下的命令來(lái)解壓文件:tarxfvz/Downloads/pyserial-2.6.tar.gz使用如下的命令來(lái)更改目錄并進(jìn)行安裝:cdpyserial-2.6sudopythonsetup.pyinstallArduino代碼現(xiàn)在,我們將再次利用那個(gè)通過(guò)串行接口實(shí)現(xiàn)周期性打印消息的Arduino代碼。Python代碼我們將創(chuàng)建一段Python代碼,這段代碼從同一個(gè)串行接口接收消息。下面就是這段代碼:#Thisisacommentfromtimeimportsleepimportserialport=serial.Serial('/dev/…',9600)#"…"Putyourserialport#rememberyoucanknowitintheArduino-IDE#gotoTools>SerialPortwhileTrue:#Entersaloopinwhichhearsevery0.2secondsprintport.readline()sleep(0.2)你可以使用你最喜愛(ài)的文本編輯器來(lái)創(chuàng)建這段程序,并將它以serialpython.py為名保存。$pythonSerialPython.py這個(gè)程序執(zhí)行后將會(huì)得到如下的輸出:HELLOSERIALHELLOSERIALHELLOSERIAL小結(jié)現(xiàn)在我們已經(jīng)到達(dá)了這個(gè)章節(jié)的最后部分了。在本章中,我們走進(jìn)了神奇的Arduino世界,了解了它的各個(gè)組成部分,學(xué)習(xí)了如何進(jìn)行安全措施的管理,安裝了開(kāi)發(fā)環(huán)境并創(chuàng)建了我們的第一個(gè)Arduino程序。這一章是十分重要的,所以,在開(kāi)始后面幾章的學(xué)習(xí)前,一定要先確保你已經(jīng)徹底理解了本章的概念。好了,如果你已經(jīng)準(zhǔn)備好了,那么我們就開(kāi)始下一章的學(xué)習(xí)。在下一章中,你將步入傳感器的世界。第3章 從代碼到真實(shí)世界當(dāng)你掌握了在前面章節(jié)中講到的內(nèi)容之后,我們可以開(kāi)始增長(zhǎng)新的見(jiàn)識(shí)了。如設(shè)備的接口信息和工作原理,以及用來(lái)驗(yàn)證概念的必要組件的信息。在本章的最后部分,我們還將講解到強(qiáng)大的NFC技術(shù)。通過(guò)NFC技術(shù),我們可以提高Python腳本的能力。在本章中,我們將從以下幾個(gè)方面來(lái)開(kāi)展學(xué)習(xí):ProtoBoards和接線信號(hào)(數(shù)字和模擬端口數(shù)據(jù)手冊(cè)ProtoBoards和接線在使用電子組件進(jìn)行實(shí)驗(yàn)和研究的時(shí)候,你有很多種可行的方案可以選擇。其中一個(gè)很不錯(cuò)的方案就是使用ProtoBoard(也稱為面包板)。使用面包板有一個(gè)很強(qiáng)大的優(yōu)勢(shì),那就是我們可以在不進(jìn)行焊接操作的情況下,就對(duì)它的組件和原型電路進(jìn)行測(cè)試。這樣做的好處很多,比如你可以反復(fù)利用同一組件,實(shí)現(xiàn)系統(tǒng)的快速開(kāi)發(fā),一旦發(fā)生錯(cuò)誤可以很容易地修改,輕松完成系統(tǒng)的升級(jí)改進(jìn)。從外觀上看,ProtoBoard像是一個(gè)長(zhǎng)方形的盒子,它由一些排成行和列且內(nèi)部互相聯(lián)系的小插孔組成,有幾組小插孔可以互相連接。這些孔通過(guò)插入組件的引腳來(lái)完成安裝。ProtoBoard可以被看作是邁向最終的PCB成品設(shè)計(jì)的階梯,這個(gè)階梯可以幫助你消除系統(tǒng)的錯(cuò)誤,降低開(kāi)發(fā)的成本。相關(guān)的更多信息請(qǐng)?jiān)L問(wèn)\h/wiki/breadboard。使用面包板進(jìn)行開(kāi)發(fā)的時(shí)候,你將會(huì)對(duì)接線技術(shù)有更多的了解。相比起其他的開(kāi)發(fā)板,你可以快速地對(duì)接線進(jìn)行調(diào)整,這將可以為你帶來(lái)更多的接線經(jīng)驗(yàn)。在接線的過(guò)程中有一些必須遵守的規(guī)則,如果違反了這些規(guī)則,可能會(huì)直接導(dǎo)致元件的短路從而對(duì)電路板造成無(wú)法挽回的損害。圖3-1給出一張具體的ProtoBoard圖片,從圖中我們可以看出ProtoBoard主要包含了兩種區(qū)域,兩側(cè)的垂直列部分(以+和-極性符號(hào)開(kāi)始的列)和中間的水平行部分(由字母和數(shù)字組成的坐標(biāo)系)?!?”表示用于連接電路板的電力供應(yīng),“-”表示用于接地。電子元件不應(yīng)該插在垂直的那些列上,而是應(yīng)該用線連接到ProtoBoard中間的那些行上。如果我們將電阻器的一條引線連接到了第一行的第一個(gè)插孔中,那么電阻器的其他引線就應(yīng)當(dāng)連接到其他行的插孔中,而不能再連接到同一行了。圖3-1 一個(gè)ProtoBoard和一個(gè)ArduinoUno這個(gè)面包板被一條無(wú)形的軸線分成了垂直對(duì)稱的兩個(gè)區(qū)域,這意味著這兩個(gè)區(qū)域在電力的使用上是相互獨(dú)立的。我們將利用這個(gè)特性來(lái)使用某些集成電路(IntegratedCircuit,IC)。這些集成電路的安裝將橫跨兩個(gè)區(qū)域。仔細(xì)觀察圖3-2,圖片的上半部分給出的都是錯(cuò)誤的元件安裝方式,而下半部分則給出了正確的元件安裝方式。另外,圖中橫跨兩個(gè)區(qū)域的芯片安置方式是正確的,這種用法在集成電路中是很常見(jiàn)的。圖3-2 利用Fritzing得到的Protoboard圖像是一個(gè)可以幫助我們?yōu)轫?xiàng)目快速創(chuàng)建電路設(shè)計(jì)的工具。關(guān)于Fritzing這款工具的更多詳情請(qǐng)?jiān)L問(wèn)網(wǎng)址\h/download/。模擬端口和數(shù)字端口現(xiàn)在我們已經(jīng)了解面包板的正確用法了。緊接著一個(gè)非常重要的概念——端口,擺在了我們面前。開(kāi)發(fā)板包含了各種的輸入和輸出端口,端口的數(shù)量因我們所使用的開(kāi)發(fā)板的型號(hào)差異而有所不同。但是端口是什么呢?ArduinoUNO開(kāi)發(fā)板的端口在它的兩側(cè)。它們作為一種連接,來(lái)實(shí)現(xiàn)開(kāi)發(fā)板與傳感器、執(zhí)行器以及其他設(shè)備(甚至是其他的Arduino開(kāi)發(fā)板)的交互。主板的端口支持?jǐn)?shù)字和模擬兩種信號(hào)。這些端口的優(yōu)勢(shì)不僅在于它們的雙向性,還包括開(kāi)發(fā)者可以對(duì)這些端口的行為進(jìn)行定義。在下面的代碼中,第一部分表明我們?cè)O(shè)定了將要使用端口的狀態(tài),下面就是setup函數(shù)的內(nèi)容://代碼開(kāi)始voidsetup(){ //函數(shù)入口,運(yùn)行一次//準(zhǔn)備設(shè)置Arduino的輸入輸出引腳pinMode(10,OUTPUT); //將10引腳設(shè)置為輸出引pinMode(11,INPUT); //將11引腳設(shè)置為輸入引腳}下面讓我們來(lái)看看ArduinoUNO上的數(shù)字與模擬端口。模擬信號(hào)模擬信號(hào)指的是隨著時(shí)間連續(xù)變化的信號(hào),模擬信號(hào)可以被理解為隨著時(shí)間連續(xù)變化的電壓。舉個(gè)例子,它可能從2V變到3.3V再變到3.0V或者3.333V,電壓隨著時(shí)間逐漸變化,每次的值都不相同。兩個(gè)值之間的數(shù)字是無(wú)限多的(理論上),這是一個(gè)很有意思的特性,而這個(gè)特性剛好是我們所需要的。例如,如果我們想要測(cè)量一個(gè)房間的溫度,溫度的測(cè)量值精確到小數(shù),這就需要使用一個(gè)模擬信號(hào)來(lái)表示測(cè)量值。另外,我們平時(shí)所使用的十進(jìn)制表示法中不可能存儲(chǔ)無(wú)限長(zhǎng)的小數(shù),只能進(jìn)行數(shù)學(xué)舍入(數(shù)值截?cái)啵S幸粋€(gè)被稱為離散化的過(guò)程就被用來(lái)實(shí)現(xiàn)模擬信號(hào)到數(shù)字信號(hào)的轉(zhuǎn)化。無(wú)論是在現(xiàn)實(shí)世界中還是在微控制器的世界中,兩個(gè)值之間的數(shù)字的個(gè)數(shù)都不會(huì)是無(wú)限大的。ArduinoUNO的接口使用了0到1023來(lái)描述一個(gè)模擬輸入信號(hào)。某些被標(biāo)記了PWM或者a~的端口可以創(chuàng)建一個(gè)在0到255之間變化的輸出信號(hào)。數(shù)字信號(hào)數(shù)字信號(hào)只包含了兩個(gè)值——0和1。許多電子設(shè)備內(nèi)部都設(shè)立好了一個(gè)范圍,從3.5V到5V之間的電壓值被看作是邏輯值1,從0V到2.5V之間的電壓為邏輯值0。為了更好的理解這點(diǎn),我們來(lái)看一個(gè)按下按鈕觸發(fā)警報(bào)的例子。對(duì)于警報(bào)來(lái)說(shuō)只有兩種有效的情況,一是當(dāng)按鈕被按下觸發(fā)警報(bào),另一種就是按鈕沒(méi)有被按下。這里只能觀察到這兩個(gè)狀態(tài)。所以不同于之前那個(gè)有一個(gè)線性范圍值的溫度傳感器的例子,這里只有兩個(gè)值。從邏輯上講,我們可以根據(jù)不同的目的使用這些特性。ArduinoIDE中包含了一些說(shuō)明性的例子,你可以將它們加載到開(kāi)發(fā)板上來(lái)研究模擬信號(hào)和數(shù)字信號(hào)的理論。加載的方法是在導(dǎo)航欄上依次點(diǎn)擊File|Examples|Basic|Blink。傳感器在第1章家居安全系統(tǒng)的入門(mén)知識(shí)中,我們討論了各種不同種類(lèi)的硬件,現(xiàn)在我們將就其中的傳感器展開(kāi)詳細(xì)的討論。現(xiàn)在傳感器的種類(lèi)各種各樣,我們沒(méi)有必要去講解得面面俱到?,F(xiàn)在我們就它們之間的一些差異進(jìn)行一下描述?,F(xiàn)實(shí)世界物體的物理屬性或者這些屬性的集合都有相對(duì)應(yīng)的傳感器,所以我們可以測(cè)量力度(人們?cè)诘厣闲凶叩膲毫Γ?、運(yùn)動(dòng)(物理位移,即使在沒(méi)有光線的情況下)、煙霧、氣體、圖片(是的,攝像機(jī)也是一種傳感器)、噪聲(錄音)、天線(無(wú)線電波、WiFi和NFC)以及一系列的屬性,這也許需要一整本書(shū)來(lái)講解所有這些內(nèi)容。如果你去一家電子商店或者銷(xiāo)售門(mén)戶網(wǎng)站購(gòu)買(mǎi)一個(gè)濕度傳感器(或者其他的任何電子產(chǎn)品),要比廉價(jià)的山寨品更耐用。當(dāng)我們開(kāi)始尋覓一款合適的組件時(shí),可以先查看詳細(xì)的組件數(shù)據(jù)資料(后面我們將會(huì)對(duì)這個(gè)文檔有詳細(xì)的講解),它涵蓋了產(chǎn)品的運(yùn)行特性和價(jià)格差異。你不必對(duì)數(shù)據(jù)資料中出現(xiàn)的兩款非常相似的型號(hào)感到驚訝,一些產(chǎn)品是用來(lái)實(shí)現(xiàn)專(zhuān)業(yè)部署的(例如應(yīng)用在一些技術(shù)部門(mén)或者軍事部門(mén)),而其他的一些產(chǎn)品主要是為滿足消費(fèi)類(lèi)市場(chǎng)而設(shè)計(jì)的。這里,我們將考慮的重點(diǎn)將放在那些質(zhì)量不錯(cuò)且性價(jià)比又比較高的產(chǎn)品。接下來(lái)我們將會(huì)以一個(gè)例子來(lái)作為和后面段落的銜接。這個(gè)例子中我們將會(huì)使用一個(gè)溫度傳感器(TMP-36)和ArduinoUNO上的模擬端口。圖3-3中給出這個(gè)實(shí)驗(yàn)的電路原理圖。圖3-3 我們的設(shè)計(jì)——使用Fritzing設(shè)計(jì)//代碼開(kāi)始//###########################//作者:JorgeReyesCastro//ArduinoHomeSecurityBook//###########################//A3作為輸入引腳//傳感器TMP36//###########################//全局變量intoutPut=0;floatoutPutToVol=0.0;floatvolToTemp=0.0;voidsetup(){Serial.begin(9600);//啟動(dòng)串行端口,波特率設(shè)置為9600}voidloop(){outPut=analogRead(A3);//從A3輸入端口獲取值outPutToVol=5.0*(outPut/1024.0);//使用值進(jìn)行計(jì)算volToTemp=100.0*(outPutToVol-0.5);//從數(shù)據(jù)表中獲得數(shù)據(jù)Serial.print(" \n");mprint("Outputofthesensor->",outPut);mprint("Conversiontovoltage->",outPutToVol);mprint("Conversiontotemperature->",volToTemp);delay(1000);//等待1秒}//創(chuàng)建輸出函數(shù)//創(chuàng)建一個(gè)可以重用的函數(shù)voidmprint(char*text,doublevalue){//接收兩個(gè)參數(shù)Serial.print(text);Serial.print("\t");//輸出一個(gè)制表符Serial.print(value);Serial.print("\n");//輸出新的一行}現(xiàn)在,你可以從IDE中打開(kāi)一個(gè)串行端口,當(dāng)然也可以選擇不打開(kāi)端口而僅執(zhí)行前面的Python腳本。我們可以看到Arduino的輸出。輸入下面的命令來(lái)將這些代碼在python中運(yùn)行:$pythonSerialPython.py。輸出的結(jié)果將如下:Outputofthesensor145.00Conversiontovoltage0.71Conversiontotemperature20.80通過(guò)這段Python腳本,我們?cè)O(shè)法從傳感器中提取到了一些數(shù)據(jù),這些數(shù)據(jù)是經(jīng)過(guò)ArduinoUNO對(duì)信號(hào)進(jìn)行處理之后得到的?,F(xiàn)在使用ArduinoUNO的串行端口(利用Python腳本)對(duì)數(shù)據(jù)進(jìn)行提取和讀取。此時(shí),我們可以按照自己的想法對(duì)數(shù)據(jù)進(jìn)行任意的處理,比如將它們存儲(chǔ)到一個(gè)數(shù)據(jù)庫(kù)中,或者將它們作為參數(shù)帶入到一個(gè)函數(shù)的運(yùn)算中,又或者使用它們來(lái)創(chuàng)建一個(gè)HTML頁(yè)面等。正如你可能已經(jīng)注意到的,我們現(xiàn)在正在進(jìn)行數(shù)學(xué)計(jì)算。不過(guò),我們從哪里來(lái)獲得數(shù)據(jù)呢?這個(gè)問(wèn)題的答案就是數(shù)據(jù)手冊(cè)。電子組件的數(shù)據(jù)手冊(cè)每當(dāng)我們需要使用或者操作一個(gè)電子組件的時(shí)候,就必須對(duì)它們的特性進(jìn)行研究。對(duì)于這一點(diǎn),我們可以通過(guò)閱讀它們的官方文檔來(lái)解決,這些文檔的長(zhǎng)度各不相同,但是制造商一般都會(huì)對(duì)該元件的特性進(jìn)行細(xì)致地描述。首先,我們要確定這個(gè)組件在它被制造時(shí)所獲得的唯一ID或者型號(hào)名稱。{TMP36GZ互聯(lián)網(wǎng)就可以很快找到它對(duì)應(yīng)的數(shù)據(jù)手冊(cè)??梢匀h搜索關(guān)鍵詞“TMP36GZ+datasheet”,或者直接訪問(wèn)以下網(wǎng)址:\h/datasheets/Sensors/Temp/TMP35_36_37.pdf來(lái)獲得這個(gè)數(shù)據(jù)手冊(cè)。在獲得了這個(gè)數(shù)據(jù)手冊(cè)之后,你會(huì)發(fā)現(xiàn)很多組件看起來(lái)很類(lèi)似,但是實(shí)際上這些組件的大小區(qū)別卻很大(這里的規(guī)格選擇對(duì)一個(gè)項(xiàng)目來(lái)說(shuō)是至關(guān)重要的,一個(gè)錯(cuò)誤的選擇可能給你帶來(lái)十分郁悶的意外)。這里舉一個(gè)例子,如果我們沒(méi)弄清楚元件的介紹就做了決定,那么可能會(huì)誤將一個(gè)用在手機(jī)上的元件買(mǎi)回來(lái),這種元件是不可能被使用標(biāo)準(zhǔn)方式進(jìn)行焊接的,因?yàn)樗鼈儽饶愕男≈讣走€要小。因此,組件的外觀也是必須要注意的。在數(shù)據(jù)手冊(cè)的初始頁(yè)你可以看到該組件物理方面的特性。之后,它將介紹一些技術(shù)特點(diǎn),比如工作電流、輸出電壓以及其他一些我們必須認(rèn)真了解的特性。這樣做是為了讓我們的設(shè)置與組件特性相符。一般情況下,我們工作的理想輸入電壓為2.7V到5.5V之間。Arduino的輸出電壓為5V。此外,要保持溫度在正常的工作范圍內(nèi)。下面我們將討論溫度對(duì)電子組件性能影響的具體細(xì)節(jié)。出現(xiàn)非常大的誤差。因此,盡量選擇那些在數(shù)據(jù)手冊(cè)中有著最優(yōu)異表現(xiàn)的組件來(lái)構(gòu)建系統(tǒng)。此外,你還必須始終遵守輸入電壓不能超出規(guī)定限額的規(guī)則,否則設(shè)備可能會(huì)被損壞,甚至無(wú)法修復(fù)。如果想獲得更多的關(guān)于ADC的信息,請(qǐng)參閱:\h/wiki/Analog-to-digital_converter.當(dāng)我們擁有了一個(gè)溫度傳感器設(shè)備之后,就可以利用它提取所需要的數(shù)據(jù)了。因此,我們需要進(jìn)行一個(gè)數(shù)據(jù)手冊(cè)中給出參考的簡(jiǎn)單計(jì)算,正如所看到的,我們提供5V的電壓給傳感器,而它將根據(jù)溫度返回一個(gè)0到1023之間的數(shù)值。因此,我們使用一個(gè)簡(jiǎn)單的公式來(lái)將這個(gè)數(shù)值和電壓值(模擬值)進(jìn)行轉(zhuǎn)換:電壓=從傳感器得到的值×(5/1024)這里使用數(shù)值1024是沒(méi)有問(wèn)題的,因?yàn)槲覀円呀?jīng)表示,這個(gè)數(shù)據(jù)的取值范圍是從0(包括0)到1023。這個(gè)數(shù)字看起來(lái)可能有些不同尋常,但是在計(jì)算機(jī)和電子的世界中,0是一個(gè)十分重要的數(shù)字。因此,在進(jìn)行計(jì)算時(shí)要多加注意。當(dāng)我們?nèi)〉昧穗妷旱闹抵?,我們就著手將這個(gè)測(cè)量結(jié)果轉(zhuǎn)換為度數(shù)。為此,通過(guò)使用數(shù)據(jù)手冊(cè)中的公式,我們可以快速地完成這個(gè)轉(zhuǎn)換。我們使用一個(gè)可以保存小數(shù)的數(shù)據(jù)(雙精度型或者浮點(diǎn)型)類(lèi)型的變量,否則結(jié)果將會(huì)被截?cái)?,一些有用的信息將?huì)丟失(這看起來(lái)好像有些奇怪,但是這個(gè)錯(cuò)誤很常見(jiàn))。這個(gè)轉(zhuǎn)換的公式是Co=(電壓?0.5)×100.0。現(xiàn)在我們擁有了所有必需的數(shù)據(jù)以及優(yōu)秀的傳感器實(shí)現(xiàn)方案,這樣我們就可以消除數(shù)據(jù)的噪音和干擾。如果你有這方面的需求的話,可以更深入地對(duì)此進(jìn)行研究。有了前面的知識(shí)儲(chǔ)備,這些將不難實(shí)現(xiàn)。近場(chǎng)通信近場(chǎng)通信(NearFieldCommunication,NFC)技術(shù)基于射頻識(shí)別(RadioFrequencyIdentificationDevices,RFID)技術(shù)。這個(gè)技術(shù)的基本原理就是將兩個(gè)設(shè)備結(jié)合到了一個(gè)開(kāi)發(fā)板上,一個(gè)擔(dān)當(dāng)天線的角色用來(lái)發(fā)送信號(hào),另一個(gè)擔(dān)當(dāng)讀取/接收信號(hào)的角色,它們使用電磁場(chǎng)來(lái)交流信息。它們能處理小塊的信息,這足以使我們讓這個(gè)卓越的開(kāi)發(fā)板發(fā)揮出更為神奇的能力。如果想獲得更多的關(guān)于RFID和NFC的信息,請(qǐng)參閱:\h/wiki/Near_field_communication\h/wiki/Radiofrequency_identification如今,我們可以在各種身份識(shí)別場(chǎng)合和門(mén)禁卡系統(tǒng)(一個(gè)開(kāi)創(chuàng)性的例子就是某些國(guó)家,比如西班牙,所使用的身份證),公共交通的儲(chǔ)值卡,銀行的信用卡甚至智能手機(jī)(通過(guò)NFC技術(shù)實(shí)現(xiàn)支付)中看到這種技術(shù)的身影。對(duì)于這個(gè)項(xiàng)目,我們將會(huì)使用一個(gè)流行的模塊PN532AdafruitRFID/NFC。其實(shí)在模塊的選擇上,你大可隨意。我之所以選擇這款,是對(duì)性能、費(fèi)用,當(dāng)然最重要的是芯片等方面經(jīng)過(guò)綜合考慮做出的決定。目前流行的PN532得到了交流社區(qū)的有力支持,有很多相關(guān)的書(shū)籍和工具,它本身還自帶了大量庫(kù)文件。你可以將這個(gè)模塊插在Arduino上,再連接到一個(gè)樹(shù)莓派或者直接連接到你的計(jì)算機(jī)(通過(guò)一個(gè)USB轉(zhuǎn)串口適配器)上。另外,PN532開(kāi)發(fā)板上配備了一個(gè)免費(fèi)的Mifare1k卡,在這個(gè)項(xiàng)目中我們將會(huì)使用到這個(gè)卡。此外,你也可以花錢(qián)去購(gòu)買(mǎi)標(biāo)簽卡或者那種內(nèi)置有小型電路的鑰匙扣,這種鑰匙扣可以對(duì)信息進(jìn)行存儲(chǔ),甚至對(duì)其進(jìn)行加密。這種方案的好處是除了價(jià)格低廉之外,我們還可以保護(hù)某些區(qū)域甚至全部區(qū)域的信息以不受用戶的訪問(wèn)。這將保證我們重要數(shù)據(jù)的安全,同時(shí)避免被人對(duì)標(biāo)簽進(jìn)行克隆/復(fù)制操作。這里有很多的標(biāo)準(zhǔn)來(lái)幫助我們對(duì)現(xiàn)存的各種不同類(lèi)型卡進(jìn)行分類(lèi)。Mifare1K卡就是其中的一類(lèi)(當(dāng)然在這個(gè)實(shí)驗(yàn)中你也可以使用其他的NFC卡,但是實(shí)驗(yàn)中需要做一點(diǎn)小小的更改)。有關(guān)MIFARE卡的更多信息,請(qǐng)參閱:\h/wiki/MIFARE。顧名思義,這種型號(hào)的卡只能存儲(chǔ)1KB的信息,它采用了EEPROM類(lèi)型存儲(chǔ)芯片(可重寫(xiě))。此外,這種型號(hào)的每張卡片還擁有著一個(gè)獨(dú)一無(wú)二的序列號(hào)(將它們區(qū)分開(kāi))??ǖ膬?nèi)部被劃分成了16個(gè)扇區(qū)(0~15),并且每個(gè)扇區(qū)被細(xì)分成了4個(gè)塊(0~3),每個(gè)塊至少可以保存16個(gè)字節(jié)的信息。對(duì)于每個(gè)塊,我們都可以為其設(shè)置一個(gè)密碼以防止別人閱讀你的內(nèi)容。(現(xiàn)在,我們要巧妙地控制卡的密鑰,因?yàn)橛脩艨赡軙?huì)意外地對(duì)卡進(jìn)行了加密,從而導(dǎo)致了卡無(wú)法使用)默認(rèn)情況下,所有卡都會(huì)有一個(gè)默認(rèn)密碼(ffffffffffff)。讀者可以參閱鏈接\h/product/789的內(nèi)容來(lái)繼續(xù)上面的例子,又或者你選擇了一個(gè)其他的設(shè)備,那么你可以通過(guò)互聯(lián)網(wǎng)搜索它的特性信息。鏈接中也包含了一些教程,這些教程將教會(huì)你如何兼容其他設(shè)備(樹(shù)莓派),理解數(shù)據(jù)手冊(cè),以及通過(guò)Github下載模塊使用的庫(kù)文件?,F(xiàn)在我們來(lái)執(zhí)行上面提到的最后一點(diǎn),下載模塊使用的庫(kù)文件。作為開(kāi)源硬件最大的優(yōu)勢(shì),它的設(shè)計(jì)可以被任何人進(jìn)行修改和完善。對(duì)了,一定要牢記在處理電子組件的時(shí)候,一定要小心并盡量避免靜電。正如你所看到的,這個(gè)模塊是直接插在Arduino上的。如果焊接引腳不能直接接在上面,你可以使用杜邦公對(duì)母延長(zhǎng)線來(lái)利用其他未使用的端口。當(dāng)我們成功安裝了設(shè)備以后,就可以使用那些用來(lái)控制這個(gè)設(shè)備的庫(kù)文件了。在本書(shū)的第5章中提供了一個(gè)詳細(xì)的程序。這里有一點(diǎn)很重要,你必須對(duì)要下載的庫(kù)進(jìn)行重命名操作,以去除空格或者其他類(lèi)似的字符。否則,在導(dǎo)入過(guò)程中可能會(huì)引發(fā)錯(cuò)誤。當(dāng)我們做好了這些準(zhǔn)備,并且擁有一個(gè)Mifare1K卡,就可以來(lái)研究下面這段有助于我們理解本章講解的所有技術(shù)的代碼了。這段代碼將為標(biāo)簽分配唯一標(biāo)識(shí)符(UID)://###########################//作者:JorgeReyesCastro//ArduinoHomeSecurityBook//############################include<Wire.h>#include<Adafruit_NFCShield_I2C.h>//這是Adafruit庫(kù)文件//宏定義#defineIRQ(2)#defineRESET(3)Adafruit_NFCShield_I2Cnfc(IRQ,RESET);//準(zhǔn)備N(xiāo)FC模塊//安裝voidsetup(void){Serial.begin(115200);//打開(kāi)串行端口Serial.print("######SerialPortReady######\n");nfc.begin();//啟動(dòng)NFCnfc.SAMConfig();if(!Serial){//如果串行端口沒(méi)有工作,等待delay(500);}}//LOOPvoidloop(void){uint8_tsuccess;uint8_tuid[]={0,0,0,0};//用來(lái)保存讀取的數(shù)據(jù)的緩沖區(qū)//uint8_tok[]={X,X,X,X};//輸入你的序列號(hào)uint8_tuidLength;success=nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A,uid,&uidLength);//讀取//如果標(biāo)簽卡存在if(success){Serial.println("Foundcard\n");Serial.print("UIDValue:\t");nfc.PrintHex(uid,uidLength);//將字節(jié)轉(zhuǎn)換為十六進(jìn)制intn=0;Serial.print("YourSerialNumber:\t");//該函數(shù)顯示出真實(shí)值//從4個(gè)位置運(yùn)行提取數(shù)據(jù)while(n<4){//復(fù)制這段代碼并記得在下面的例子中使用Serial.print(uid[n]);Serial.print("\t");n++;}Serial.println("");}delay(1500);//等待1.5秒}現(xiàn)在,你可以從IDE中打開(kāi)一個(gè)串行端口,當(dāng)然也可以選擇不打開(kāi)端口而僅執(zhí)行前面的Python腳本。我們可以看到Arduino的輸出。輸入下面的命令來(lái)將這些代碼在Python中運(yùn)行:$pythonSerialPython.py程序執(zhí)行完將會(huì)得到如下的輸出結(jié)果:######SerialPortReady######FoundcardUIDValue:0xED0x050xED0x9AYourSerialNumber:2375237154這樣我們就得到了自己的識(shí)別號(hào)碼,但是在我們的號(hào)碼上面出現(xiàn)的那些字母又是什么意思呢?很好,這就是十六進(jìn)制,一種廣泛使用的進(jìn)制,主要用來(lái)表示計(jì)算機(jī)中信息。十六進(jìn)制在表示數(shù)字的時(shí)候使用了一些英文字符,它可以表示比我們平時(shí)所用的十進(jìn)制更多的數(shù)字(要知道我們的卡的存儲(chǔ)空間不大,使用十六進(jìn)制可以更加有效的節(jié)省內(nèi)存空間)。這里舉一個(gè)例子,比如說(shuō)數(shù)字15,如果是十進(jìn)制的話,我們需要使用兩個(gè)字符,而如果使用十六進(jìn)制的話則只需要一個(gè)字符f(0xf,這是十六進(jìn)制數(shù)的表示方法,使用0x開(kāi)頭,這件事情應(yīng)該熟記于心,在將來(lái)這是十分有用的)。打開(kāi)一個(gè)Python的控制臺(tái)。運(yùn)行下面的代碼來(lái)輸入十六進(jìn)制的數(shù)字,你將看到它到十進(jìn)制的轉(zhuǎn)換(你可以使用之前放入代碼中的值來(lái)代替它們):有關(guān)數(shù)字進(jìn)制的詳細(xì)信息,請(qǐng)參閱:\h/wiki/Hexadecimal$python>>>0xED237>>>0x055>>>0x9A154你現(xiàn)在可以知道它們指的是同樣的數(shù)字。當(dāng)你熟悉了這項(xiàng)技術(shù)的使用之后,就可以挑戰(zhàn)一些更困難的問(wèn)題了。接下來(lái),我們將會(huì)完成這個(gè)訪問(wèn)控制系統(tǒng)。在此之前,一定要先把你的序列號(hào)(十進(jìn)制)記好。接下來(lái),我將重點(diǎn)關(guān)注NFC卡(如圖3-4所示)的使用,但不涉及認(rèn)證密鑰的問(wèn)題。以前曾提到過(guò)關(guān)于密鑰的問(wèn)題,這可以作為本章實(shí)例的進(jìn)階實(shí)驗(yàn),在這里建議讀者獨(dú)立完成這部分內(nèi)容以提高系統(tǒng)的健壯性。此外,在這個(gè)系統(tǒng)中,我們還增加了一個(gè)LED和蜂鳴器,以提高系統(tǒng)的實(shí)用性。圖3-4 RFID/NFC模塊和標(biāo)簽訪問(wèn)控制在接下來(lái)的實(shí)踐中我們的目的很明確,設(shè)計(jì)并實(shí)現(xiàn)一個(gè)訪問(wèn)控制系統(tǒng),該系統(tǒng)只允許有身份的人通行(什么是有身份的人呢?首先他得有張屬于自己的通行卡,其次,這張通行卡得有一個(gè)特定的序列號(hào))。如果你能使用加密密鑰的話,你就擁有了修改加密卡片信息的能力,通常這個(gè)密鑰只有卡片的制造者才知道。當(dāng)一張卡片成功通過(guò)了訪問(wèn)控制的認(rèn)證之后,系統(tǒng)就會(huì)閃爍一下綠色的小燈,表示該卡片已經(jīng)被授權(quán)允許訪問(wèn)。另外,用戶還會(huì)聽(tīng)到一個(gè)令人愉悅的聲音,例如,一個(gè)悅耳的聲音對(duì)你說(shuō):“你已通過(guò)認(rèn)證,歡迎進(jìn)入”。要是該卡片無(wú)法通過(guò)訪問(wèn)控制的認(rèn)證,這時(shí)警報(bào)聲會(huì)響起,并將一直持續(xù),提醒我們有人正試圖非法入侵,并將激活警報(bào)命令中心(你會(huì)看到一束紅色的燈光在不斷的閃爍,以此來(lái)提醒警衛(wèi))。你可以按照自己的意愿添加更多的模塊,如圖3-5所示。圖3-5 使用Fritzing繪制的我們的方案圖3-6給出了上面布線圖的更清晰的表示,以方便理解這里并沒(méi)有放置天線部分。圖3-6 使用Fritzing繪制的我們的設(shè)計(jì)現(xiàn)在我們已經(jīng)是萬(wàn)事俱備,只欠東風(fēng)了。接下來(lái),你就可以開(kāi)始將所有的部件連接起來(lái)并開(kāi)始創(chuàng)建項(xiàng)目代碼了。下面給出了NFC訪問(wèn)控制的代碼實(shí)例://###########################//作者:JorgeReyesCastro//ArduinoHomeSecurityBook//############################include<Wire.h>#include<Adafruit_NFCShield_I2C.h>//這是Adafruit庫(kù)Library//MACROS#defineIRQ(2)#defineRESET(3)Adafruit_NFCShield_I2Cnfc(IRQ,RESET);//準(zhǔn)備N(xiāo)FC模塊voidsetup(void){pinMode(5,OUTPUT);//配置引腳5為輸出模式pinMode(9,OUTPUT);//配置引腳9為輸出模式pinMode(10,OUTPUT);//配置引腳10為輸出模式okHAL();Serial.begin(115200);//打開(kāi)串行端口Serial.print("######SerialPortReady######\n");nfc.begin();//啟動(dòng)NFCnfc.SAMConfig();if(!Serial){//如果串行端口不工作,等待delay(500);}}voidloop(void){uint8_tsuccess;uint8_tuid[]={0,0,0,0};//從標(biāo)簽卡讀取ID存入到緩沖區(qū)uint8_tok[]={237,5,237,154};//輸入你的序列號(hào)uint8_tuidLength;success=nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A,uid,&uidLength);//讀if(success){okHAL();//聲音“OK”Serial.println("Foundcard\n");Serial.print("UIDValue:\t");nfc.PrintHex(uid,uidLength);//UID轉(zhuǎn)化為16進(jìn)制的值intn=0;Serial.print("YourSerialNumber:\t");//UID轉(zhuǎn)化為10進(jìn)制的值while(n<4){Serial.print(uid[n]);Serial.print("\t");n++;}Serial.println("");Serial.println("Wait..\n");//驗(yàn)證intm=0,l=0;while(m<5){if(uid[m]==ok[l]){//將獲得的UID與我們之前存儲(chǔ)的數(shù)據(jù)進(jìn)行比較}elseif(m==4){Serial.println("######Authorized######\n");//一切就緒authOk();okHAL();}else{Serial.println("######Unauthorized######\n");//不同于警報(bào)!!!authError();errorHAL();m=6;}m++;l++;}}delay(1500);}//創(chuàng)建一個(gè)函數(shù),以使我們能夠快速創(chuàng)建聲音//alarm("timetowait"inms,"tone/power")voidalarm(unsignedcharwait,unsignedcharpower){analogWrite(5,power);delay(wait);analogWrite(5,0);}//HALOKvoidokHAL(){alarm(200,250);alarm(100,50);alarm(300,250);}//HALERRORvoiderrorHAL(){intn=0;while(n<3){alarm(200,50);alarm(100,250);alarm(300,50);n++;}}//當(dāng)被我們調(diào)用時(shí),這些函數(shù)激活了LED//(仔細(xì)查看上面的代碼所使用的位置)//紅色——快速voidauthError(){intn=0;while(n<20){digitalWrite(9,HIGH);delay(500);digitalWrite(9,LOW);delay(500);n++;}}//綠色——慢速voidauthOk(){intn=0;while(n<5){digitalWrite(10,HIGH);delay(2000);digitalWrite(10,LOW);delay(500);n++;}}//此代碼可以精簡(jiǎn),以提高執(zhí)行的效率和速度//但這些都是依據(jù)教學(xué)目的而設(shè)立,增加可讀性把這段代碼復(fù)制一下,然后進(jìn)行編譯,將其應(yīng)用在你的開(kāi)發(fā)板上。確保當(dāng)我們開(kāi)始通信或者有人試圖進(jìn)行身份驗(yàn)證的時(shí)候,系統(tǒng)會(huì)發(fā)出一個(gè)聲音。另外,我們還增加了兩個(gè)簡(jiǎn)單的LED指示燈,這兩個(gè)指示燈可以為我們的設(shè)計(jì)提供有用的信息。最后,我們終于完成了整個(gè)的系統(tǒng)。現(xiàn)在也許是時(shí)候來(lái)完善我們的Python腳本和串行接口的設(shè)置了,這樣,在接收數(shù)據(jù)的時(shí)候,計(jì)算機(jī)就會(huì)創(chuàng)建一個(gè)紅色窗口或者響起警報(bào)。現(xiàn)在正是讀者將理論轉(zhuǎn)化為實(shí)踐的階段,通過(guò)這個(gè)轉(zhuǎn)變,你將領(lǐng)略到程序世界的精彩。小結(jié)它們的主要區(qū)別,從而找到最能滿足我們需要的組件,最后將它們應(yīng)用到真實(shí)的項(xiàng)目中去。對(duì)了,我們還在項(xiàng)目中使用了NFC技術(shù)。這只是一個(gè)基礎(chǔ)性的實(shí)驗(yàn),將來(lái)讀者可以對(duì)如何確立設(shè)計(jì)的需求、安裝環(huán)境以及開(kāi)發(fā)所需的措施。第4章 打造屬于自己的系統(tǒng)本章的目的是以實(shí)踐的形式來(lái)向你講解一些概念,這將不同于以往的純理論講授。這種新形式的教學(xué)嘗試將使你擁有一種與眾不同的思維方式和工作方式。在本章中,我們會(huì)就以下內(nèi)容展開(kāi)學(xué)習(xí):從零開(kāi)始,一步一步地詳細(xì)介紹系統(tǒng)設(shè)計(jì)的每個(gè)階段系統(tǒng)需求的確定創(chuàng)建一個(gè)系統(tǒng)的草圖設(shè)計(jì)或者原型設(shè)計(jì)系統(tǒng)的安裝、使用以及維護(hù)電氣定律與原理項(xiàng)目設(shè)計(jì)在前一章中,我們已經(jīng)建立了一個(gè)小型的訪問(wèn)控制原型系統(tǒng),當(dāng)然這個(gè)系統(tǒng)嚴(yán)格來(lái)說(shuō)還只能算是一個(gè)簡(jiǎn)單的組裝,我們只是把所有的組件安裝到了面包板上,這在實(shí)際工作中還是遠(yuǎn)遠(yuǎn)不夠的。另外,我們最好能使該系統(tǒng)擁有一定程度的控制權(quán)。目前這個(gè)系統(tǒng)缺乏自主的控制權(quán),它的控制主要依靠和計(jì)算機(jī)的連接來(lái)完成,另外該系統(tǒng)還存在著其他的一些問(wèn)題。因此,我們將開(kāi)始了解如何來(lái)創(chuàng)建一個(gè)完善的設(shè)計(jì),在這個(gè)設(shè)計(jì)中將解決所有可能的問(wèn)題,不論這個(gè)問(wèn)題發(fā)生在創(chuàng)建、部署還是開(kāi)發(fā)階段。首先我們來(lái)解釋一下剛剛提到的3個(gè)詞匯——?jiǎng)?chuàng)建、部署和開(kāi)發(fā),這是我們創(chuàng)建一個(gè)解決方案時(shí)最關(guān)鍵的3個(gè)點(diǎn)。設(shè)計(jì)思想在這一點(diǎn)上,我們必須能夠清楚地找出系統(tǒng)的關(guān)鍵問(wèn)題所在。這意味著我們將要完成一次實(shí)際項(xiàng)目的構(gòu)思,以此來(lái)弄清楚系統(tǒng)中的哪些問(wèn)題是表面性的,而哪些是實(shí)質(zhì)性的。這些話聽(tīng)起來(lái)好像是很容易的,但其實(shí)要想成功完成一次設(shè)計(jì)工作,需要注意下面的幾點(diǎn)。舉個(gè)例子,假設(shè)我們想要統(tǒng)計(jì)在特定的時(shí)間點(diǎn)通過(guò)門(mén)禁的人數(shù)。帶著這樣一個(gè)簡(jiǎn)單的想法,我們可以建立多種不同的解決方案,但是其中只有一小部分能真正地符合需求(需求/解決,這個(gè)方案應(yīng)該被理解為一個(gè)說(shuō)明性的模型,因?yàn)槲覀冞€不能對(duì)這些需求進(jìn)行量化)如果在同一時(shí)間有很多人一起通過(guò)呢?這個(gè)系統(tǒng)可能會(huì)將同時(shí)通過(guò)的10個(gè)人計(jì)算成一個(gè)不合適的話,人臉識(shí)別功能也可能無(wú)法正常工作。我們必須盡可能地收集與環(huán)境相關(guān)的、可能遇到的特殊情況以及使用需求方面的信息。只有在解決方案滿足了所有的這些需求之后,我們才能順利進(jìn)入到下一個(gè)階段。要知道,具體環(huán)境中的空間分布和距離對(duì)于我們的設(shè)計(jì)來(lái)說(shuō)都是強(qiáng)制性的制約條件。在實(shí)際的案例中要花費(fèi)充足的時(shí)間來(lái)對(duì)其進(jìn)行調(diào)研。這里的設(shè)計(jì)思想可以用來(lái)幫助我們解決各種行業(yè)中的問(wèn)題,因此在實(shí)際項(xiàng)目中遵循上面提到的原則是一個(gè)不錯(cuò)的選擇。設(shè)計(jì)方案在確定了系統(tǒng)需求和環(huán)境特點(diǎn)之后,我們將會(huì)開(kāi)始設(shè)計(jì)階段的工作。當(dāng)你在腦海中構(gòu)思第一份草稿時(shí),我們的設(shè)計(jì)其實(shí)就開(kāi)始了。即使系統(tǒng)部署的環(huán)境很復(fù)對(duì)你安裝位置所在的環(huán)境的電力線路、電力節(jié)點(diǎn)、水管的部署了如指掌。在這個(gè)階段,你可能要做出一些選擇,例如是否使用電纜,以及在無(wú)線部署和有線部署(見(jiàn)第1章)中進(jìn)行二選一。因此,你需要復(fù)習(xí)一下它們各自的特點(diǎn)和優(yōu)劣,在這里我們不會(huì)在這一點(diǎn)上再進(jìn)行詳細(xì)的討論了。另外還要記住,整個(gè)項(xiàng)目不可能會(huì)是一帆風(fēng)順的,你可能會(huì)遇到一些阻礙,以致某些元件可能無(wú)法正常地進(jìn)行工作。項(xiàng)目部署當(dāng)完成了實(shí)驗(yàn)室中開(kāi)發(fā)板的設(shè)計(jì)工作之后,就可以繼續(xù)項(xiàng)目的部署工作了。如果決定開(kāi)始執(zhí)行安裝工作了,那么我們首先要著手準(zhǔn)備需要的材料,例如傳感器、各種工具與設(shè)備(膠帶、電線等)。另外,我們還需要計(jì)算好項(xiàng)目中需要的人力、工期以及可能會(huì)面對(duì)的困難。試想一下,如果我們需要爬上一個(gè)屋頂或者到其他比較危險(xiǎn)的區(qū)域,這時(shí)我們必須保證自己的安全。因此我們必須攜帶所有的重要設(shè)備和工具,來(lái)預(yù)防所有可能出現(xiàn)的事故,例如要避免從梯子上掉下來(lái)(當(dāng)然,你絕對(duì)不應(yīng)該獨(dú)自一人在這種情形下工作)。對(duì)設(shè)備進(jìn)行全面的調(diào)試工作是一個(gè)相當(dāng)明智的做法。這意味著我們?cè)谶M(jìn)行運(yùn)行階段的操作之前需要驗(yàn)證所有的操作是否正常,要考慮到一些特殊情況,即使這種情況很少發(fā)生。這個(gè)過(guò)程需要多次進(jìn)行重新評(píng)估來(lái)保證系統(tǒng)的完善。安裝使用當(dāng)你完成了上面的步驟之后,就可以繼續(xù)享受系統(tǒng)運(yùn)行帶來(lái)的樂(lè)趣了。運(yùn)行階段將會(huì)是我們整個(gè)項(xiàng)目周期中時(shí)間最長(zhǎng)的一個(gè)階段。所以可能要面臨很多問(wèn)題,我們可能需要對(duì)其進(jìn)行性能的擴(kuò)充,對(duì)項(xiàng)目中問(wèn)題進(jìn)行修復(fù),或者進(jìn)行基本的維護(hù)。實(shí)例在快速地完成了理論部分的學(xué)習(xí)之后,我們來(lái)看一個(gè)實(shí)例,這個(gè)例子中涵蓋了你所需要練習(xí)的基本功能,以及一些問(wèn)題的基本處理方法。例如,我們希望創(chuàng)建一個(gè)系統(tǒng),這個(gè)系統(tǒng)的目的是可以打開(kāi)或者關(guān)閉一盞燈。通過(guò)使用一個(gè)LED來(lái)模擬遠(yuǎn)程的燈,LED是一種功耗極低并且不易損壞的設(shè)備。同樣,我們還可以選擇使用一個(gè)中繼設(shè)備和一個(gè)220V的燈泡來(lái)實(shí)現(xiàn)該目的。這里我已經(jīng)完成了表4-1中第一個(gè)步驟給出的需求。表4-1步驟內(nèi)容需求查看燈的狀態(tài)以及對(duì)燈進(jìn)行遠(yuǎn)程管理設(shè)計(jì)概要和草圖我們將創(chuàng)建一個(gè)小型的地圖并盡可能地收集相關(guān)的信息。SketchUp是一款功能十分強(qiáng)大的免費(fèi)軟件,使用它可以完成圖形的繪制和3D模型的創(chuàng)建(包括3D打印)。我向你強(qiáng)烈推薦這款軟件(當(dāng)然你也可以選擇其他的類(lèi)似工具)。最好在你開(kāi)始項(xiàng)目的設(shè)計(jì)之前能夠熟練地使用這款軟件。你可以訪問(wèn)下面的這個(gè)鏈接來(lái)下載SketchUp:\h/download。在圖4-1中你可以看到一個(gè)房間的平面布局,我們要控制這個(gè)房間里的頂燈。在這個(gè)例子中我們也可以使用工作電壓更高的組件例如普通家用照明燈或者光傳感器,來(lái)完成工作(要知道燈是用來(lái)在黑暗中照明的,因此我們要模擬的是室內(nèi)的工作環(huán)境,或者是一個(gè)夜間的灌溉系統(tǒng))。圖4-1 一個(gè)房間的平面圖我們還需要確認(rèn)當(dāng)前環(huán)境中電源的插座以及Wi-Fi網(wǎng)絡(luò)的覆蓋情況,這樣我們才能準(zhǔn)確地安裝微控制器和Wi-Fi模塊,或者考慮采用樹(shù)莓派和電池的方案。通過(guò)這個(gè)例子,我們還將引入一系列的工具,然后再創(chuàng)建一些符合需求的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論