Tamakichi / ArduinoSTM32_PS2Keyboard

Arduino STM32用 PS/2 キーボードライブラリ

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Arduino STM32用 PS/2 キーボードライブラリ

表紙画像

概要

本ライブラリはSTM32F103x搭載ボードにてPS/2 キーボードを利用するためのライブラリです。
Arduino STM32環境にて利用可能可能です。

ライブラリ名称

TKeyboard(ヘッダファイル TKeyboard.h)

特徴

  • 日本語キーボード、USキーボードに対応しています。
  • キーボード上のキーの[押した]、[離した]の情報が取得可能です。
  • Shiftキー、Ctrlキー、Altキー、Windowsキーの同時押しの情報が取得可能です。
  • キーボードに対して、送信禁止・送信開始の制御が可能です。
  • CapsLockキー、NumLockキー、ScrollLockキー用のLEDの点灯・消灯の制御が可能です。

利用環境

  • 開発環境 Arduino IDE 1.6.10以上 + Arduino STM32環境がインストールされていること
  • STM32マイコンボード ※SM32F103C8T6搭載ボードにて動作確認を行ています。
  • PS/2インタフェース対応キーボード (PS2/端子、USB端子接続)

ライブラリのインストール

  • Arduino IDEを起動していない状態で
    フォルダ TKeyboard を各自のライブラリ用ディレクトリlibrariesに配置して下さい。
  • 配置後、Arduino IDEを起動して、メニュー [ファイル]-[スケッチの例]をクリックして
    ライブラリTKeyboardが追加されていることを確認して下さい。

ハードウェア構成

(注意)
PS/2インタフェースのCLK、DATA信号の電圧に5Vを利用する場合は、
5Vトレラント(5V耐性)のピンを利用して下さい。

SM32F103C8T6の5Vトレラント対応ピン

  • PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15
  • PB3,PB4,PB6,PB7,PB8,PB9,PB10,PB11PB12,PB13,PB14,PB15

USBコネクタ接続構成

有線USBキーボードの多くのは、PS/2インタフェースにも対応しています。
この場合、USB端子のD+はPS/2のCLK、D-はDATAの信号線となります。

結線図

PB7をCLK、PB8をDATAとして利用する場合の結線を下記に示します。
CLK、DATAは10kΩの1/4W抵抗にてプルアップします。
USBコネクタ結線図

ブレッドボード上に実装した例

USBコネクタ接続例

PS/2コネクタ接続構成

PS/2コネクタはMini DIN 6pinメスコネクタを利用します。
PS/2コネクタ結線図

結線図

PB7(CLK)をDIN 6pin端子の5番端子、PB8(DATA)を1番ピンに接続します。
3番ピンはGND、4番ピンは+5Vに結線します。
また、CLK、DATAは10kΩの1/4W抵抗にてプルアップします。
PS/2コネクタ結線図

ブレッドボード上に実装した例

PS/2コネクタ接続例

ライブラリリファレンス

ライブラリはクラスライブラリとして実装しています。

ヘッダーファイル

#include <TKeyboard.h>

クラス名

TKeyboard

メンバー関数

利用開始

PS/2キーボードの利用を開始します。

  • 書式
    uint8_t begin(uint8_t clk, uint8_t dat, uint8_t flgLED=false, uint8_t flgUS=false)

  • 引数
    clk: PS/2 CLOCK接続ピン番号
    dat: PS/2 DATA接続ピン番号
    flgLED: false LED制御をしない、true LED制御を行う
    flgUS: false 日本語キーボード、true USキーボード

  • 戻り値
    0: 正常終了
    0以外: 異常終了

  • 説明
    PS/2キーボード利用を開始します。
    キーボードに対して初期化を行い、キー入力検出のための割り込みを有効にします。
    キーボードからの入力情報を取得するためには、本関数を事前に実行す必要があります。

利用終了

PS/2キーボードの利用を終了します。

  • 書式
    vcid end()

  • 引数
    なし

  • 戻り値
    なし

  • 説明
    PS/2キーボードの利用を終了します。
    キーボード入力のための割り込みは登録を削除します。

キーボード初期化

接続しているキーボードの初期化を行います。

  • 書式
    uint8_t init()

  • 引数
    なし

  • 戻り値
    0: 正常終了
    0以外: 異常終了

  • 説明
    接続しているキーボードのチェックを行い、PS/2キーボードの初期化を行います。
    CapsLock等の状態及び、入力バッファは初期化されます。
    本関数は利用開始時(begin関数実行)にも呼び出されます。
    利用開始後、本関数によりいつでもキーボードの初期化を行うことが出来ます。
    キーボードの認識が行えない場合はエラーを返します。

キーボード入力割り込み許可

PS/2キーボード入力の割り込みの実行を許可します。

  • 書式
    void enableInterrupts()

  • 引数
    なし

  • 戻り値
    なし

  • 説明
    禁止したPS/2キーボード入力の割り込みの実行を許可します。

キーボード入力割り込み禁止

PS/2キーボード入力の割り込みの実行を禁止します。

  • 書式
    void disableInterrupts()

  • 引数
    なし

  • 戻り値
    なし

  • 説明
    禁止したPS/2キーボード入力の割り込みの実行を禁止します。
    割り込み禁止中は、キーボードからの入力情報の取得を行うことが出来ません。

PS/2 アイドル設定

キーボードとの通信をアイドル状態にし、データ受信可能状態にします。

  • 書式
    void mode_idole()

  • 引数
    なし

  • 戻り値
    なし

  • 説明
    PS/2通信方向をキーボード=>ホストの方向に設定し、データ受信が可能な状態にします。

PS/2 通信禁止設定

キーボードからのデータ送信を禁止状態にします。

  • 書式
    void mode_stop()

  • 引数
    なし

  • 戻り値
    なし

  • 説明
    キーボードからのデータ送信を禁止します。
    禁止している間の入力情報はキーボードのバッファに蓄えられ、
    通信可能状態になった時点で送信されます。
    禁止することにより、キーボードからの送信がなくなり、
    入力のための割り込みの実行も発生しなくなります。
    本関数は割り込みを一時的に実行したくない場合に利用します。
    禁止後は、mode_idole()にて通信可能状態に戻す必要があります。

PS/2 ホスト送信モード設定

PS/2の通信をホスト送信モードに設定します。

  • 書式
    void mode_send()

  • 引数 なし

  • 戻り値
    なし

  • 説明
    PS/2通信方向をホスト=>キーボードの方向に設定し、
    ホストからのデータ送信が可能な状態にします。
    (注意)現行バージョンでは、ホストからのキーボードへのデータ送信機能利用出来ません。

キーボード入力情報の取得

キーボードからキー入力情報を取得します。

  • 書式
    keyEvent read()

  • 引数
    なし

  • 戻り値
    キー入力イベント情報

  • 説明
    キーボードからキー入力情報を1件取得します。
    取得した入力情報(キー入力イベント情報)は、次のデータ構造となります。

キーボードイベント構造体
キーボードから取得したデータは次のKeyEvent型となります。

typedef struct  {
    uint8_t code  : 8; // code
    uint8_t BREAK : 1; // BREAKコード
    uint8_t KEY   : 1; // KEYコード判定
    uint8_t SHIFT : 1; // SHIFTあり
    uint8_t CTRL  : 1; // CTRLあり
    uint8_t ALT   : 1; // ALTあり
    uint8_t GUI   : 1; // GUIあり
    uint8_t dumy  : 2; // ダミー
} keyEvent;

構造体メンバの詳細

  • code
    アスキーコード または キーコード が格納されます。
    0の場合は入力無し、255の場合はエラーとなります。
    本関数で入力情報を取得後は、codeの内容をチェックし入力無しを判定する必要があります。
    アスキーコード化出来ないキー入力は通常、キーコードが格納されます。
    キーコードは他のシステムとは互換性の無い、本ライブラリ固有のコード体系です。
    キーコードはヘッダーファイル内にて定義されています。
    定義内容については、**「定義一覧」**の節を参照して下さい。

  • BREAK
    キーの押し離し状態がセットされます。
    0: 押した、1:離した

  • KEY
    codeに格納された状態がアスキーコード か キーコードか識別する情報です。
    0: アスキーコード、1:キーコード

  • SHIFT
    SHIFTキーが押されている状況がセットされます。
    0:押していない 、 1:押している

  • CTRL
    CTRLキーが押されている状況がセットされます。
    0:押していない 、 1:押している

  • ALT
    ALTキーが押されている状況がセットされます。
    0:押していない 、 1:押している

  • GUI
    Windowsキーが押されている状況がセットされます。
    0:押していない 、 1:押している

  • dumy
    未使用です

仕様および制約等

  • キーボード上のキーを押して、離した場合入力情報として2件のデータが発生します。
    1)押した時: BREAKに0がセットされた入力情報
    2)離した時: BREAKに1がセットされた入力情報

  • キーボードを押しっぱなしにした場合は、
    キーボードのリピート機能により、押している間、入力情報が複数は発生します。
    この入力情報はBREAKに0がセットされた状態となり、離した時点で
    BREAKに1がセットされた情報となります。

  • 次の入力制御を行うキーについては、入力情報は発生しません。

  • SHIFTキー

  • Ctrlキー

  • Altキー

  • Windowsキー

  • CapsLockキー

  • NumLockキー

  • ScrollLockキー

定数一覧

キーコードの定義

(1)制御キー・特殊キーのキーコード

定義名 意味
KEY_ERROR 0xFF キーコードエラー
KEY_NONE 0 入力なし
PS2_L_Alt 1 [左Alt]
PS2_L_Shift 2 [左Shift]
PS2_L_Ctrl 3 [左Ctrl]
PS2_R_Shift 4 [右Shift]
PS2_R_Alt 5 [右Alt]
PS2_R_Ctrl 6 [右Ctrl]
PS2_L_GUI 7 [左Windowsキー]
PS2_R_GUI 8 [右Windowsキー]
PS2_NumLock 9 [NumLock]
PS2_ScrollLock 10 [ScrollLock]
PS2_CapsLock 11 [CapsLock]
PS2_PrintScreen 12 [PrintScreen]
PS2_HanZen 13 [半角/全角 漢字]
PS2_Insert 14 [Insert]
PS2_Home 15 [Home]
PS2_Pause 16 [Pause]
PS2_Romaji 17 [カタカナ ひらがな ローマ字]
PS2_APP 18 [メニューキー]
PS2_Henkan 19 [変換]
PS2_Muhenkan 20 [無変換]
PS2_PageUp 21 [PageUp]
PS2_PageDown 22 [PageDown]
PS2_End 23 [End]
PS2_L_Arrow 24 [←]
PS2_Up_Arrow 25 [↑]
PS2_R_Arrow 26 [→]
PS2_Down_Arrow 27 [↓]
PS2_ESC 30 [ESC]
PS2_Tab 31 [Tab]
PS2_Space 32 [空白]
PS2_Backspace 33 [BackSpace]
PS2_Delete 34 [Delete]
PS2_Enter 35 [Enter]

(2)通常キー(ASCIIコード変換可能キー)のキーコード

定義名 意味
PS2_Colon 36 [: *]
PS2_Semicolon 37 [; +]
PS2_Kamma 38 [, <]
PS2_minus 39 [- =]
PS2_Dot 40 [. >]
PS2_Question 41 [/ ?]
PS2_AT 42 [@ `]
PS2_L_brackets 43 [[ {]
PS2_Pipe 44 [\|]
PS2_R_brackets 45 [] }]
PS2_Hat 46 [^ ~]
PS2_Ro 47 [\ _ ろ]
PS2_0 48 [0 )]
PS2_1 49 [1 !]
PS2_2 50 [2 @]
PS2_3 51 [3 #]
PS2_4 52 [4 $]
PS2_5 53 [5 %]
PS2_6 54 [6 ^]
PS2_7 55 [7 &]
PS2_8 56 [8 *]
PS2_9 57 [9 (]
PS2_Pipe2 58 [\|] (USキーボード用)
PS2_A 65 [a A]
PS2_B 66 [b B]
PS2_C 67 [c C]
PS2_D 68 [d D]
PS2_E 69 [e E]
PS2_F 70 [f F]
PS2_G 71 [g G]
PS2_H 72 [h H]
PS2_I 73 [i I]
PS2_J 74 [j J]
PS2_K 75 [k K]
PS2_L 76 [l L]
PS2_M 77 [m M]
PS2_N 78 [n N]
PS2_O 79 [o O]
PS2_P 80 [p P]
PS2_Q 81 [q Q]
PS2_R 82 [r R]
PS2_S 83 [s S]
PS2_T 84 [t T]
PS2_U 85 [u U]
PS2_V 86 [v V]
PS2_W 87 [w W]
PS2_X 88 [x X]
PS2_Y 89 [y Y]
PS2_Z 90 [z Z]

(3)テンキーのキーコード

定義名 意味
PS2_PAD_Equal 94 [=]
PS2_PAD_Enter 95 [Enter]
PS2_PAD_0 96 [0/Insert]
PS2_PAD_1 97 [1/End]
PS2_PAD_2 98 [2/DownArrow]
PS2_PAD_3 99 [3/PageDown]
PS2_PAD_4 100 [4/LeftArrow]
PS2_PAD_5 101 [5]
PS2_PAD_6 102 [6/RightArrow]
PS2_PAD_7 103 [7/Home]
PS2_PAD_8 104 [8/UPArrow]
PS2_PAD_9 105 [9/PageUp]
PS2_PAD_Multi 106 [*]
PS2_PAD_Plus 107 [+]
PS2_PAD_Kamma 108 [,]
PS2_PAD_Minus 109 [-]
PS2_PAD_DOT 110 [./Delete]
PS2_PAD_Slash 111 [/]

(4)ファンクションキーのキーコード

定義名 意味
PS2_F1 112 [F1]
PS2_F2 113 [F2]
PS2_F3 114 [F3]
PS2_F4 115 [F4]
PS2_F5 116 [F5]
PS2_F6 117 [F6]
PS2_F7 118 [F7]
PS2_F8 119 [F8]
PS2_F9 120 [F9]
PS2_F10 121 [F10]
PS2_F11 122 [F11]
PS2_F12 123 [F12]
PS2_F13 124 [F13]
PS2_F14 125 [F14]
PS2_F15 126 [F15]
PS2_F16 127 [F16]
PS2_F17 128 [F17]
PS2_F18 129 [F18]
PS2_F19 130 [F19]
PS2_F20 131 [F20]
PS2_F21 132 [F21]
PS2_F22 133 [F22]
PS2_F23 134 [F23]

(5)マルチマディアキーのキーコード

定義名 意味
PS2_PrevTrack 135 前のトラック
PS2_WWW_Favorites 136 ブラウザお気に入り
PS2_WWW_Refresh 137 ブラウザ更新表示
PS2_VolumeDown 138 音量を下げる
PS2_Mute 139 ミュート
PS2_WWW_Stop 140 ブラウザ停止
PS2_Calc 141 電卓
PS2_WWW_Forward 142 ブラウザ進む
PS2_VolumeUp 143 音量を上げる
PS2_PLAY 144 再生
PS2_POWER 145 電源ON
PS2_WWW_Back 146 ブラウザ戻る
PS2_WWW_Home 147 ブラウザホーム
PS2_Sleep 148 スリープ
PS2_Mycomputer 149 マイコンピュータ
PS2_Mail 150 メーラー起動
PS2_NextTrack 151 次のトラック
PS2_MEdiaSelect 152 メディア選択
PS2_Wake 153 ウェイクアップ
PS2_Stop 154 停止
PS2_WWW_Search 155 ウェブ検索

サンプルスケッチ

TKeyboard_exsample.ino

#include <TKeyboard.h>

// [PS/2接続利用ピンの定義]
//   DIN6Pコネクタ
//  5 @ U @ 6   1:Data => DataPin
// 3 @     @ 4  2:NC
//    @   @     3:GND  => GND
//    1   2     4:5V   => 5V
//              5:CLK  => IRQpin
//              6:NC
//
//  USBコネクタ利用時(注意 PS/2対応キーボードのみ)
//  1: VBUS => 5V
//  2: D-   => DataPin
//  3: D+   => IRQpin
//  4: GND  => GND

const int IRQpin =  PB7;  // CLK(D+)
const int DataPin = PB8;  // Data(D-)

// PS/2 Keyboard object
TKeyboard kb;

void setup() {

  // USBシリアル通信の初期設定
  // ※USB経由のシリアル通信を使わない場合は、要修正
  Serial.begin(115200);
  while (!Serial.isConnected()) delay(100);

  Serial.println("Keyboard Test(v1.0):");

  // PS/2 キーボードの利用開始
  // begin()の引数: CLKピンNo、DATAピンNo、LED制御あり/なし、USキーボードを利用する/しない
  if ( kb.begin(IRQpin, DataPin, true, true) ) {
    // 初期化に失敗時はエラーメッセージ表示
    Serial.println("PS/2 Keyboard initialize error.");
  }
}

void loop() {
  uint8_t  c;
  keyEvent k; // キー入力情報

  // キー入力情報(キーイベント構造体のメンバーは下記の通り)
  // k.code  : アスキーコード or キーコード(TKeyboard.hna内の#define参照)
  //            0の場合は入力無し、255の場合はエラー
  // k.BREAK : キー押し情報                  => 0: 押した、1:離した
  // k.KEY   : キーコード/アスキーコード種別 => 0: アスキーコード、1:キーコード
  // k.SHIFT : SHIFTキー押し判定             => 0: 押していない 、 1:押している
  // k.CTRL  : CTRLキー押し判定              => 0: 押していない 、 1:押している
  // k.ALT   : ALTキー押し判定               => 0: 押していない 、 1:押している
  // k.GUI   : GUI(Windowsキー)押し判定     = > 0: 押していない 、 1:押している

  if (Serial.available()) {
    // 動作確認 コマンド
    //  i: PS/2 キーボードの初期化
    //  l: CapsLock、NumLock、ScrolLock用LEDの点灯
    //  m: CapsLock、NumLock、ScrolLock用LEDの消灯

    // シリアルからの入力コマンドチェック
    c = Serial.read();
    if (c == 'i') {
      // キーボードの初期化(この処理はbegin()後、いつでも呼び出して初期化可能)
      kb.init();
    } else if (c == 'l') {
      // LEDの点灯 (引数:led_caps,led_num, led_scrol)
      kb.ctrl_LED(1,1,1);
    } else if (c == 'm') {
      // LEDの消灯 (引数:led_caps,led_num, led_scrol)
      kb.ctrl_LED(0,0,0);
    }
  }

  // キーボードからの入力情報取得
  k = kb.read();
  if (k.code) {  // ※入力無しの場合は0、0以外の時に入力値の評価を行う
    if (k.BREAK)
      Serial.print("[Break]"); // キーを離した
    if (k.KEY)
      Serial.print("[KEY]");   // codeの内容はキーコードである
    if (k.SHIFT)
      Serial.print("[Shift]"); // シフトキーが同時に押されている
    if (k.CTRL)
      Serial.print("[Ctrl]");  // Ctrlキーが同時に押されている
    if (k.ALT)
      Serial.print("[Alt]");   // Altキーが同時に押されている
    if (k.GUI)
      Serial.print("[Win]");   // Windowsキーが同時に押されている

    if (k.KEY) {
      // 入力キーがASCIIコード化出来ない場合は、キーコードを表示する
      Serial.print("key_code=");
      Serial.println(k.code);
    } else {
      // アスキーコードの場合は、その文字を表示する
      Serial.print("ascii:");
      Serial.write(k.code);
      Serial.println();
    }
  }
}

About

Arduino STM32用 PS/2 キーボードライブラリ


Languages

Language:C++ 100.0%