コピペ専用キーボード

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


# こういうの欲しい
![Ctrl XCV.jpg](https://qiita-image-store.s3.amazonaws.com/0/211703/127d34a0-3976-b2e7-1682-411f1a36c65e.jpeg)
こういうのが欲しいわけです。左手側に置いておいて、右手でマウス操作、左手でコピペ。
普通ならばそうなっているのですが、当方Dvorak配列使いのためX,C,Vが右手側にあるのです。多少のコピペならば問題ないのですが、データ纏めで一日コピペしていたときにはうんざりしてしまい、コピペ専用キーボードの作成を決心しました。


# USB HID
Arduino UNOで出来るんじゃないかと調べてみたら、ちょっと普通にはUSB HIDを実現できないみたい。一方で[STM32F103C8であれば実現できるということで試してみたのがこちらの記事](https://qiita.com/tlab/items/6f33d4ed22d675cbad28)。

# ハードウェア
STM32CubeMXでPB12-14へキーアサイン。プルアップ設定にしてスイッチをグランドに落すのみのハードウェア。キースイッチはAliexpressで注文中のため、到着までにソフトの作成を完了させたいというのが目的。
![Clipboard02.jpg](https://qiita-image-store.s3.amazonaws.com/0/211703/417ce37e-0277-df59-4208-b38e137efea3.jpeg)
![IMG_20171105_113920.jpg](https://qiita-image-store.s3.amazonaws.com/0/211703/4b12649a-1ebf-4a45-1550-66bbe98c3fe4.jpeg)

# ソフトウェア
内容としては、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