コピペ専用キーボード


はじめに

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

こういうの欲しい


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

USB HID

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

ハードウェア

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

ソフトウェア

内容としては、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