マインクラフト自動釣り機用USBマウス

## 背景

ゲーム・<a href="https://www.minecraft.net/ja-jp/">マインクラフト</a>を、よくやっています。あまり構造物に凝る方ではないので、ワールドを半年～１年程度成長させると、また最初からやりなおす感じです。
ワールド序盤の、だんだん出来ることが広がっていく感じが楽しいです。

ゲーム序盤で必ず作るのが<a href="https://www.youtube.com/watch?v=CJEM4nJu1As">自動釣り機</a>。マウスの右ボタンを押しっぱなしにしておくだけで、釣りでき、長時間放置すると多くのアイテムを手に入れることができます。

マウスの右ボタンを押したままで放置するのは、USBマウスの右ボタンを押した状態で抜くという方法で対応してました。この方法で問題はないのですが、若干面倒くさい。Audio出力を０にし忘れたとか、左手に修理するツルハシを持ち忘れたりすると、マウスのUSBコネクタを刺し直す必要があるので面倒です。

そこで、右ボタンを押しっぱなしにする機能があるUSBマウスを製作することにしました。マウスは同時に複数使用可能なので、右ボタン以外の機能は他のマウスに任せます。

## ProMicro

何を使うと楽に作れそうか調べました。<a href="https://store.arduino.cc/usa/leonardo">Arduino Leonard</a>は CPUが ATmega32u4 でUSB マウスやキーボードにできるらしいです。ソフトウェア・コンパチブルでコンパクトなモジュール<a href="https://www.sparkfun.com/products/12640?_ga=2.229715674.770824999.1568187867-1706112412.1568187867">Pro Micro</a>が sparkfunから販売されており、さらにそのコンパチ品がAliExpressやアマゾンで安価に販売されています。

私はアマゾンからコンパチ品を560円で購入しました。

<img src="http://blog3.narimatsu.net/photo/p190912a0/JPG/320">


## 動作確認

コンパチモジュールが来たので、動作確認を行います。Windows機にUSB-microケーブルで接続するとシリアルポートとして認識されまｓ。Arduino-IDEを立ち上げ、ボードは Arduino Leonardを選択。ポートは先程認識されたポートを設定します。

スケッチの例の 09.USBに　ButtonMouseControl というのがあるのでこれを書き込んで見る。端子のD2-D6の状態で、マウスが動いたり、左ボタンがクリックされたりするようである。

プログラムを書き込むと、動作しているようなので回路とプログラムの作成に移ります。

## 回路図

以下に回路図を示します。

<img src='http://blog3.narimatsu.net/photo/p190912a6/JPG/600'>

スイッチとLEDがつながっているだけの簡単な回路です。
LEDは、最初無かったが、マウスのボタンの押下状態を表示するのに
欲しくなって追加しました。光量の調整をするため analogWrite/PWMが可能な
端子に接続しています。

スイッチとLEDは１組で充分だったが、
スペースが空いているので
将来の機能追加のためもう１組接続しました。

## 写真

以下に基板の写真を示します。

<img src='http://blog3.narimatsu.net/photo/p190912a1/JPG/320'>

## プログラム

以下にプログラムを示す。

```cpp:mouseRightSW.ino
#include "Mouse.h"

// set pin numbers for the five buttons:
const int SW1  =  8;
const int SW2  = 16;
const int LED1 =  9;
const int LED2 = 10;

const int led1_bright = 50;
const int led2_bright = 50;

int responseDelay = 100;

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("\nReset");

  pinMode(SW1, INPUT);
  digitalWrite(SW1, HIGH);
  pinMode(SW2, INPUT);
  digitalWrite(SW2, HIGH);

  analogWrite(LED1,0);
  analogWrite(LED2,0);

  Mouse.begin();
}

void loop() {
  static int sw10 = HIGH;
  static int sw20 = HIGH;
  int sw1 = digitalRead(SW1);
  int sw2 = digitalRead(SW2);
  

  if(sw1 != sw10){
    if(sw1 == HIGH){
      if(Mouse.isPressed(MOUSE_LEFT)){
	Mouse.release(MOUSE_LEFT);
	analogWrite(LED1, 0);
	Serial.println("L-Release");
	
      } else {
	Mouse.press(MOUSE_LEFT);
	analogWrite(LED1, led1_bright);
	Serial.println("L-Press");
      }
    }
    sw10 = sw1;
  }
  
  if(sw2 != sw20){
    if(sw2 == HIGH){
      if(Mouse.isPressed(MOUSE_RIGHT)){
	Mouse.release(MOUSE_RIGHT);
	analogWrite(LED2, 0);
	Serial.println("R-Release");
	
      } else {
	Mouse.press(MOUSE_RIGHT);
	analogWrite(LED2, led2_bright);
	Serial.println("R-Press");
      }
    }
    sw20 = sw2;
  }
  delay(responseDelay);
}
```
## 注意

マウスを扱うプログラムなので、バグがあると場合によってはマウスボタンを連続でクリックされてしまい、Arduino-IDEでプログラムを書き直すのが困難になる場合があります。

そういう状況を想定しているのか、<a href="https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/ProMicro16MHzv1.pdf">Pro MicroのGraphical Datasheet</a>にはRST端子のところに、reset'button'をダブルタップすると８秒間bootloaderモードにとどまると書いてあります。

試してませんが、RST端子にリセットスイッチを接続しておいたほうが良いかもしれません。

## おわりに

Pro Micro等のArduino Leonard コンパチ品を使用すると、容易かつ安価に USB Mouse/Keyboardが製作できることを知りました。いろんなソフトのショートカット機能をハードウェアで実現できることになったので、いろいろと応用ができそうです。