- Arduino案例實戰(zhàn)(卷Ⅳ)
- 李永華
- 4921字
- 2019-12-06 14:24:47
4.3 功能及總體設(shè)計
本作品主要分為三部分進行設(shè)計:網(wǎng)絡(luò)控制模塊、顯示模塊和振動開門模塊。
4.3.1 功能介紹
本開門裝置可通過網(wǎng)絡(luò)控制一個繼電器來實現(xiàn)振動傳感器的開關(guān),即決定是否啟用振動開門方式。啟動振動傳感器,進入游戲狀態(tài)后,開門者根據(jù)顯示屏提供的開門提示敲擊對應歌曲旋律,由固定在門上的振動傳感器感受兩次敲擊之間的時間間隔,在誤差允許范圍內(nèi)敲擊旋律正確則啟動直流電機拉開門鎖。若開門者敲擊節(jié)奏錯誤則更換歌曲,可以繼續(xù)驗證,從安全方面考慮,總嘗試次數(shù)有限,無論驗證成功還是失敗,均會亮起對應的提示燈。
4.3.2 總體設(shè)計
本項目開關(guān)部分選用ESP8266 WiFi模塊與單路繼電器模塊來控制振動傳感器的狀態(tài);顯示部分選用12864液晶屏顯示開門提示;主程序部分采用振動傳感器感應敲門的節(jié)奏頻率。若開門節(jié)奏正確,則驅(qū)動直流電機,門成功打開,同時接入1個RGB三色燈來對應是否成功開啟。
1.整體框架圖
項目的整體框架如圖4-1所示。

圖4-1 整體框架圖
2.系統(tǒng)流程圖
系統(tǒng)的流程如圖4-2所示。
接通電源以后,服務器發(fā)送指令“on”,使繼電器處于閉合狀態(tài),振動傳感器開始工作,顯示屏顯示開門提示,開門者需按一定頻率敲門,振動傳感器感受振動頻率。頻率正確,驅(qū)動模塊驅(qū)動直流電機,開門成功,RGB三色燈的綠燈亮;否則開門失敗紅燈亮;開門次數(shù)超過3次后,需等待10min后才有開門機會。

圖4-2 系統(tǒng)流程圖
3.總電路圖
系統(tǒng)總電路及Arduino UNO開發(fā)板引腳如圖4-3所示。
本電路圖較為復雜,下面分模塊說明各元器件間的引腳連線。
LCD顯示模塊:12864液晶顯示屏采用SPI接線方式。其D/I口、R/W口、E口分別與開發(fā)板的數(shù)字I/O端10、11、13相連,K(-)、CS1及VSS與開發(fā)板GND相連,A(+)、VDD與+5V端口相連。
網(wǎng)絡(luò)控制模塊:ESP8266的VCC端連接Arduino開發(fā)板的3.3V來通電,CH_PD通過10kΩ的電阻連接到Arduino開發(fā)板的3.3V電源上,模塊上的RX、TX作為通信端口,RX接Arduino上的TX,TX接Arduino開發(fā)板上的RX端口,兩元件的地線相連即可;繼電器接通電源,IN端接開發(fā)板數(shù)字信號I/O口5,COM端接+5V,NC端與振動傳感器正極相連,振動傳感器負極接地。

圖4-3 總電路圖
開門模塊:振動傳感器的DO口與開發(fā)板數(shù)字I/O端2相連;小直流電機與直流電機驅(qū)動板OA1、OB1相連,2個引腳無方向;電機驅(qū)動板的A-IA、A-IB口與開發(fā)板數(shù)字I/O端3、4相連,VCC和GND端分別接+5V和地;RGB三色燈的GND端口接地,R、G、B端分別接數(shù)字I/O口7、6、8。
4.3.3 模塊介紹
本項目主要包括三個模塊:網(wǎng)絡(luò)控制模塊、主程序模塊和LCD顯示模塊。下面分別給出各部分的功能、元件、電路圖和相關(guān)代碼。
1.網(wǎng)絡(luò)控制模塊
1)功能介紹
Arduino通過ESP8266連接貝殼物聯(lián)網(wǎng)服務,實現(xiàn)遠程控制繼電器的閉合斷開狀態(tài),并將結(jié)果反饋至控制界面。
選用貝殼物聯(lián)網(wǎng),通過ESP8266-01S、Arduino開發(fā)板與PC連接。以AT指令將WiFi模塊與物聯(lián)網(wǎng)連接,并將其設(shè)置為透傳模式,使其達到通電自動連接的功能;將WiFi模塊通過Arduino開發(fā)板與繼電器、振動傳感器連接,進而通過控制繼電器的閉合開關(guān)狀態(tài),控制傳感器的工作。
所用元器件:1個Arduino UNO R3,1只繼電器,1只振動傳感器,1只ESP8266-01S,1只10kΩ電阻,1塊面包板,若干杜邦線;ESP8266需先進行透傳設(shè)置。電路如圖4-4所示,元件間的連線如表4-1和表4-2所示。

圖4-4 網(wǎng)絡(luò)控制模塊
表4-1 ESP8266-01S接線對照表

表4-2 繼電器與常開型振動傳感器

繼電器線圈沒有電壓時,繼電器沒有吸合,公共端與常閉端接通;當有電壓時,繼電器吸合,公共端與常開端接通。在這里采用繼電器接常閉端法,如圖4-5所示。
(1)ESP8266的透傳設(shè)置。硬件包括USB轉(zhuǎn)TTL模塊,ESP8266-01S。軟件包括網(wǎng)絡(luò)調(diào)試助手。接線實物如圖4-6所示,接線如表4-3所示。
表4-3 接線對照表


圖4-5 接常閉端接法圖

圖4-6 接線實物圖
(2)串口調(diào)試工具及AT指令調(diào)試示例。在串口調(diào)試工具中選擇正確的串口及波特率,本項目采用的波特率為115200,打開“計算機”→“設(shè)備管理器”→“端口”,設(shè)置如圖4-7所示。

圖4-7 串口及波特率圖
打開網(wǎng)絡(luò)調(diào)試助手,設(shè)置ESP8266的波特率,如圖4-8所示。
(3)AT指令。
①查看版本號(這個非常重要),不同的版本AT指令的操作不太一樣。


圖4-8 ESP8266的波特率圖
②V1.0+固件命令如下:
第一步:關(guān)閉回顯功能ATE0。第二步:重啟AT+RESTORE。第三步:連接WiFi。

第四步:ESP8266設(shè)備連接服務器。

需要注意:在連接WiFi的AT指令中,必須使用字符串輸入名稱和密碼,因此需要使用雙引號;通過串口發(fā)送AT指令時,一定要回車換行,若沒有回車換行,會導致發(fā)送和返回是一樣的,同時串口也不承認"\r\n"指令,只能通過鍵盤來操作。
至此,ESP8266已經(jīng)成為一個透傳模塊,只要給ESP8266通上電,它即可連上WiFi,最終顯示結(jié)果如圖4-9所示。
(4)ESP8266與服務器的通信。
①打開貝殼物聯(lián)網(wǎng),注冊1個賬號并創(chuàng)建1個設(shè)備,將會得到設(shè)備ID(DEVICEID)、設(shè)備密碼(APIKEY),記錄下來,此時設(shè)備不在線。
②將設(shè)置好的ESP8266與Arduino、繼電器、振動傳感器按上面所描述的接線方式連接。

圖4-9 ESP8266連接成功
③燒錄代碼,上傳程序。
④刷新貝殼物聯(lián)網(wǎng)的界面,這時設(shè)備顯示在線,如圖4-10所示;需要注意的是,如果設(shè)備不在線,請檢查透傳是否正確、設(shè)備ID及設(shè)備密碼是否正確。

圖4-10 貝殼物聯(lián)界面
⑤點開智能設(shè)備中的設(shè)備對話,選擇上線設(shè)備后,命令發(fā)送目標選擇“設(shè)備ID”,發(fā)送框內(nèi)“play”,可觀察到振動傳感器的指示燈亮了,說明此時振動傳感器在工作狀態(tài),網(wǎng)絡(luò)控制模塊運行成功。運行過程如圖4-10所示。輸入和反饋結(jié)果如下:
命令輸入欄里,輸入:play。
命令記錄欄里,反饋:sensor on——振動傳感器工作。
命令輸入欄里,輸入:stop。
命令記錄欄里,反饋:sensor off——振動傳感器不工作。
2)相關(guān)代碼



2.LCD顯示及振動模塊
由于液晶屏顯示文字與振動傳感器獲取的游戲者驗證情況有關(guān),代碼連續(xù),故將兩模塊合寫。
1)功能介紹
主程序模塊:繼電器開關(guān)閉合使振動傳感器接通電源后,振動傳感器感受振動頻率并與代碼內(nèi)設(shè)頻率相比較。若敲擊次數(shù)及時間間隔在容錯范圍內(nèi)測試為驗證成功,則綠色LED亮,直流電機轉(zhuǎn)動拉動門鎖開門;否則紅色LED亮,換下一首歌,繼續(xù)驗證。連續(xù)錯3次后,RGB三色燈閃爍,開門者被禁止繼續(xù)嘗試,10min后可進行下一輪驗證。
顯示屏模塊:每次驗證時顯示內(nèi)設(shè)歌曲名稱,并在驗證后顯示驗證成功或失敗信息。
所用元件包括:1個Arduino UNO R3、1個振動傳感器、1個普通小直流電機、1個12864LCD液晶屏、1個直流電機驅(qū)動板、1個面包板、若干杜邦線。
(1)振動傳感器SW-1801P。
基本原理:振動傳感器SW-1801P基于彈簧擺動原理,如圖4-11所示。塑料管里有一個軟彈簧圍繞著中心的金屬桿,兩者平時互不接觸,當受到一定外界振動時,就會令彈簧搖晃并碰到金屬桿,輸出一個接通信號。在靜止時任何角度都為開路OFF狀態(tài),當受到外力碰撞或者大力晃動時,彈簧變形和中心電極接觸導通使兩個引腳瞬間為ON狀態(tài),當外力消失時,電路恢復為開路OFF狀態(tài)。

圖4-11 振動傳感器SW-1801P
對于該振動傳感器模塊來說,無振動或者振動強度達不到設(shè)定閾值時,D0口輸出高電平;當外界振動強度超過設(shè)定閾值時,模塊D0輸出低電平。由于導通時間和彈簧的剛性有關(guān),所以該振動傳感器的輸出帶寬很窄,在使用Arduino讀取時,使用外部中斷功能,如圖4-11所示。

圖4-12 振動傳感器調(diào)試
振動模塊VCC接開發(fā)板VCC,GND接開發(fā)板GND,連接正常,模塊電源指示燈會亮。將模塊輕放桌面上,調(diào)節(jié)板上藍色電位器,直到開關(guān)指示燈亮,然后稍微回調(diào)電位器,讓開關(guān)指示燈滅,再用手敲打桌面,使振動傳感器有震感,此時,開關(guān)指示燈再回到亮狀態(tài)。振動停止,開關(guān)指示燈也會滅。即振動可以觸發(fā)模塊,從而使開關(guān)指示燈點亮,如圖4-12所示。
示例程序如下:

串口輸出部分數(shù)據(jù)舉例如下:
1023 1023 1023 1023 1023 1023 1023 67 257 1023 1023 1023 1023
通過串口監(jiān)視器,觀察敲擊振動傳感器使其靜止時的數(shù)據(jù)變化,大致確定該振動傳感器能否正常工作。可以看到,當傳感器感受到振動時,數(shù)字會變小。
另外,由于傳感器本身質(zhì)量問題,金屬棒可能不在彈簧正中間,此時傳感器放置在不同方向(例如豎直和平放)時串口輸出數(shù)據(jù)也不同,所以也要測試一下傳感器向不同方向傾斜時的情況,以尋找擺放傳感器的合適角度。
(2)12864LCD液晶顯示屏(帶字庫)。
硬件連接:SPI連接方式如總電路所示,漢字內(nèi)碼轉(zhuǎn)換軟件、LCD12864RSPI庫文件可從網(wǎng)絡(luò)獲取。如果12864庫文件適用版本低,需要修改文件。操作如下:Arduino UNO的SPI為10(SS),11(MOSI),12(MISO),13(SCK)。所以,把LCD12864RSPI.h頭文件中的
Static const int latchPin = 8; Static const int clockPin = 3; Static const int dataPin = 9;
修改為
Static const int latchPin = 10; Static const int clockPin = 13; Static const int dataPin = 11;
同時,將“LCD12864RSPI.cpp”中的開始部分修改為

(3)普通小直流電機+直流電機驅(qū)動板。
L9110 S橋兩路直流電機驅(qū)動板,如果要將裝置應用在真實的房門上,需要動力更大的直流電機,本項目的示意模型只用一個小直流電機即可實現(xiàn)。在后續(xù)測試中發(fā)現(xiàn),直流電機驅(qū)動板在與其他元件接同一個5V電源時,容易出現(xiàn)問題,所以用另一塊開發(fā)板單獨給它供電。
①模塊接口說明。
6P黑色彎排針說明:
1引腳VCC外接2.5~12V電壓;
2引腳GND外接GND;
3引腳IA1外接單片機I/O口;
4引腳IB1外接單片機I/O口;
5引腳IA2外接單片機I/O口;
6引腳IB2外接單片機I/O口。
4P綠端子說明:
1引腳OA1 OB1接直流電機2個引腳,無方向;
2引腳OA2 OB2接直流電機2個引腳,無方向。
②模塊使用說明。
接通VCC,GND模塊電源指示燈亮;
IA1輸入高電平,IA1輸入低電平,【OA1 OB1】電機正轉(zhuǎn);
IA1輸入低電平,IA1輸入高電平,【OA1 OB1】電機反轉(zhuǎn);
IA2輸入高電平,IA2輸入低電平,【OA2 OB2】電機正轉(zhuǎn);
IA2輸入低電平,IA2輸入高電平,【OA2 OB2】電機反轉(zhuǎn)。
測試程序如下,將電機驅(qū)動板的A-IA、A-IB口與開發(fā)板數(shù)字I\O端3、4相連,OA1、OB1接直流電機兩個引腳,無方向,VCC外接5V電壓,GND接地。
#define MOTO_A 3 #define MOTO_B 4 void setup() { pinMode(MOTO_A,OUTPUT); pinMode(MOTO_B,OUTPUT); } void loop() { digitalWrite(MOTO_A,LOW); digitalWrite(MOTO_B,HIGH); delay(2000); digitalWrite(MOTO_A,HIGH); digitalWrite(MOTO_B,LOW); delay(2000); }
(4)RGB三色燈。
RGB三色燈原理和一般的LED不同的是,在RGB LED封裝內(nèi)有3個LED,分別為紅色、綠色和藍色。通過控制各個LED的亮度,可以混合幾乎任何顏色。實驗中用到的是共陰極RGB LED,1個引腳接地,另外3個引腳分別接到Arduino UNO開發(fā)板,注意顏色對應。下面是測試程序,這里用到了Arduino開發(fā)板的D6、D7、D8引腳。

程序下載好后,就可以看到顏色的依次循環(huán)變化。顯示固定顏色的代碼則更簡單,下面以紅燈閃爍為例,紅燈對應腳與Arduino開發(fā)板D6相連,GND腳接地。
#define red_led 6 void setup() { pinMode(6,OUTPUT); } void loop() { digitalWrite(6,LOW); delay(1000); digitalWrite(6,HIGH); delay(1000); }
(5)歌曲旋律的設(shè)置。
①按如下步驟連接好測試電路。12864液晶顯示屏:其D/I口、R/W口、E口分別與Arduino開發(fā)板的數(shù)字I/O端10、11、13相連,K(-)、CS1及VSS與開發(fā)板GND相連,A(+)、VDD與+5V端口相連;振動傳感器:DO口與開發(fā)板的數(shù)字I/O端口2相連,VCC接5V,GND接地;小直流電機與直流電機驅(qū)動板OA1、OB1相連,兩個引腳無方向;電機驅(qū)動板的A-IA、A-IB口與開發(fā)板的數(shù)字I/O端3、4相連,VCC和GND引腳分別接+5V和地;RGB三色燈的GND端口接地,R、G、B引腳分別接數(shù)字I/O口7、6、8。
②在Arduino IDE中寫入該模塊整體代碼。
③修改測試程序。將代碼內(nèi)設(shè)置每兩拍時間間隔的數(shù)組(這個數(shù)組同時確定了每首曲子的總拍數(shù))設(shè)到足夠大,以統(tǒng)計足夠的拍數(shù)。以設(shè)置三首歌為例:
int SingGameArr0[] = {100,100,100,100,100,100,100,100,100,100,100,100,100,100 100,100,100,100,100,100,100,100,100,100,100,100,100,100}; int SingGameArr1[] = {100,100,100,100,100,100,100,100,100,100,100,100,100,100 100,100,100,100,100,100,100,100,100,100,100,100,100,100}; int SingGameArr2[] = {100,100,100,100,100,100,100,100,100,100,100,100,100,100 100,100,100,100,100,100,100,100,100,100,100,100,100,100};
④將程序下載到Arduino UNO開發(fā)板上,打開串口監(jiān)視器和音樂播放軟件,選一首節(jié)奏感比較強的歌,選一段旋律,一邊聽一邊敲振動傳感器,如果熟悉要設(shè)置的歌,并且能保證每次敲的節(jié)奏快慢都一樣,那么就不用播放音樂了。
但是,出于準確性的考慮,代碼中設(shè)置每兩拍的時間間隔只有50ms的容錯,總錯拍數(shù)不超過兩個,要求精確度高,所以建議在設(shè)置節(jié)奏時還是聽著歌敲擊。
⑤觀察記錄串口輸出數(shù)據(jù),對同一段旋律進行多次試驗,對每段旋律統(tǒng)計每兩拍間隔的平均值,記錄的數(shù)據(jù)如表4-4所示。
表4-4 旋律統(tǒng)計數(shù)據(jù)

⑥如果出現(xiàn)只敲一下卻出現(xiàn)一串數(shù)據(jù)的情況,導致每次敲同一段旋律時得到的拍數(shù)不一致,說明這個地方的閾值需要再調(diào)大一點,如圖4-13所示。

圖4-13 閾值設(shè)置點
⑦統(tǒng)計出全部所需旋律后,修改代碼,將它們填入數(shù)組。
⑧重新下載新代碼,敲擊嘗試。因為有誤差存在,不能每次都驗證成功也是正常的。
一般來說,設(shè)置代碼的人更容易開門成功,因為不同的人對同一段旋律的把握也會有差別,就算敲門的人所敲擊的節(jié)奏實際上是準確的,只要設(shè)置旋律的人聽的旋律節(jié)奏有偏差,即使旋律正確也無法驗證成功。
⑨電路圖。電路圖如圖4-14所示。

圖4-14 各模塊的電路圖
2)相關(guān)代碼





3.主程序代碼








- Intel FPGA/CPLD設(shè)計(基礎(chǔ)篇)
- Learning SQL Server Reporting Services 2012
- 深入理解Spring Cloud與實戰(zhàn)
- Linux運維之道(第2版)
- Learning Game Physics with Bullet Physics and OpenGL
- Large Scale Machine Learning with Python
- 分布式系統(tǒng)與一致性
- 電腦高級維修及故障排除實戰(zhàn)
- 筆記本電腦芯片級維修從入門到精通(圖解版)
- 基于網(wǎng)絡(luò)化教學的項目化單片機應用技術(shù)
- The Artificial Intelligence Infrastructure Workshop
- 電腦主板維修技術(shù)
- 多媒體應用技術(shù)(第2版)
- Service Mesh微服務架構(gòu)設(shè)計
- Arduino案例實戰(zhàn)(卷Ⅳ)