- //(1)シリアルLEDライブラリ(配布先 https://github.com/adafruit/Adafruit_NeoPixel)
- #include <Adafruit_NeoPixel.h>
- //(2)Arduino HID Project 2.4.4(配布先 https://github.com/NicoHood/HID#arduino-hid-project-244)
- #include <HID-Project.h>
- #include <HID-Settings.h>
- //キーコード指定
- #define KC_NUML 0x53 // [NUM LOCK]
- //KEY SCAN用 I/O定義
- #define ROW_NUM 7
- #define COL_NUM 4
- const int rowPins[ROW_NUM] = { 2, 3, 4, 5, 6, 7, 8 }; // OUTPUT指定
- const int colPins[COL_NUM] = { 9, 10, 16, 14 }; // INPUT_PULLUP指定
- //LED制御用 I/O定義
- #define NUMPIXELS 1 // シリアルLED個数
- #define NUM_LOCK_LED 21 // NumLock/動作モード状態LEDポート番号
- //シリアルLED定義
- // D2812 = NEO_RGB
- // WS2812B = NEO_GRB
- Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, NUM_LOCK_LED, NEO_GRB + NEO_KHZ800); //NumLock LED制御Pin初期化
- //NumLock・LED制御
- int R[3]; // LED色 Red (0-255)
- int G[3]; // LED色 Green(0-255)
- int B[3]; // LED色 Blue (0-255)
- //KEY状態制御用配列定義
- //KEY状態を前回と最新状態で比較して、変化があった場合にキーコードを送信する
- bool cur_key_sts[ROW_NUM][COL_NUM]; //最新のKEY状態
- bool old_key_sts[ROW_NUM][COL_NUM]; //前回のKEY状態
- void setup()
- {
- // put your setup code here, to run once:
- //キースキャン行のPinを初期化する
- for (int i = 0; i < ROW_NUM; i++)
- {
- pinMode(rowPins[i], OUTPUT);
- }
- //キースキャン列のPinを初期化する
- for (int i = 0; i < COL_NUM; i++)
- {
- pinMode(colPins[i], INPUT_PULLUP);
- }
- //キー状態を初期化する
- for (int row = 0; row < ROW_NUM; row++)
- {
- //キー状態を「リリース」とする
- for (int c = 0; c < COL_NUM; c++)
- {
- cur_key_sts[row][c] = HIGH;
- old_key_sts[row][c] = HIGH;
- }
- //キースキャン行のPinをHIGH(inactive)にする
- digitalWrite(rowPins[row], HIGH);
- }
- //LED表示初期化(各動作モード別にRGBで色指定する)
- //色1=緑
- R[0]=0;
- G[0]=10;
- B[0]=0;
- //シリアルLEDライブラリ初期化
- pixels.begin();
- //HIDデバイス初期化(ホストLED状態取得用)
- BootKeyboard.begin();
- }
- void loop()
- {
- // put your main code here, to run repeatedly:
- static int mode = 0;//色変更用
- //キー押下状態変化なしとする(フラグ初期化)
- int chg = 0;
- // key matrix scan
- for (int row = 0; row < ROW_NUM; row++)
- {
- // 行指定:キースキャン開始(LOW出力)
- digitalWrite(rowPins[row], LOW);
- for (int col = 0; col < COL_NUM; col++)
- {
- // 列指定:キー状態読み出し(押下:LOW)
- cur_key_sts[row][col] = digitalRead(colPins[col]);
- // 前回の状態と変化あり?
- if (cur_key_sts[row][col] != old_key_sts[row][col])
- {
- //「キー押下状態変化あり」とする
- chg = 1;
-
- // キーが押下されている?
- if (cur_key_sts[row][col] == LOW)
- {
- // キーコード追加(押下)
- BootKeyboard.add(KeyboardKeycode(KC_NUML));
- }
- else
- {
- // キーコード削除(離す)
- BootKeyboard.remove(KeyboardKeycode(KC_NUML));
- }
- //現在のキー状態を前回の状態にコピーする
- old_key_sts[row][col] = cur_key_sts[row][col];
- }
- }
- // 行指定:キースキャン終了(HIGHに戻す)
- digitalWrite(rowPins[row], HIGH);
- }
- //キー押下状態変化あり?
- if ( chg == 1 )
- {
- //ホスト側に変化したキーコードを送信する
- BootKeyboard.send();
- }
- //ホスト側のLED状態を取得
- int cur_led_sts = BootKeyboard.getLeds();
-
- //ホスト側NumLock状態はONか
- if( cur_led_sts & LED_NUM_LOCK )
- {
- //LED点灯(key_modeに従いRGB指定する)
- pixels.setPixelColor(0, pixels.Color(R[mode],G[mode],B[mode]));
- }
- else
- {
- //LED消灯(黒)
- pixels.setPixelColor(0, pixels.Color(0,0,0));
- }
- //LED出力
- pixels.show();
- }