ARDUINO從入門到創(chuàng)客帶師第一彈 按鍵精靈(物理) 玩游戲不想重復(fù)簡單操作怎么辦? 不想按空格了 簡單做個基于ARDUINO單片機(jī)開發(fā)板的物理按鍵精靈吧 Leonardo相較前文的其他型號開發(fā)板直接使用了ATmega32u4的USB通信功能,取消了USB轉(zhuǎn)UART芯片??梢钥吹缴蠄DLEONARDO的標(biāo)準(zhǔn)ARDUINO開發(fā)板并沒有之前D1或者UNO的USB轉(zhuǎn)串口芯片CH341或者CP210X,而是直接用的USB直連MCU, 這使得它不僅可以作為一個虛擬的COM端口,還可以作為鼠標(biāo)或者鍵盤連接到計算機(jī)。ATmega32u4提供了UART TTL(5V)的通信方式,32u4還允許通過USB在電腦上虛擬COM端口來進(jìn)行虛擬串行(CDC)通信。這個芯片使用標(biāo)準(zhǔn)的USB串行驅(qū)動(在Windows上需要一個.inf文件),可以作為一個全速USB2.0設(shè)備。本文就是利用搭載這個型號單片機(jī)的開發(fā)板作為虛擬HID設(shè)備使用 HID是Human Interface Device的縮寫,由其名稱可以了解HID設(shè)備是直接與人交互的設(shè)備,例如鍵盤、鼠標(biāo)與游戲桿等。不過HID設(shè)備并不一定要有人機(jī)接口,只要符合HID類別規(guī)范的設(shè)備都是HID設(shè)備,利用LEONARDO做按鍵精靈就可以不需要人來操作單片機(jī)直接利用單片機(jī)的程序輸出,沒有人機(jī)接口 和其他的標(biāo)準(zhǔn)開發(fā)板一樣,LEONARDO標(biāo)準(zhǔn)板的左下方有個5.5*2.1DC輸入口,直流電源經(jīng)過AMS1117穩(wěn)壓給開發(fā)板供電,可以輸入6V-20V。但是,如果低于7V,5V引腳將提供小于5V的電源,控制板可能會不穩(wěn)定。如果使用大于12V的電源穩(wěn)壓器可能過熱,從而損壞電路板。推薦的范圍是7V-12V。ATmega32u4具有32KB的Flash(其中4KB被引導(dǎo)程序使用)。它還有2.5KB的SRAM和1KB的EEPROM 其實LEONARDO的實際應(yīng)用方向上來看基本都是作為HID方向的,無論是BADUSB還是模擬鍵鼠,相比更常見的UNO活著基于8266的D1等開發(fā)板來說其實使用面更窄?,F(xiàn)在大伙都喜歡搞物聯(lián)網(wǎng),什么東西都要弄個WIFI芯片連上網(wǎng),就顯得高大上了。就連小米的臺燈都帶個8266,對著手機(jī)說話就可以定時開關(guān)燈或者調(diào)亮度調(diào)色之類的,也許過不了多長時間對著手機(jī)說話就可以給廁所沖水,如果出門想起來家里廁所忘了沖,可以對手機(jī)說話就能讓廁所沖水,非常實用。 有一說一ESP8266成本便宜應(yīng)用范圍廣而且性能相比之下還更高,還能享受ARDUINO的環(huán)境和庫,編程習(xí)慣友好當(dāng)然用的人就多了。 硬件部分: 這次其實非常簡單,只需要采購一個開發(fā)板就可以了,搜索的時候最好是按銷量來,一般天貓的東西普遍比較貴但是它們買了搜索所以如果不仔細(xì)看的話很容易買貴,大伙都不是傻子同樣的東西賣的價格相差太遠(yuǎn)當(dāng)然沒人買了。所以按實際銷量來的話搜索結(jié)果里的標(biāo)價比較接近商品的實際價值。一般買左上那個17.2包郵的NANO小板型就行,右上那個20塊錢的標(biāo)準(zhǔn)版也可以 LEONARDO更多的應(yīng)用方向并不需要太多的IO,除非你打算拿它DIY機(jī)械鍵盤……圖吧垃圾佬會需要自己DIY機(jī)械鍵盤?二手鍵盤30塊錢一個,不能再多。洗一下接著用 此外咱個人來說只要鍵盤手感好是不是機(jī)械的完全無所謂,機(jī)械鍵盤再機(jī)械,也沒有咱自己30塊錢收的打字機(jī)鍵盤機(jī)械,這可真是純·機(jī)械鍵盤,手感那是真的爽,手勁不夠大的話都打不出字 之所以現(xiàn)在的機(jī)械鍵盤這么多人喜歡主要還是普通的廉價鍵盤手感太次,筆記本也好臺式機(jī)也好,大多數(shù)的鍵盤都不是什么好東西,如今IBM也不在了很少有人再覺得用筆記本自帶的鍵盤和指點(diǎn)桿出門真的可以不需要鍵鼠的感覺,現(xiàn)在的筆記本鍵盤手感基本沒比敲桌子好到哪,所以也無外乎有人面對投影鍵盤也能用得下去。而我個人覺得臺式機(jī)的話大多數(shù)人也并不會上羅技……羅技的鍵盤真的好用,相比機(jī)械也不差。 此外本篇教程的契機(jī)就是因為機(jī)械鍵盤連按空格太吵所以才會需要硬件模擬按鍵……其實我個人對于鍵盤的要求是要靜音,手感好是其次,咱過去最極限的時候為了靜音讓鍵盤實現(xiàn)零噪音甚至可以在實體店花高價去買可以折起來的“軟”鍵盤,那是真的手感基本和啃輪胎一樣但是確實沒有噪音,媽媽再也不知道我在電腦桌干什么了。 不要相信什么意大利原裝進(jìn)口,這東西都是開源的,Arduino的硬件原理圖、電路圖、IDE等軟件和核心庫都是開源的,開發(fā)人員可以在開源協(xié)議的范圍內(nèi)任意修改原始設(shè)計及相應(yīng)的代碼。華強(qiáng)北產(chǎn)的和所謂意大利的沒有本質(zhì)區(qū)別。即使是華強(qiáng)北的開發(fā)板,用的也都是質(zhì)量合格的元件,不存在質(zhì)量問題。根據(jù)實際經(jīng)驗反倒是高價的所謂正版更容易GG,至少咱以前實驗室的沙雕同學(xué)是炸的155的開發(fā)板,咱自己十塊二十塊的倒是一直用到現(xiàn)在。 LEONARDO需要用USB數(shù)據(jù)線連接到電腦,這個一般的開發(fā)板都會給,不給也頂多加一兩塊錢。此外LEONARDO用的是MICROUSB接口,一般這種接口的老式數(shù)據(jù)線一般人家都會有,如果沒有的話買一兩根質(zhì)量好點(diǎn)的線也沒多錢,1米5的針織軟包屏蔽線兩根也就10多塊錢包郵 此外我們還需要做一個觸發(fā),讓開發(fā)板決定什么時候該重復(fù)哪些按鍵,可以是個帶線開關(guān)或者干脆找根杜邦線,上期如果跟著我們做了CPU溫度顯示的話這會兒手上應(yīng)該有現(xiàn)成的杜邦線,到時候可以直接把它接在開發(fā)板上充當(dāng)開關(guān)(以上這段可以//了,實際使用上并沒有設(shè)計程序開關(guān),上電自動執(zhí)行,不想用直接拔了) 如果將來有用這個板子做鼠標(biāo)指點(diǎn)桿或者說搖桿的需求,可以考慮買個XY軸搖桿,三四塊錢吧,如果想簡單做個小鍵盤功能鍵比如音量加減之類的,可以買個矩陣鍵盤,5塊錢左右 需要旋鈕就可以搞個編碼器,總之ARDUINO外號叫電子積木,什么東西只要想要就隨手可以買回來,裝上庫加上代碼就可以用了 軟件部分 首先為完成這個目的,需要庫文件: #include <Keyboard.h> //USB鍵盤庫(這是鍵盤操作的庫,只能在Arduino Leonardo系列的開發(fā)板上使用,如果在Arduino UNO 上編譯的話,會報錯) //#include <HID.h> //HID設(shè)備庫(keyboard庫調(diào)用著這個庫) ARDUINO環(huán)境的安裝咱就不說了,上期造CPU溫度顯示的時候已經(jīng)說過了 建議小白選EXE直接安裝就行了,全自動安裝不用考慮別的太多。 把開發(fā)板通過數(shù)據(jù)線有效連接在電腦上,所謂有效連接就是最好是直接連接USB接口,不經(jīng)過延長線或者轉(zhuǎn)接卡,否則可能會出現(xiàn)供電不足 正常識別之后,驅(qū)動應(yīng)該能自動安裝 WIN7 64位如果裝不上驅(qū)動,請按照這個教程進(jìn)行 反正我遇到這個問題之后直接投降掏出自帶XP的T43接著裝ARDUINO了,反正又不是不能用 我們的目的是把開發(fā)板插入電腦后,自動重復(fù)空格按鍵 能完成目的就行 Arduino的程序結(jié)構(gòu)與傳統(tǒng)的c程序結(jié)構(gòu)有所不同——Arduino程序中沒有main函數(shù)。其實并不是Arduino程序中沒有main函數(shù),而是main函數(shù)的定義隱藏在了Arduino的核心庫文件中。在進(jìn)行Arduino開發(fā)中不直接操作main函數(shù),而是使用setup和loop這兩個函數(shù)。 setup() Arduino控制器通電或者復(fù)位后,就會開始執(zhí)行Arduino的初始化配置(IO口 串口等); loop() setup函數(shù)執(zhí)行完畢后,Arduino會接著執(zhí)行l(wèi)oop()函數(shù)中的程序。而loop函數(shù)是一個死循環(huán),其中的程序會不斷地重復(fù)運(yùn)行。通常在loop函數(shù)中完成程序的主要功能,如驅(qū)動各種模塊和采集數(shù)據(jù)等。 先在Arduino IDE里新建一個文件,導(dǎo)入資源庫: #include <Keyboard.h> 然后這個庫常見的函數(shù)如下:開始鍵盤通訊: Keyboard.begin();//開始鍵盤通訊 按鍵操作: Keyboard.press(); 與按鍵對應(yīng)的是釋放: Keyboard.release(); Keyboard.releaseAll(); 是松開所有的按鍵; 當(dāng)然還可以輸入:Keyboard.println(""); 最后是結(jié)束鍵盤通訊:Keyboard.end();//結(jié)束鍵盤通訊 有了這些就可以實現(xiàn)我們的目的了 此外,對于Keyboard這個庫的命令來說,括號中使用ASCII數(shù)值來確定輸入 ASCII值的表格 特殊按鍵 Failed to find GetFileInformationByHandleEx procedure in kernel32.dll可還行 老話叫缺啥補(bǔ)啥,下載之后解壓/復(fù)制到指定位置就行了 還是不行那就在xp上安裝vc2012/2013運(yùn)行庫 還是一樣報錯,行吧,好在咱還有WIN10,這次的WIN10比上次的好用點(diǎn),至少開機(jī)不會不知道為啥就把筆記本的CPU跑100%還睿頻了 #include <Keyboard.h> void setup() { // put your setup code here, to run once:} void loop() {Keyboard.press(32) Keyboard.release(32) // put your main code here, to run repeatedly: } 基本上在搞明白庫和函數(shù)之后,ARDUINO大部分的時間都是在改BUG,比如這次的代碼就缺了兩個;——在編譯之后報錯信息會告訴你怎么改,只要你能稍微懂點(diǎn)英文 這樣編譯完成就可以上傳了 然后就成功了,這次上傳完事了之后ARDUINO LEONARDO自動重啟了之后就開始自動鬼畜空格了,完美 這是完整的 #include <Keyboard.h> void setup() { // put your setup code here, to run once: } void loop() {Keyboard.press(32); Keyboard.release(32) // put your main code here, to run repeatedly: ;} 進(jìn)階:加上鼠標(biāo)的操作 游戲中跑步和踩車機(jī)需要用到一個空格,但是舉重需要空格+鼠標(biāo)交替連點(diǎn) 那么實現(xiàn)起來就需要涉及到鼠標(biāo) 這里其實就是在開頭加上個鼠標(biāo)庫#include "Mouse.h" 然后在LOOP的那行代碼底下加上函數(shù)實現(xiàn)Mouse.click(MOUSE_LEFT)反復(fù)按左鍵這么簡單 其實關(guān)于ARDUINO LEONARDO這種USB HID類設(shè)備還有很多比物理按鍵精靈更有意思的玩法,比如自制BADUSB通過固件層實現(xiàn)對設(shè)備的滲透,這個咱可以以后再說 這里有一個可以做一個簡單的自制鼠標(biāo)鍵盤的教程,建議各位觀摩學(xué)習(xí): Arduino模擬鼠標(biāo)鍵盤-Arduino中文社區(qū) 以上 就這樣 PS:這次阿卡林大佬我在尋求幫助的時候說自己還沒玩過這個,有點(diǎn)意外。好在咱要實現(xiàn)的功能簡單,憑咱自己沒學(xué)過C語言的水平居然也能對付,要么怎么說ARDUINO真的是神器呢,對小白不要太友好。這回兒要是沒有環(huán)境或者像51 STM32那種反人類環(huán)境的話沒準(zhǔn)咱就放棄了,C語言從入門到放棄,太真實了 |
|