#include "Keyboard.h" //キーボード #define DATA 3 #define CLOCK 2 //クロックLOW待ち #define CLKLOW while(digitalRead(CLOCK) == HIGH); //クロックHIGH待ち #define CLKHIGH while(digitalRead(CLOCK) == LOW); const PROGMEM uint8_t onebyte[] = { 0, 0x42, 0, 0x3E, 0x3C, 0x3A, 0x3B, 0x45, //00-07 0, 0x43, 0x41, 0x3F, 0x3D, 0x2B, 0x35, 0, //08-0F 0, 0xE2, 0xE1, 0x88, 0xE0, 0x14, 0x1E, 0, //10-17 0, 0, 0x1D, 0x16, 0x04, 0x1A, 0x1F, 0xE3, //18-1F 0, 0x06, 0x1B, 0x07, 0x08, 0x21, 0x20, 0xE7, //20-27 0, 0x2C, 0x19, 0x09, 0x17, 0x15, 0x22, 0x65, //28-2F 0, 0x11, 0x05, 0x0B, 0x0A, 0x1C, 0x23, 0, //30-37 0, 0, 0x10, 0x0D, 0x18, 0x24, 0x25, 0, //38-3F 0, 0x36, 0x0E, 0x0C, 0x12, 0x27, 0x26, 0, //40-47 0, 0x37, 0x38, 0x0F, 0x33, 0x13, 0x2D, 0, //48-4F 0, 0x87, 0x34, 0, 0x2F, 0x2E, 0, 0, //50-57 0x39, 0xE5, 0x28, 0x30, 0, 0x31, 0, 0, //58-5F 0, 0, 0, 0, 0x8A, 0, 0x2A, 0x8B, //60-67 0, 0x59, 0x89, 0x5C, 0x5F, 0, 0, 0, //68-6F 0x62, 0x63, 0x5A, 0x5D, 0x5E, 0x60, 0x29, 0x53, //70-77 0x44, 0x57, 0x5B, 0x56, 0x55, 0x61, 0x47, 0, //78-7F 0, 0, 0, 0x40, 0x46 }; //80-84 const PROGMEM uint8_t twobyte[] = { 0, 0, 0, 0, 0, 0, 0, 0, //00-07 0, 0, 0, 0, 0, 0, 0, 0, //08-0F 0, 0xE6, 0x46, 0, 0xE4, 0, 0, 0, //10-17 0, 0, 0, 0, 0, 0, 0, 0xE3, //18-1F 0, 0, 0, 0, 0, 0, 0, 0xE7, //20-27 0, 0, 0, 0, 0, 0, 0, 0x65, //28-2F 0, 0, 0, 0, 0, 0, 0, 0, //30-37 0, 0, 0, 0, 0, 0, 0, 0, //38-3F 0, 0, 0, 0, 0, 0, 0, 0, //40-47 0, 0, 0x54, 0, 0, 0, 0, 0, //48-4F 0, 0, 0, 0, 0, 0, 0, 0, //50-57 0, 0, 0x58, 0, 0, 0, 0, 0, //58-5F 0, 0, 0, 0, 0, 0, 0, 0, //60-67 0, 0x4D, 0, 0x50, 0x4A, 0, 0, 0, //68-6F 0x49, 0x4C, 0x51, 0, 0x4F, 0x52, 0, 0, //70-77 0, 0, 0x4E, 0, 0x46, 0x4B, 0, 0, //78-7F }; void (*keyConv[256])(); uint8_t ps2code, ledHID, ledBit; bool isBreak; void setup() { pinMode(CLOCK, INPUT_PULLUP); pinMode(DATA, INPUT_PULLUP); //デフォルトの変換ルーチンのポインタ収納 for(int i=0; i<256; i++) keyConv[i] = onebyteConv; keyConv[0xE0] = twobyteConv; keyConv[0xE1] = pauseCode; keyConv[0xF0] = breakCode; // LED点灯ルーチン keyConv[0x58] = capsLock; keyConv[0x77] = numLock; keyConv[0x7E] = scrLock; HID().setCallBackFunc(LEDSet); // LED点灯コールバック登録 isBreak = false; } void loop() { if(digitalRead(CLOCK) == LOW) { ps2code = getKeyCode(); (*keyConv[ps2code])(); } } void onebyteConv() // 1バイト変換 { if(isBreak) { Keyboard.release(pgm_read_byte(onebyte + ps2code)); isBreak = false; } else Keyboard.press(pgm_read_byte(onebyte + ps2code)); } void breakCode() { isBreak = true; } void twobyteConv() // 2バイト変換 { while(digitalRead(CLOCK) == HIGH); // 次のコードを待つ ps2code = getKeyCode(); if(ps2code == 0xF0) { while(digitalRead(CLOCK) == HIGH); // 次のコードを待つ ps2code = getKeyCode(); if(ps2code != 0x7C) // PrintScreenの1バイト目じゃない Keyboard.release(pgm_read_byte(twobyte + ps2code)); } else { if(ps2code != 0x12) // PrintScreenの1バイト目じゃない Keyboard.press(pgm_read_byte(twobyte + ps2code)); } } void pauseCode() // Pauseキー { // Breakコードなし while(digitalRead(CLOCK) == HIGH); // 次のコードを待つ if(getKeyCode() != 0x14) return; while(digitalRead(CLOCK) == HIGH); if(getKeyCode() != 0x77) return; while(digitalRead(CLOCK) == HIGH); if(getKeyCode() != 0xE1) return; while(digitalRead(CLOCK) == HIGH); if(getKeyCode() != 0xF0) return; while(digitalRead(CLOCK) == HIGH); if(getKeyCode() != 0x14) return; while(digitalRead(CLOCK) == HIGH); if(getKeyCode() != 0xF0) return; while(digitalRead(CLOCK) == HIGH); if(getKeyCode() != 0x77) return; Keyboard.press(0x48); delay(10); Keyboard.release(0x48); } void scrLock() { if(isBreak) { Keyboard.release(pgm_read_byte(onebyte + ps2code)); isBreak = false; } else { Keyboard.press(pgm_read_byte(onebyte + ps2code)); } } void numLock() { if(isBreak) { Keyboard.release(pgm_read_byte(onebyte + ps2code)); isBreak = false; } else { Keyboard.press(pgm_read_byte(onebyte + ps2code)); } } void capsLock() { if(isBreak) { Keyboard.release(pgm_read_byte(onebyte + ps2code)); isBreak = false; } else { Keyboard.press(pgm_read_byte(onebyte + ps2code)); } } void LEDSet(uint8_t ledHID) { uint8_t ledBit; //HIDのビット値 1.NumLock 2.CapsLock 4.ScrollLock ledBit = (ledHID & 3) << 1; ledBit |= (ledHID & 4) >> 2; sendCommand(0xED); // LED点灯要求 getKeyCode(); // ACK sendCommand(ledBit); // 1.ScrollLock 2.NumLock 4.CapsLock getKeyCode(); // ACK } //キーボードにコマンドを送る void sendCommand(uint8_t command) { uint8_t onebit, parity = 0; pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, LOW); //キーボードの通信を禁止 delayMicroseconds(200); // キーボードによって調整が必要かも digitalWrite(DATA, LOW); //スタートビット pinMode(CLOCK, INPUT_PULLUP); //送信要求 for(int i=0; i<8; i++) { CLKLOW; //クロックLOW待ち onebit = (command >> i) & 1; digitalWrite(DATA, onebit); parity += onebit; CLKHIGH; //クロックHIGH待ち } //パリティビット CLKLOW; digitalWrite(DATA, ~parity & 1); CLKHIGH; //ストップビット CLKLOW; pinMode(DATA, INPUT_PULLUP); CLKHIGH; //ACK CLKLOW; while(digitalRead(DATA) == HIGH); //LOWを待つ CLKHIGH; while(digitalRead(DATA) == LOW); //HIGHを待つ } //キーボードからキーコードを受け取る uint8_t getKeyCode() { uint8_t onebit, keycode = 0; //スタートビットは拾わない CLKLOW; //クロックLOW待ち CLKHIGH; //クロックHIGH待ち for(int i=0; i<8; i++) { CLKLOW; onebit = digitalRead(DATA); keycode |= onebit << i; //parity += onebit; CLKHIGH; } //パリティビットは拾わない CLKLOW; CLKHIGH; //ストップビット CLKLOW; CLKHIGH; return keycode; }