DIY/자작 키보드
두번쩨 프로토 타입 키보드 완성
naudhizb
2017. 5. 21. 12:46
반응형
일전에 만든 프로토 타입 키보드가 단선 문제로 말썽을 일으켜서 좀 더 발전시킨 프로토 타입 키보드를 만들었습니다.
제가 만들고 싶은 키보드가 셀프 프로그래밍이 가능한 키보드이기 때문에 이를 가능하게 하기 위한 기초 코딩이 들어가 있습니다.
그리고 이 코드를 발전 시켜서 앞으로 최종 버전의 프로토타입 키보드를 완성 시킬 계획입니다.
최종 버전에는 아마도 아트메가 마이크로 프로세서를 이용한 버추얼 유에스비가 들어가지 않을까 생각하고 있습니다.
소스코드는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <stdint.h> #include <Keyboard.h> #include <Mouse.h> #define KEYBOARD_COL_NUM 3 typedef enum _key_pin_num_e { key_col_1 = 3, key_col_2, key_col_3, key_row_1, // drive LOW } key_pin_num_e; int key_pin_col_arr[KEYBOARD_COL_NUM] = { key_col_1, key_col_2, key_col_3 }; uint8_t key_col_arr[KEYBOARD_COL_NUM] = { KEY_LEFT_CTRL, KEY_LEFT_ALT, KEY_DELETE }; typedef enum _joystick_pin_num_e { joystick_axis_x = A0, joystick_axis_y = A1, joystick_click = 15 } joystick_pin_num_e; typedef struct joystick_st { int32_t x; int32_t y; uint8_t button; } joystick_t; void keyboard_init(); void keyboard_scan(uint8_t *arr); void joystick_init(); void joystick_scan(joystick_t *joystick); void setup() { // put your setup code here, to run once: keyboard_init(); joystick_init(); Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: uint8_t keyboard_state[KEYBOARD_COL_NUM]; joystick_t joystick_state; keyboard_scan(keyboard_state); joystick_scan(&joystick_state); for(int i = 0; i < KEYBOARD_COL_NUM; i++){ if (keyboard_state[i] == 1){ Keyboard.press(key_col_arr[i]); } else { Keyboard.release(key_col_arr[i]); } } Mouse.move(joystick_state.x, joystick_state.y, 0); if(joystick_state.button){ if(!Mouse.isPressed(MOUSE_LEFT)){ Mouse.press(MOUSE_LEFT); } } else { if(Mouse.isPressed(MOUSE_LEFT)){ Mouse.release(MOUSE_LEFT); } } Serial.print(keyboard_state[0]); Serial.print('\t'); Serial.print(keyboard_state[1]); Serial.print('\t'); Serial.print(keyboard_state[2]); Serial.print('\t'); Serial.print(joystick_state.x); Serial.print('\t'); Serial.print(joystick_state.y); Serial.print('\t'); Serial.print(joystick_state.button); Serial.println('\t'); delay(10); } /* keyboard matrix start */ void keyboard_init(){ // keyboard pinMode(key_col_1, INPUT_PULLUP); pinMode(key_col_2, INPUT_PULLUP); pinMode(key_col_3, INPUT_PULLUP); pinMode(key_row_1, OUTPUT); digitalWrite(key_row_1, HIGH); Keyboard.begin(); } void keyboard_scan(uint8_t *arr){ int i; uint8_t pin_state; i = 0; pin_state = 0; digitalWrite(key_row_1, LOW); for(i = 0; i < KEYBOARD_COL_NUM; i++){ pin_state = digitalRead(key_pin_col_arr[i]); arr[i] = pin_state?0:1; } digitalWrite(key_row_1, HIGH); } /* keyboard matrix end */ void joystick_init(){ // joystick pinMode(joystick_click, INPUT_PULLUP); Mouse.begin(); } void joystick_scan(joystick_t *joystick){ joystick->x = (analogRead(joystick_axis_x) - 512) / 64; // [-8 8] joystick->y = (analogRead(joystick_axis_y) - 512) / 64; joystick->button = digitalRead(joystick_click)?0:1; } | cs |
반응형