|
注意:此貼方法不夠現(xiàn)成的穩(wěn)定,已經(jīng)過時,Arduino Micro/Leonardo已經(jīng)可以便宜穩(wěn)定的實現(xiàn)替代功能了,而且不用折騰。建議使用Arduino Micro/Leonardo+自帶的keyboard功能做,方便簡單。
相信很多人看過最近一個Makey makey模擬觸控鍵盤視頻(http://www.56.com/u45/v_NjgzMzc0MDI.html)。視頻里電路板可以接上任何導(dǎo)電體,通過觸摸導(dǎo)電體去給電腦鍵盤事件。來玩各種不同的游戲或者效果。
其中的原理就是通過單片機模擬一個鍵盤,引出幾個鍵,并且使用觸摸形式代替開關(guān)。現(xiàn)在我們使用一塊arduino加上幾個普通元件,也能將這個電路實現(xiàn)出來了。
本文先填鴨式介紹如何制作模擬觸控鍵盤,如果你只是想做一個成品玩的話,可以只看前面部分而不用看原理分析。如果你想知道它的工作原理的話,可以一直看下去。
材料清單:
Arduino(UNO、Duemilanove、NANO均可)
| 1個
| 68Ω電阻(沒有68Ω的話,用50~100Ω電阻也行)
| 2個
| 1.5kΩ電阻(沒有2.2kΩ的話,用1.5k~2.2k電阻也行)
| 1個
| 2.2MΩ電阻(1M~4.7M也行)
| 6個
| USB連接線(一端是USB口另一端是電線,也可以用廢舊鍵盤鼠標拆下來的線)
| 1條
| 3.6v 穩(wěn)壓管(3.3v~3.6v穩(wěn)壓管。建議選用功耗0.25~0.5w的)
| 2個 | 單芯屏蔽電線(6條,每條1~2米)
| 6米 | 鱷魚夾
| 6只 | 萬用板(洞洞板)
| 1塊 |
先不管原理,看看制作步驟:
準備好材料,這里為了減少體積,用了Arduino NANO,并且部分電阻實際用的時候是貼片封裝的。
232915ldrtjhj3jrazjrjj.jpg (180.54 KB, 下載次數(shù): 106)
下載附件
2016-4-18 03:36 上傳
232926hxx7mzxfzfzfa2z6.jpg (140.59 KB, 下載次數(shù): 113)
下載附件
2016-4-18 03:36 上傳
按照下面的電路圖連接電路(PDF版本點擊這里:
pdf.gif (1.91 KB, 下載次數(shù): 117)
下載附件
2016-4-18 03:36 上傳
Arduino模擬觸控鍵盤.pdf(78.65 KB, 下載次數(shù): 809))。
232957f6fvvr9xg8z3wr3e.png (31.61 KB, 下載次數(shù): 116)
下載附件
2016-4-18 03:36 上傳
注意輸入線要用屏蔽線,鱷魚夾端將屏蔽線的芯線接上,屏蔽線懸空;電路板端將芯線接到A0~A5引腳。所有屏蔽線集成一束接到+5v。
用數(shù)據(jù)線(注意是Arduino的數(shù)據(jù)線,不是上面焊的鍵盤線)將下面的程序?qū)懭階rduino中。
23313034m6n3vnnnn8nzhd.jpg (171.1 KB, 下載次數(shù): 131)
下載附件
2016-4-18 03:36 上傳
- #include "UsbKeyboard.h"
- int InData1 = 0, InData2 = 0, InData3 = 0, InData4 = 0, InData5 = 0, InData0 = 0; //觸摸輸入值暫存
- int TouchSensitivity = 30; //觸摸靈敏度。0~1023,越大越不靈敏
- void setup()
- {
- for(int i = A0; i <= A5; i++)
- {
- pinMode(i, INPUT); //A0~A5端設(shè)置為輸入
- //digitalWrite(i, HIGH); //并且上拉
- }
- TIMSK0 &= !(1 << TOIE0);
- }
-
- void loop()
- {
- UsbKeyboard.update();
- //讀取所有引腳電壓值,并且由于上拉電阻原因,
- //默認所有引腳為最高電平1023,通過觸摸拉低引腳電平。
- //所以數(shù)值由1024-analogRead(A0);
- InData0 = 1024 - analogRead(A0);
- InData1 = 1024 - analogRead(A1);
- InData2 = 1024 - analogRead(A2);
- InData3 = 1024 - analogRead(A3);
- InData4 = 1024 - analogRead(A4);
- InData5 = 1024 - analogRead(A5);
- //按照各種可能觸發(fā)鍵盤事件
- if(InData0 >= TouchSensitivity)
- {
- UsbKeyboard.sendKeyStroke(79); //right
- }
- if(InData1 >= TouchSensitivity)
- {
- UsbKeyboard.sendKeyStroke(80); //left
- }
- if(InData2 >= TouchSensitivity)
- {
- UsbKeyboard.sendKeyStroke(81); //down
- }
- if(InData3 >= TouchSensitivity)
- {
- UsbKeyboard.sendKeyStroke(82); //up
- }
- if(InData4 >= TouchSensitivity)
- {
- UsbKeyboard.sendKeyStroke(KEY_SPACE);
- }
- if(InData5 >= TouchSensitivity)
- {
- UsbKeyboard.sendKeyStroke(KEY_ENTER);
- }
- delay(100);
- }
復(fù)制代碼
拔掉Arduino數(shù)據(jù)線,將鍵盤線插到電腦USB口,即出現(xiàn)新硬件“USB輸入設(shè)備”,一般XP和win7都免驅(qū)動自動識別。
找一些含水分的物體(比如makey里面的香蕉,橡皮泥等),鱷魚夾夾住一頭,觸碰物體即可打字。
原理分析:
1、觸摸部分
* 此虛擬鍵盤使用觸摸作為輸入方法,所以可靠的觸摸響應(yīng)非常必要。常見的觸摸開關(guān)有兩種:
- 一種是雙觸點的觸摸開關(guān),將觸摸端和地端引出,連接到兩塊觸摸電極上,人觸摸兩個極的時候,由于人體電阻的關(guān)系,兩觸摸電極之間有一定電流流過,通過檢測這個電流大小即可檢測出觸摸事件。Makey的虛擬鍵盤就是這種方法;
- 另一種是單觸點的觸摸開關(guān),人手只需要觸摸一個極板,用人體和大地來做回路,這種方法用戶體驗最好。但是如果直接將觸摸電路的地端接家里的地線,人觸摸感應(yīng)輸入端的話,那觸摸就不能響應(yīng)了。因為人體和大地并不是真實的導(dǎo)體,而是通過水分,以及導(dǎo)體間的電容等導(dǎo)電的,對于直流電來說,由于電壓只有5v,相應(yīng)回路電阻很大。經(jīng)過回路之后,電壓不足以實現(xiàn)觸摸功能,所以在這里我們借助高壓電做媒介,讓人體和大地有足夠電流形成可以響應(yīng)的回路。原理圖如下圖,將Arduino的GND端通過一個高阻值電阻RH接到市電的火線,人觸摸A0端的時候,220v市電將通過高值電阻RH以及單片機傳到人手上,然后通過大地形成回路。由于220v電壓較高并且是交流電,通過高值的電阻以及人體、大地等導(dǎo)體之后仍然可以有足夠的電壓去給單片機響應(yīng)。
* 由于觸摸部分對周圍的電磁干擾比較敏感,觸摸板與Arduino連接線必須使用屏蔽線。六根屏蔽線的芯線接A0~A5,屏蔽層接電源正極(+5v)
* 此處是使用了外置的2.2MΩ上拉電阻,常態(tài)時輸入端是高電壓,所以默認AD轉(zhuǎn)換數(shù)值是1023,通過觸摸GND和A0~A5,令輸入電壓降低,從而改變輸入的AD數(shù)值。當(dāng)AD數(shù)值降低到一定程度(變量TouchSensitivity決定)的時候,就認為該觸摸板有事件響應(yīng)。如果觸摸靈敏度不適合的話,可以調(diào)整變量TouchSensitivity的值來改變靈敏度。值越大靈敏度越低。
2、Arduino模擬鍵盤部分:
由于Arduino主芯片是一片AVR單片機,通過AVRUSB,我們可以將Arduino虛擬成一個鍵盤。詳細原理可以參考這篇文章:http://www.zg4o1577.cn/bbs/dpj-48558-1.html
文章詳細解釋了Arduino模擬鍵盤的原理和電路,此處就不再詳細解釋了。
我做好實物(A0~A5引線還沒引出):
104813sbmb4ttz2s2gtb12.jpg (165.8 KB, 下載次數(shù): 99)
下載附件
2016-4-18 03:36 上傳
|
|