マウスのダブルクリックが動くようにする
前の投稿で,マウスのダブルクリックができませんでしたが,このサイトで確認したところ,クリックも判定してもらえていないことが分かりました.
改めて,サンプルプログラムで確認しました.
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マウスとして使用することができるようになりました.


























































