LoginSignup
2
3

More than 5 years have passed since last update.

コピペ専用キーボード

Posted at

はじめに

仕事中データをまとめていたときあまりにもコピペ回数が多く、コピペ専用キーボードを作成したい!というのが事の発端です。(Dvorak配列でC,Vキーが右手側にあるのです。マウスとキーボードのもちかえが頻繁すぎてつらかった)

こういうの欲しい

Ctrl XCV.jpg
こういうのが欲しいわけです。左手側に置いておいて、右手でマウス操作、左手でコピペ。
普通ならばそうなっているのですが、当方Dvorak配列使いのためX,C,Vが右手側にあるのです。多少のコピペならば問題ないのですが、データ纏めで一日コピペしていたときにはうんざりしてしまい、コピペ専用キーボードの作成を決心しました。

USB HID

Arduino UNOで出来るんじゃないかと調べてみたら、ちょっと普通にはUSB HIDを実現できないみたい。一方でSTM32F103C8であれば実現できるということで試してみたのがこちらの記事

ハードウェア

STM32CubeMXでPB12-14へキーアサイン。プルアップ設定にしてスイッチをグランドに落すのみのハードウェア。キースイッチはAliexpressで注文中のため、到着までにソフトの作成を完了させたいというのが目的。
Clipboard02.jpg
IMG_20171105_113920.jpg

ソフトウェア

内容としては、main()のwhile文を下記にしたのみ。
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(10);

  // STSの更新
  bKey_Ctrl = !HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12);
  bKey_C    = !HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13);
  bKey_V    = !HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14);


  if( bKey_Ctrl != bKey_Ctrl_Old )  // 押された or はなされた
  {
      bUpdate_Ctrl = 1;
  }
  else
  {
      if(bUpdate_Ctrl)
      {
          if( bKey_Ctrl )   // ON
          {
              keyboardHID.modifiers = 0x01;
              HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0); // LED ON
              USBD_HID_SendReport(&hUsbDeviceFS, &keyboardHID, sizeof(struct keyboardHID_t));
          }
          else
          {
              keyboardHID.modifiers = 0x00;
              HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1); // LED OFF
              USBD_HID_SendReport(&hUsbDeviceFS, &keyboardHID, sizeof(struct keyboardHID_t));
          }
          bUpdate_Ctrl = 0;
      }
  }

  if( bKey_C != bKey_C_Old )    // 押された or はなされた
  {
      bUpdate_C = 1;
  }
  else
  {
      if(bUpdate_C)
      {
          if( bKey_C )  // ON
          {
              keyboardHID.key1 = 0x0C;
              HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0); // LED ON
              USBD_HID_SendReport(&hUsbDeviceFS, &keyboardHID, sizeof(struct keyboardHID_t));
          }
          else
          {
              keyboardHID.key1 = 0x00;
              HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1); // LED OFF
              USBD_HID_SendReport(&hUsbDeviceFS, &keyboardHID, sizeof(struct keyboardHID_t));
          }
          bUpdate_C = 0;
      }
  }
  // VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
  if( bKey_V != bKey_V_Old )    // 押された or はなされた
  {
      bUpdate_V = 1;
  }
  else
  {
      if(bUpdate_V)
      {
          if( bKey_V )  // ON
          {
              keyboardHID.key2 = 0x37;
              HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0); // LED ON
              USBD_HID_SendReport(&hUsbDeviceFS, &keyboardHID, sizeof(struct keyboardHID_t));
          }
          else
          {
              keyboardHID.key2 = 0x00;
              HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1); // LED OFF
              USBD_HID_SendReport(&hUsbDeviceFS, &keyboardHID, sizeof(struct keyboardHID_t));
          }
          bUpdate_V = 0;
      }
  }
  /* USER CODE BEGIN 3 */
  // STSの保存
  bKey_Ctrl_Old = bKey_Ctrl ;
  bKey_C_Old    = bKey_C ;
  bKey_V_Old    = bKey_V ;

}

コンパイル&書き込みすればキチンと動作する。が、上記はDvorak配列向けのキーコードなので一般キー配列では動作しないことに注意して欲しい。

2017/11/05 Ikeda

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3