Brise

두번쩨 프로토 타입 키보드 완성 본문

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->= (analogRead(joystick_axis_x) - 512/ 64// [-8 8]
  joystick->= (analogRead(joystick_axis_y) - 512/ 64;
  joystick->button = digitalRead(joystick_click)?0:1;
}
 
 
cs


반응형
Comments