2023年4月16日日曜日

Raspberry Pi PicoをUSBマウスとして使う(3/3)(マウスボタンのダブルクリックが使えるようにする)

マウスのダブルクリックが動くようにする

前の投稿で,マウスのダブルクリックができませんでしたが,このサイトで確認したところ,クリックも判定してもらえていないことが分かりました.

改めて,サンプルプログラムで確認しました.

Arduino IDEのメニューをたどると,サンプルプログラムとして[File]→[Examples]→[09.USB]→[Mouse]→[ButtonMouseControl]というのがあります.このサンプルでは,Mouse.press()とMouse.release()だけを使っており,Mouse.click()を使っていないのですが,このプログラムを用いると,このサイトのシングルクリックの判定とダブルクリックの判定がうまくいきました.また,ドラッグの動作もうまく行きました.

そこで,シンプルに,クリックとドラッグの判定をせずに,マウスボタンのdownとupそのものを送出するようにしました.

これが以下のプログラムです.

// move mouse cursor by joystick
// implement left/right button
// 2023/4/16

#include <Mouse.h>

void setup() {
  Serial.begin(9600);
  // joystick
  gpio_init(27);
  gpio_set_dir(27, GPIO_IN); // GP27 in:0(false) out:1(true)
  gpio_init(28);
  gpio_set_dir(28, GPIO_IN); // GP28 in:0(false) out:1(true)
  // button
  gpio_init(16); // right button
  gpio_set_dir(16, GPIO_IN);
  gpio_pull_down(16);
  gpio_init(17); // left button
  gpio_set_dir(17, GPIO_IN);
  gpio_pull_down(17);
  Mouse.begin();
  delay(5000);
}

#define MIN_RAW 3
#define MAX_RAW 1023
#define MIDDLE_RAW ((MAX_RAW - MIN_RAW)/2)

#define MOUSE_DOWN 1
#define MOUSE_UP 0

void loop() {

  //----------------------------------------
  // move
  uint16_t raw_x = analogRead(28); // 3..1023
  int16_t value_x = (raw_x - MIDDLE_RAW)/10; // -50..51
  uint16_t raw_y = analogRead(27); // 3..1023
  int16_t value_y = (raw_y - MIDDLE_RAW)/10; // -50..51

  float dx=0.0;
  float dy=0.0;
  if (value_x > 0) {
    dx = -((float)value_x * value_x / 200.0);
  } else {
    dx = ((float)value_x * value_x / 200.0);
  }
  if (value_y > 0) {
    dy = (float)value_y * value_y / 200.0;
  } else {
    dy = -(float)value_y * value_y / 200.0;
  }
  Mouse.move(dx, dy, 0);

  //----------------------------------------
  // click/drag
  bool left_button_val = gpio_get(17);
  bool right_button_val = gpio_get(16);

  // left button down
  if (left_button_val == MOUSE_DOWN) {
    // if the mouse is not pressed, press it:
    if (!Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.press(MOUSE_LEFT);
    }
  } else {
    // if the mouse is pressed, release it:
    if (Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.release(MOUSE_LEFT);
    }
  }
  // right button down
  if (right_button_val == MOUSE_DOWN) {
    // if the mouse is not pressed, press it:
    if (!Mouse.isPressed(MOUSE_RIGHT)) {
      Mouse.press(MOUSE_RIGHT);
    }
  } else {
    // if the mouse is pressed, release it:
    if (Mouse.isPressed(MOUSE_RIGHT)) {
      Mouse.release(MOUSE_RIGHT);
    }
  }
  delay(10);
}

これでめでたく,USBマウスとして使用することができるようになりました.