여름 휴가동안 뭘할까 하다가 아두이노를 만져보기로 했다.

첫번째 프로젝트는 제일 만만해보이는 커스텀 키패드.

커스텀 가능한 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

+ Recent posts