0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Arduino Due とMouse.h

Last updated at Posted at 2021-02-08

概要

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

接続

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

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

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

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

# include <Mouse.h>

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

void loop() {
  
    Mouse.click();

}

450click/minでした.

スイッチを押したらクリック

pin5にスイッチをつける

# 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とか入れたらいいかもしれません.私は,ハード的に入れました.

マウス移動

Mouse.move(x,y,wheel);

相対移動.
PCでは左上原点で右x,下yです.

私のスマホは720*1520画素で,原点は右下で左x,上yでした
スマホの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
2.png

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

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

# 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
こんな感じで範囲選択できます.
左ボタンを押すという関数

Mouse.press();

でできます.moveで移動後

Mouse.release();

でボタンを離します.

# 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のみ受け付ける
関数を作った

# 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);
  
}
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?