//ATmega328P向け //キーボード #define KDATA 2 #define KCLOCK 3 //PC #define PDATA 7 #define PCLOCK 8 //LED #define LED1 6 #define LED2 5 #define WAIT 40 #define WAITHALF 20 //クロック開始待ち #define CLKBEGIN while(digitalRead(KCLOCK) == HIGH){if(millis() - stime > 200) return;} //クロック終了待ち #define CLKEND while(digitalRead(KCLOCK) == LOW){if(millis() - stime > 200) return;} void (*keyConv[256])(); uint8_t ps2code, beforeCode = 0; bool lshift, rshift; bool customMode, jpMode, cursorMode; void setup() { pinMode(PCLOCK, INPUT_PULLUP); pinMode(PDATA, INPUT_PULLUP); pinMode(KCLOCK, INPUT_PULLUP); pinMode(KDATA, INPUT_PULLUP); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); //デフォルトの変換ルーチンのポインタ収納 for(int i=0; i<256; i++) keyConv[i] = defConv; //キー別の変換ルーチンのポインタ収納 keyConv[0x12] = leftShift; keyConv[0x59] = rightShift; keyConv[0x1E] = atmark; keyConv[0x36] = caret; keyConv[0x3D] = andmark; keyConv[0x3E] = asterisk; keyConv[0x46] = leftParenthesis; keyConv[0x45] = rightParenthesis; keyConv[0x4E] = underbar; keyConv[0x55] = plusEqual; keyConv[0x5D] = baryen; keyConv[0x0E] = backquote; keyConv[0x4C] = colon; keyConv[0x52] = quote; keyConv[0x54] = leftBracket; keyConv[0x5B] = rightBracket; keyConv[0x0D] = caps; keyConv[0x33] = leftCursor; keyConv[0x3B] = downCursor; keyConv[0x42] = upCursor; keyConv[0x4B] = rightCursor; keyConv[0x64] = ime; keyConv[0x67] = function; keyConv[0xF0] = keyBreak; //キー初期状態 lshift = false; rshift = false; jpMode = false; customMode = false; cursorMode = false; } void loop() { if(digitalRead(PCLOCK) == LOW) sendCommand(getCommand()); //PCからのコマンドコード if(digitalRead(KCLOCK) == LOW) //キーボードのスタートビット { ps2code = getKeyCode(); (*keyConv[ps2code])(); beforeCode = ps2code; } } void leftShift() //LeftShift { if(beforeCode == 0xF0) //キーリリース lshift = false; else lshift = true; sendKeyCode(0x12); } void rightShift() //RightShift { if(beforeCode == 0xF0) //キーリリース rshift = false; else rshift = true; sendKeyCode(0x59); } void atmark() //@2 { if(beforeCode == 0xF0) //キーリリース { if(lshift) { sendKeyCode(0x54); //@ sendKeyCode(0x12); //LeftShift } else if(rshift) { sendKeyCode(0x54); //@ sendKeyCode(0x59); //RightShift } else { sendKeyCode(0x1E); //2 } } else { if(lshift) { sendKeyCode(0xF0); //キーリリース sendKeyCode(0x12); //LeftShift sendKeyCode(0x54); //@ } else if(rshift) { sendKeyCode(0xF0); //キーリリース sendKeyCode(0x59); //RightShift sendKeyCode(0x54); //@ } else { sendKeyCode(0x1E); //2 } } } void caret() //^6 { if(beforeCode == 0xF0) //キーリリース { if(lshift) { if(jpMode) { sendKeyCode(0x36); //ぉ } else { sendKeyCode(0x55); //^ sendKeyCode(0x12); //LeftShift } } else if(rshift) { if(jpMode) { sendKeyCode(0x36); //ぉ } else { sendKeyCode(0x55); //^ sendKeyCode(0x59); //RightShift } } else { sendKeyCode(0x36); //6 } } else { if(lshift) { if(jpMode) { sendKeyCode(0x36); //ぉ } else { sendKeyCode(0xF0); //キーリリース sendKeyCode(0x12); //LeftShift sendKeyCode(0x55); //^ } } else if(rshift) { if(jpMode) { sendKeyCode(0x36); //ぉ } else { sendKeyCode(0xF0); //キーリリース sendKeyCode(0x59); //RightShift sendKeyCode(0x55); //^ } } else { sendKeyCode(0x36); //6 } } } void andmark() //&7 { if(beforeCode == 0xF0) //キーリリース { if(lshift || rshift) { if(jpMode) sendKeyCode(0x3D); //ゃ else sendKeyCode(0x36); //& } else { sendKeyCode(0x3D); //7 } } else { if(lshift || rshift) { if(jpMode) sendKeyCode(0x3D); //ゃ else sendKeyCode(0x36); //& } else { sendKeyCode(0x3D); //7 } } } void asterisk() //*8 { if(beforeCode == 0xF0) //キーリリース { if(lshift || rshift) { if(jpMode) sendKeyCode(0x3E); //ゅ else sendKeyCode(0x52); //* } else { sendKeyCode(0x3E); //8 } } else { if(lshift || rshift) { if(jpMode) sendKeyCode(0x3E); //ゅ else sendKeyCode(0x52); //* } else { sendKeyCode(0x3E); //8 } } } void leftParenthesis() //(9 { if(beforeCode == 0xF0) //キーリリース { if(lshift || rshift) { if(jpMode) sendKeyCode(0x46); //ょ else sendKeyCode(0x3E); //( } else { sendKeyCode(0x46); //9 } } else { if(lshift || rshift) { if(jpMode) sendKeyCode(0x46); //ょ else sendKeyCode(0x3E); //( } else { sendKeyCode(0x46); //9 } } } void rightParenthesis() //)0 { if(beforeCode == 0xF0) //キーリリース { if(lshift || rshift) { if(jpMode) sendKeyCode(0x45); //を else sendKeyCode(0x46); //) } else { sendKeyCode(0x45); //0 } } else { if(lshift || rshift) { if(jpMode) sendKeyCode(0x45); //を else sendKeyCode(0x46); //) } else { sendKeyCode(0x45); //0 } } } void underbar() //_- { if(beforeCode == 0xF0) //キーリリース { if(lshift || rshift) sendKeyCode(0x51); //_ else sendKeyCode(0x4E); //- } else { if(lshift || rshift) sendKeyCode(0x51); //_ else sendKeyCode(0x4E); //- } } void plusEqual() //+= { if(beforeCode == 0xF0) //キーリリース { if(jpMode) { sendKeyCode(0x55); //へ } else if(lshift || rshift) { sendKeyCode(0x4C); //+ } else { sendKeyCode(0x4E); //= sendKeyCode(0xF0); //キーリリース sendKeyCode(0x12); //LeftShift } } else { if(jpMode) { sendKeyCode(0x55); //へ } else if(lshift || rshift) { sendKeyCode(0x4C); //+ } else { sendKeyCode(0x12); //LeftShift sendKeyCode(0x4E); //= } } } void baryen() //|¥ { sendKeyCode(0x6A); } void backquote() //~` { if(beforeCode == 0xF0) //キーリリース { if(jpMode) sendKeyCode(0x5D); //む else if(lshift || rshift) sendKeyCode(0x55); //~ else { sendKeyCode(0x54); //` sendKeyCode(0xF0); //キーリリース sendKeyCode(0x12); //LeftShift } } else { if(jpMode) sendKeyCode(0x5D); //む else if(lshift || rshift) sendKeyCode(0x55); //~ else { sendKeyCode(0x12); //LeftShift sendKeyCode(0x54); //` } } } void colon() //:; { if(beforeCode == 0xF0) //キーリリース { if(lshift) { sendKeyCode(0x52); //: sendKeyCode(0x12); //LeftShift } else if(rshift) { sendKeyCode(0x52); //: sendKeyCode(0x59); //RightShift } else { sendKeyCode(0x4C); //; } } else { if(lshift) { sendKeyCode(0xF0); //キーリリース sendKeyCode(0x12); //LeftShift sendKeyCode(0x52); //: } else if(rshift) { sendKeyCode(0xF0); //キーリリース sendKeyCode(0x59); //RightShift sendKeyCode(0x52); //: } else { sendKeyCode(0x4C); //; } } } void quote() //"' { if(beforeCode == 0xF0) //キーリリース { if(jpMode) sendKeyCode(0x52); //け else if(lshift || rshift) { sendKeyCode(0x1E); //" } else { sendKeyCode(0x3D); //' sendKeyCode(0xF0); //キーリリース sendKeyCode(0x12); //LeftShift } } else { if(jpMode) sendKeyCode(0x52); //け else if(lshift || rshift) { sendKeyCode(0x1E); //" } else { sendKeyCode(0x12); //LeftShift sendKeyCode(0x3D); //' } } } void leftBracket() //{[ { if(jpMode) sendKeyCode(0x54); //゛ else sendKeyCode(0x5B); //[ } void rightBracket() //}] { if(jpMode) sendKeyCode(0x5B); //゜ else sendKeyCode(0x5D); //] } void caps() //Caps Lock { if(customMode) sendKeyCode(0x58); //Caps Lock else sendKeyCode(0x0D); //Tab } void leftCursor() //H { if(customMode) //← { if(beforeCode == 0xF0) //キーリリース { sendKeyCode(0xE0); sendKeyCode(0xF0); sendKeyCode(0x6B); cursorMode = false; } else { sendKeyCode(0xE0); sendKeyCode(0x6B); cursorMode = true; } } else sendKeyCode(0x33); //H } void downCursor() //J { if(customMode) //↓ { if(beforeCode == 0xF0) //キーリリース { sendKeyCode(0xE0); sendKeyCode(0xF0); sendKeyCode(0x72); cursorMode = false; } else { sendKeyCode(0xE0); sendKeyCode(0x72); cursorMode = true; } } else sendKeyCode(0x3B); //J } void upCursor() //K { if(customMode) //↑ { if(beforeCode == 0xF0) //キーリリース { sendKeyCode(0xE0); sendKeyCode(0xF0); sendKeyCode(0x75); cursorMode = false; } else { sendKeyCode(0xE0); sendKeyCode(0x75); cursorMode = true; } } else sendKeyCode(0x42); //K } void rightCursor() //L { if(customMode) //→ { if(beforeCode == 0xF0) //キーリリース { sendKeyCode(0xE0); sendKeyCode(0xF0); sendKeyCode(0x74); cursorMode = false; } else { sendKeyCode(0xE0); sendKeyCode(0x74); cursorMode = true; } } else sendKeyCode(0x4B); //L } void ime() //IMEオン・オフ { if(beforeCode == 0xF0) //キーリリース { jpMode = !jpMode; if(jpMode) digitalWrite(LED2, HIGH); else digitalWrite(LED2, LOW); } sendKeyCode(0x0E); //半角/全角 } void function() //機能キーオン・オフ { if(beforeCode == 0xF0) //キーリリース { customMode = !customMode; if(customMode) digitalWrite(LED1, HIGH); else digitalWrite(LED1, LOW); } } void keyBreak() //キーリリース { if(!cursorMode) //カーソルキー使用中ではない sendKeyCode(0xF0); //キーBreak } void defConv() //変換なし { sendKeyCode(ps2code); } //PCにキーコードを送る void sendKeyCode(uint8_t code) { uint8_t onebit, parity = 0; if(digitalRead(PCLOCK) == LOW) //PCがキーボードの通信を禁止 return; if(digitalRead(PDATA) == LOW) //PCからの送信要求 return; pinMode(PDATA, OUTPUT); digitalWrite(PDATA, LOW); //スタートビット delayMicroseconds(WAITHALF); pinMode(PCLOCK, OUTPUT); digitalWrite(PCLOCK, LOW); //クロック delayMicroseconds(WAIT); digitalWrite(PCLOCK, HIGH); delayMicroseconds(WAITHALF); //1バイト送る for(int i = 0; i < 8; i++) { onebit = (code >> i) & 1; digitalWrite(PDATA, onebit); delayMicroseconds(WAITHALF); digitalWrite(PCLOCK, LOW); //クロック delayMicroseconds(WAIT); digitalWrite(PCLOCK, HIGH); delayMicroseconds(WAITHALF); parity += onebit; } digitalWrite(PDATA, ~parity & 1); //パリティビット delayMicroseconds(WAITHALF); digitalWrite(PCLOCK, LOW); //クロック delayMicroseconds(WAIT); digitalWrite(PCLOCK, HIGH); delayMicroseconds(WAITHALF); pinMode(PDATA, INPUT_PULLUP); //ストップビット delayMicroseconds(WAITHALF); digitalWrite(PCLOCK, LOW); //クロック delayMicroseconds(WAIT); pinMode(PCLOCK, INPUT_PULLUP); delayMicroseconds(WAIT); } //PCからコマンドを受け取る uint8_t getCommand() { uint8_t code = 0, onebit; while (digitalRead(PDATA) == HIGH); //スタートビットを待つ while (digitalRead(PCLOCK) == LOW); //HIGHを待つ pinMode(PCLOCK, OUTPUT); delayMicroseconds(WAITHALF); //1バイト受け取る for(int i = 0; i < 8; i++) { digitalWrite(PCLOCK, LOW); //クロック delayMicroseconds(WAIT); digitalWrite(PCLOCK, HIGH); delayMicroseconds(WAITHALF); onebit = digitalRead(PDATA); code |= onebit << i; delayMicroseconds(WAITHALF); } //パリティビットは読み取らない digitalWrite(PCLOCK, LOW); //クロック delayMicroseconds(WAIT); digitalWrite(PCLOCK, HIGH); delayMicroseconds(WAIT); //ストップビットも読み取らない digitalWrite(PCLOCK, LOW); //クロック delayMicroseconds(WAIT); digitalWrite(PCLOCK, HIGH); delayMicroseconds(WAIT); //ACK pinMode(PDATA, OUTPUT); digitalWrite(PDATA, LOW); digitalWrite(PCLOCK, LOW); delayMicroseconds(WAIT); pinMode(PCLOCK, INPUT_PULLUP); delayMicroseconds(WAITHALF); pinMode(PDATA, INPUT_PULLUP); return code; } //キーボードにコマンドを送る void sendCommand(uint8_t command) { uint32_t stime; uint8_t onebit, parity = 0; stime = millis(); pinMode(KDATA, OUTPUT); pinMode(KCLOCK, OUTPUT); digitalWrite(KCLOCK, LOW); //キーボードの通信を禁止 delayMicroseconds(100); digitalWrite(KDATA, LOW); //スタートビット pinMode(KCLOCK, INPUT_PULLUP); //送信要求 for(int i=0; i<8; i++) { CLKBEGIN; //クロック開始待ち onebit = (command >> i) & 1; digitalWrite(KDATA, onebit); parity += onebit; CLKEND; //クロック終了待ち } //パリティビット CLKBEGIN; //クロック開始待ち digitalWrite(KDATA, ~parity & 1); CLKEND; //クロック終了待ち //ストップビット CLKBEGIN; //クロック開始待ち pinMode(KDATA, INPUT_PULLUP); CLKEND; //クロック終了待ち //ACK CLKBEGIN; //クロック開始待ち while(digitalRead(KDATA) == HIGH); //LOWを待つ CLKEND; //クロック終了待ち } //キーボードからキーコードを受け取る uint8_t getKeyCode() { uint32_t stime; uint8_t onebit, keycode = 0; stime = millis(); //スタートビットは拾わない CLKEND; //クロック終了待ち for(int i=0; i<8; i++) { CLKBEGIN; //クロック開始待ち onebit = digitalRead(KDATA); keycode |= onebit << i; //parity += onebit; CLKEND; //クロック終了待ち } //パリティビットは拾わない CLKBEGIN; //クロック開始待ち CLKEND; //クロック終了待ち //ストップビット CLKBEGIN; //クロック開始待ち CLKEND; //クロック終了待ち return keycode; }