Arduino Due とMouse.h

#概要
Arduino DueでMouse.hを使う場合の情報が少ないので投稿します．

#接続

|名称|機能|場所|
|---|---|---|
|Program Port|プログラム書き込み　|DCジャックに近いほう|
|Native Port|Mouse click等の書き込んだUSB機能が実行される方|DCジャックから遠いほう|

注意
Native Portは自動的にUSB機能が始まるので，ずっとクリックするようなプログラムを書いてあると，つないでいる間ずっとクリックし続けてPCの操作ができなくなり，クッキークリッカーがはかどります．

”No Device Found com　X”　はボードのERASEボタンを3秒ほど長押ししてください．


#プログラム：ずっとクリックし続ける

```C
#include <Mouse.h>

volatile boolean flag = true;
void setup() {
  pinMode(2, INPUT);
  Mouse.begin();
}

void loop() {
  
    Mouse.click();

}
```
450click/minでした．

#スイッチを押したらクリック
pin5にスイッチをつける

```C
#include <Mouse.h>

volatile int flag = 0;

void setup() {
  pinMode(5, INPUT);
  Mouse.begin();
  Serial.begin(250000);
  Serial.println("hello");
}

void loop() {
  int data = digitalRead(5);
  if (data == LOW ){
    if(flag == 0){
      Mouse.click();
      flag = 1;
      Serial.println(flag);
      Serial.println("hello");
    }
  }
  
  if (data == HIGH){
    flag = 0;
    
  }
}
```
digitalRead(2)だとなぜか，HIGH,LOWが交互に反転してうまく動かないので注意です．
pullupとか入れたらいいかもしれません．私は，ハード的に入れました．

#マウス移動

```C
Mouse.move(x,y,wheel);
```
相対移動.
PCでは左上原点で右x,下yです．

私のスマホは720*1520画素で，原点は右下で左ｘ，上ｙでした
スマホのUSBマウスとして動作させる，x方向の移動では
move(700)-> 5mm
move(10)->0.5mm
move(5000)->9mm
move(30000)->4mm
move(10000)->1mm
move(8000)->5mm
move(4000)->8mm
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/21bbd941-e8ae-5585-f616-b4df9d851589.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/bcc0518a-07a1-f9d4-edc5-8d8c40cc0828.png)

規則性は不明です．8mmずつしか移動できないっぽいので，8mmずつで少しずつ動かすしかなさそうです．
同様のことをy方向で行うとyは9mmずつっぽいです．

追記：引数はsigned charっぽいです．つまり，-128~127までしか受け付けないっぽい

```C
#include <Mouse.h>

volatile int flag = 0;

void setup() {
  pinMode(5, INPUT);
  Mouse.begin();
  Serial.begin(250000);
  Serial.println("hello");
}

void loop() {
  int data = digitalRead(5);
  if (data == LOW ){
    if(flag == 0){
      Mouse.move(100,100,0);
      flag = 1;
      Serial.println(flag);
      Serial.println("hello");
    }
  }
  
  if (data == HIGH){
    flag = 0;
    
  }
}
```

#ドラック
デスクトップ上で実行すると
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/82665eac-f7a3-24a4-f319-305e6b5b8558.png)
こんな感じで範囲選択できます．
左ボタンを押すという関数

```C
Mouse.press();
```
でできます．moveで移動後

```C
Mouse.release();
```
でボタンを離します．

```C
#include <Mouse.h>

volatile int flag = 0;

void setup() {
  pinMode(5, INPUT);
  Mouse.begin();
  Serial.begin(250000);
  Serial.println("hello");
}

void loop() {
  int data = digitalRead(5);
  if (data == LOW ){
    if(flag == 0){
      Mouse.press();
      Mouse.move(100,500,0);
      delay(1000);
      Mouse.release();
      flag = 1;
      Serial.println(flag);
      Serial.println("hello");
    }
  }
  
  if (data == HIGH){
    flag = 0;
    
  }
}
```

#追記：move
moveはsigned charのみ受け付ける
関数を作った

```C
#include <Mouse.h>

volatile int flag = 0;

void setup() {
  pinMode(5, INPUT);
  Mouse.begin();
  Serial.begin(250000);
  Serial.println("hello");
}

void loop() {
  int data = digitalRead(5);
  if (data == LOW ) {
    if (flag == 0) {
      move_mm(50,50);

      flag = 1;
      Serial.println("end");
      Serial.println("numnnnn");
    }
  }

  if (data == HIGH) {
    flag = 0;

  }
}

void home_UL() {//左上移動
  move(-1000, -1000);
}

void home_DL() {//左下移動
  move(-1000, 1000);
}

volatile  int delay_time = 10;
void move(int x, int y) {
  if (x >= 0) {
    int x_num = floor(x / 127);
    Serial.println(x_num);
    Serial.println("move");
    signed char x_lef = x - x_num * 127;
    for (int i = 0; i < x_num; i++) {
      Mouse.move(127, 0, 0);
      delay(delay_time);
    }
    Mouse.move(x_lef, 0, 0);
    delay(delay_time);
  } else {
    x = x * -1;
    int x_num = floor(x / 127);
    signed char x_lef = (x - x_num * 127) * -1;
    for (int i = 0; i < x_num; i++) {
      Mouse.move(-127, 0, 0);
      delay(delay_time);
    }
    Mouse.move(x_lef, 0, 0);
    delay(delay_time);
  }
  if (y >= 0) {
    int y_num = floor(y / 127);
    signed char y_lef = y - y_num * 127;
    for (int i = 0; i < y_num; i++) {
      Mouse.move(0, 127, 0);
      delay(delay_time);
    }
    Mouse.move(0, y_lef, 0);
    delay(delay_time);
  } else {
    y = y * -1;
    int y_num = floor(y / 127);
    signed char y_lef = (y - y_num * 127) * -1;
    for (int i = 0; i < y_num; i++) {
      Mouse.move(0 , -127, 0);
      delay(delay_time);
    }
    Mouse.move(0, y_lef, 0);
    delay(delay_time);
  }
}

void move_mm(int x, int y) {
  /*
   * 右下原点にしたい
   * x:そのまま
   * y:-y_mm で反転する．
   * 
   * 
   */
  home_DL();
  int x_num = x*4.35;
  int y_num = y*-4.35;
  Serial.println(y_num);
  move(x_num,y_num);
  
}
```