여름 휴가동안 뭘할까 하다가 아두이노를 만져보기로 했다.
첫번째 프로젝트는 제일 만만해보이는 커스텀 키패드.
커스텀 가능한 4x4 매트릭스에 ESC키, 키 팔레트를 스왑할 수 있는 Fn 키를 추가해서 디자인했다.
아래는 코드.
키 팔레트는 배열로 구성돼있고 팔레트 스왑용 Fn키는 토글로 작동한다.
A0~A3 핀에 순차적으로 인풋을 넣고 A4~A7을 스캔해서 키 입력을 출력한다.
아직은 테스트 전이므로 실제 작동하는지는 해봐야알듯
인풋쪽 전압이 올라가면 키가 입력되도록 코드를 짰는데,
인풋 중 하나에 전압이 가해지면 GND로 빠져나갈때까지 계속 키입력 신호가 들어가는걸로 보인다
일단 실패한 코드같아서 수정 필요..
#include <Keyboard.h>
//Key Set
const byte Pin_X[4] = {A0, A1, A2, A3};
const byte Pin_Y[4] = {A4, A5, A6, A7};
const int DT = 50;
int FN = 0;
uint8_t KeySet[2][4][4] =
{
{
{'1', '2', '3', '4'},
{'q', 'w', 'e', 'r'},
{'a', 's', 'd', 'f'},
{'z', 'x', 'c', 'v'}
},
{
{'a', 'b', 'c', 'd'},
{'e', 'f', 'g', 'h'},
{'i', 'j', 'k', 'l'},
{'m', 'n', 'o', 'p'}
}
};
void setup()
{
Serial.begin(9600);
Keyboard.begin();
for (int Ix = 0 ; Ix < 4 ; Ix++ )
{
pinMode(Pin_X[Ix], OUTPUT);
}
for (int Iy = 0 ; Iy < 4 ; Iy++ )
{
pinMode(Pin_Y[Iy], INPUT);
}
pinMode(0, OUTPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);
}
void loop()
{
digitalWrite(0, HIGH);
if (digitalRead(1, HIGH)) //ESC
{
Keyboard.press(KEY_ESC);
delay(DT);
Keyboard.releaseAll();
delay(DT);
}
if (digitalRead(2, HIGH)) //FN
{
if (FN == 0) FN = 1;
else FN = 0;
delay(DT);
}
digitalWrite(0, LOW);
for (int Kx = 0; Kx < 4; x++) //Key Matrix
{
digitalWrite(Pin_X[Kx], HIGH);
for (int Ky = 0; Ky < 4; y++)
{
if (digitalRead(Pin_Y[Ky]), HIGH)
{
Keyboard.press(KeySet[FN][Kx][Ky]);
delay(DT);
Keyboard.release(KeySet[FN][Kx][Ky]);
delay(DT);
}
else
{
Keyboard.release(KeySet[FN][Kx][Ky]);
}
}
digitalWrite(Pin_X[x], LOW);
}
}
결국 새로 수정한 코드.
요건 잘된다!
#include <Keyboard.h>
//Key Set
const byte Pin_X[4] = {A0, A1, A2, A3};
const byte Pin_Y[4] = {4, 5, 6, 7};
const int DT = 100;
int FN = 0;
uint8_t KeySet[2][4][4] =
{
{
{'1', '1', '1', '1'},
{'2', '2', '2', '2'},
{'3', '3', '3', '3'},
{'4', '4', '4', '4'}
},
{
{'a', 'b', 'c', 'd'},
{'e', 'f', 'g', 'h'},
{'i', 'j', 'k', 'l'},
{'m', 'n', 'o', 'p'}
}
};
void setup()
{
Serial.begin(9600);
Keyboard.begin();
for (int Ix = 0 ; Ix < 4 ; Ix++ )
{
pinMode(Pin_X[Ix], INPUT_PULLUP);
}
for (int Iy = 0 ; Iy < 4 ; Iy++ )
{
pinMode(Pin_Y[Iy], OUTPUT);
}
pinMode(10, OUTPUT);
pinMode(8, INPUT_PULLUP); //ESC
pinMode(9, INPUT_PULLUP); //FN
}
void loop()
{
digitalWrite(10, LOW);
if (digitalRead(8)) Keyboard.release(KEY_ESC);
else
{
Keyboard.press(KEY_ESC);
delay(DT);
}
if (digitalRead(9) == LOW)
{
if (FN == 1) FN = 0;
else FN = 1;
delay(DT);
}
digitalWrite(10, HIGH);
for (int Kx = 0; Kx < 4; Kx++) //Key Matrix
{
for (int Ky = 0; Ky < 4; Ky++)
{
digitalWrite(Pin_Y[Ky], LOW);
if (digitalRead(Pin_X[Kx])) Keyboard.release(KeySet[FN][Kx][Ky]);
else
{
Keyboard.press(KeySet[FN][Kx][Ky]);
delay(DT);
}
digitalWrite(Pin_Y[Ky], HIGH);
}
}
}
완성~🤗
'Hobby' 카테고리의 다른 글
근황 (0) | 2021.09.12 |
---|---|
아두이노 키보드 관련 이것저것 (0) | 2021.08.17 |
요즘 취미 (0) | 2020.06.13 |
개인적으로 연구해서 적는 로아 기공사 스킬트리 (0) | 2018.12.17 |
로아 오픈베타 후기 (4) | 2018.11.10 |