01.jpg (2.01 MB, 下載次數: 85)
下載附件
2021-3-14 10:26 上傳
簡介如果你希望把舊筆記本鍵盤改造為usb的形式,或者你希望對已有的鍵盤進行深層次的改造。那么你可能需要了解所需要改造的鍵盤上按鍵排布的方式以及排線定義!過去這個過程是艱難且漫長的,你需要使用一些簡易的自制工具對每個引腳進行檢測,這往往需要耗費大量的時間。
本工具可以為你做的事情- 免除大量對飛線焊接
- 實時掃描按鍵,并輸出對應的引腳映射
- 串口輸出按下的按鍵(如果存在按鍵映射表)
- 全自動生成按鍵映射表(未實現)
- 實現usb按鍵(未實現)
材料- Stm32F103 最小系統板子 (可用國產HK32F103替代)
- FPC轉接板 (可以前往立創eda社區,下載開源的PCB文件,并且5元打板制造)
- FPC轉接底座 (通常使用1.0間距 建議先量一量鍵盤排線的長度)
- 一些杜邦線
步驟- 安裝FPC轉接板
- 把鍵盤插到FPC轉接板上
- 通過杜邦線從FPC轉接板上再次轉接到Stm32F103最小系統板子上
- 使用Arduino IDE編譯固件上傳 (需要手動設置gpio :按照上一步接線的情況進行設置)
03.png (40.77 KB, 下載次數: 90)
下載附件
2021-3-14 10:26 上傳
- 打開串口監視器,并嘗試按下鍵盤(插在FPC轉接板上的)上的任意鍵,觀察串口監視器是否有相應輸出
02.png (144.66 KB, 下載次數: 90)
下載附件
2021-3-14 10:26 上傳
串口輸出數據格式- 探針:指的是作為探針的引腳,該引腳會在掃描時輸出高電平
- 接收:當前除探針外剩下的引腳進入輸入模式,試圖接收來自探針引腳的信號
- 探針[KBPinMap下標]:探針Pin
- 接收[KBPinMap下標]:接收Pin
試試看
04.png (6.21 KB, 下載次數: 95)
下載附件
2021-3-14 10:26 上傳
解析:數組KBPinMap第11項與開發板對應的33號(PC14)引腳 輸出高電平 并且被 數組KBPinMap第6項與開發板對應的1號(PA3)引腳 接收到,這意味著這時鍵盤上對應的這兩個引腳是對應關系
Arduino源程序:
- #define SWAP(x, y) \
- (y) = (x) + (y); \
- (x) = (y) - (x); \
- (y) = (y) - (x);
- //按鍵映射表,按需修改
- //{探針id,接收id,ASCII}
- byte KeyMap[][3]={
- {5,19,'1'},
- {5,18,'2'},
- {6,19,'3'},
- {8,19,'6'},
- {8,18,'7'},
- {9,19,'8'},
- {5,17,'q'},
- {5,20,'w'},
- {6,18,'e'},
- {8,17,'y'},
- {9,17,'u'},
- {9,18,'i'},
- {10,20,'o'},
- {5,21,'a'},
- {6,20,'s'},
- {6,17,'d'},
- {8,20,'h'},
- {9,20,'j'},
- {9,21,'k'},
- {10,21,'l'},
- {5,22,'z'},
- {6,21,'x'},
- {6,22,'c'},
- {8,22,'b'},
- {8,21,'n'},
- {9,22,'m'},
- {10,22,'<'},
- {11,22,'>'},
- {11,21,'/'},
- };
- //KBPinMap 按照鍵盤排線接入開發板的順序填寫引腳設定
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
- int KBPinMap[] = {PB12, PB13, PB14, PB15, PC13, PA4, PA3, PA2, PA1, PA0, PC15, PC14, PB5, PB6, PB7, PB8, PB9, PB11, PB10, PB0, PB1, PA7, PA6, PA5};
- int KBScan[] = {0};
- /*
- @函數 ScanKeyMap
- @作用 搜索按鍵映射表并輸出按鍵映射
- @傳入
- byte a 探針id
- byte b 接收id
- @傳出
- char
- */
- char ScanKeyMap(byte a,byte b){
- if (a>b) {
- byte c=a;
- a=b;
- b=c;
- }
- for (int i=0;i<sizeof(KeyMap)/sizeof(KeyMap[0]);i++) {
- if (KeyMap[i][0]==a&&KeyMap[i][1]==b) return KeyMap[i][2];
- }
- char printBuffer[50];
- sprintf(printBuffer, "--- error a:%d b:%d ---",a,b);
- Serial1.print(printBuffer);
- return 0;
- }
- /*
- @函數 ScanPin
- @作用 使能某個引腳作用為探針,并對接收腳進行掃描
- @傳入
- int KBPinMapNum 探針引腳
- @傳出 -
- */
- void ScanPin(int KBPinMapNum) {
- //設置所有引腳為輸入模式
- AllPinIN();
- //設置探針引腳輸出
- pinMode(KBPinMap[KBPinMapNum], OUTPUT);
- digitalWrite(KBPinMap[KBPinMapNum], HIGH);
- //輪詢引腳,是否有輸出電平
- char printBuffer[50];
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
- if (i == KBPinMapNum) continue; //跳過探針引腳
- if (analogRead(KBPinMap[i])>2000) {
- KBScan[i] = 1;
- sprintf(printBuffer, "%c # 探針[%d]:%d -> 接收[%d]:%d",ScanKeyMap(KBPinMapNum,i), KBPinMapNum, KBPinMap[KBPinMapNum], i, KBScan[i]);
- Serial1.println(printBuffer);
- }
- }
- }
- /*
- @函數 ClearKBScan
- @作用 清除接收引腳狀態表
- @傳入 -
- @傳出 -
- */
- void ClearKBScan() {
- memset(KBScan,0,sizeof(KBScan) / sizeof(KBScan[0]));
- /*
- for (int i = 0; i < sizeof(KBScan) / sizeof(KBScan[0]); i++)
- KBScan[i] = 0;
- */
- }
- /*
- @函數 AllPinOut
- @作用 全部引腳IO設置為輸出模式
- @傳入 -
- @傳出 -
- */
- void AllPinOut() {
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
- pinMode(KBPinMap[i], OUTPUT);
- digitalWrite(KBPinMap[i], HIGH);
- }
- }
- /*
- @函數 AllPinIN
- @作用 全部引腳IO設置為輸入模式
- @傳入 -
- @傳出 -
- */
- void AllPinIN() {
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++)
- pinMode(KBPinMap[i], INPUT_PULLDOWN);
- }
- /*
- @函數 SerialPrintAllKBScan
- @作用 串口輸出 引腳狀態表
- @傳入 -
- @傳出 -
- */
- void SerialPrintAllKBScan() {
- char printBuffer[50];
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
- sprintf(printBuffer, "[%d]-%d ", i, KBScan[i]);
- Serial1.print(printBuffer);
- }
- Serial1.print("\n\r");
- }
- void setup() {
- Serial1.begin(115200);
- Serial1.println(" *]]*");
- Serial1.println(" *]]OOO@@@@| ");
- Serial1.println(" ,]]|OOO@@@@@@@@@@| ");
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (4.04 KB, 下載次數: 99)
下載附件
2021-3-14 15:04 上傳
項目文件
|