Mouse.move()
Mouse.move() сдвигает курсор мыши на заданное смещение по осям X и Y и управляет колесом прокрутки; все параметры имеют тип signed char.
Полная статья
Описание
Mouse.move() отправляет компьютеру команду сдвинуть курсор относительно его текущего положения. Важно понимать: это не установка абсолютных координат, а именно смещение. Положительный xVal толкает курсор вправо, отрицательный — влево; положительный yVal — вниз, отрицательный — вверх. Третий параметр позволяет одновременно прокручивать колесо мыши.
Перед первым вызовом Mouse.move() обязательно инициализируйте библиотеку вызовом Mouse.begin().
Синтаксис
Mouse.move(xVal, yVal, wheel)
Параметры
xVal: горизонтальное смещение курсора. Тип данных:signed char.yVal: вертикальное смещение курсора. Тип данных:signed char.wheel: величина прокрутки колеса мыши. Тип данных:signed char.
Возвращает
Ничего
Пример кода
#include <Mouse.h>
const int xAxis = A1; //аналоговый датчик оси X
const int yAxis = A2; // аналоговый датчик оси Y
int range = 12; // диапазон выходных значений перемещения по X или Y
int responseDelay = 2; // задержка отклика мыши, в мс
int threshold = range / 4; // порог состояния покоя
int center = range / 2; // значение позиции покоя
int minima[] = {1023, 1023}; // фактические минимумы analogRead для {x, y}
int maxima[] = {0, 0}; // фактические максимумы analogRead для {x, y}
int axis[] = {xAxis, yAxis}; // номера пинов для {x, y}
int mouseReading[2]; // итоговые значения перемещения мыши для {x, y}
void setup() {
Mouse.begin();
}
void loop() {
// считываем и масштабируем два axes:
int xReading = readAxis(0);
int yReading = readAxis(1);
// перемещаем мышь:
Mouse.move(xReading, yReading, 0);
delay(responseDelay);
}
/*
считывает ось (0 или 1 для x или y) и масштабирует
диапазон аналогового входа в диапазон от 0 до <range>
*/
int readAxis(int axisNumber) {
int distance = 0; // расстояние от центра выходного диапазона
// считываем аналоговый вход:
int reading = analogRead(axis[axisNumber]);
// если текущее значение превышает максимум или минимум для этой оси,
// обновляем максимум или минимум:
if (reading < minima[axisNumber]) {
minima[axisNumber] = reading;
}
if (reading > maxima[axisNumber]) {
maxima[axisNumber] = reading;
}
// отображаем значение из диапазона аналогового входа в выходной диапазон:
reading = map(reading, minima[axisNumber], maxima[axisNumber], 0, range);
// если выходное значение выходит за пределы
// порога позиции покоя — используем его:
if (abs(reading - center) > threshold) {
distance = (reading - center);
}
// ось Y необходимо инвертировать, чтобы
// корректно отобразить направление движения:
if (axisNumber == 1) {
distance = -distance;
}
// возвращаем расстояние для данной оси:
return distance;
}
Где применяется
- Джойстик или акселерометр как мышь — аналоговый сигнал преобразуется в смещение курсора и передаётся через
Mouse.move(). - Сенсорная панель или трекбол — физическое движение транслируется в относительные координаты.
- Автоматизация интерфейса — скетч двигает курсор по заданной траектории, например для тестирования UI.
- Специализированные устройства ввода — адаптации для людей с ограниченными возможностями, где стандартная мышь неудобна.
Практические замечания
- Все три параметра ограничены типом
signed char, то есть допустимый диапазон значений — от-128до127. Если передать число за пределами этого диапазона, оно будет усечено. - Для плавного движения лучше отправлять небольшие смещения с короткой задержкой между вызовами, чем один большой шаг: резкий рывок курсора выглядит неестественно и может привести к промахам по элементам интерфейса.
- При работе с аналоговыми датчиками почти всегда нужна «мёртвая зона» — диапазон значений вблизи нуля, при котором движение не передаётся. Без неё курсор будет непрерывно дрожать даже в состоянии покоя из-за шума АЦП.
- На этапе отладки удобно сначала выводить рассчитанные
xValиyValвSerial Monitor, не вызывая саму функцию. Так можно убедиться, что значения разумны, прежде чем курсор начнёт неконтролируемо перемещаться по экрану. - Помните, что пока скетч активно управляет мышью, вернуть контроль над курсором может быть непросто. Предусмотрите аппаратную кнопку или условие, при котором управление мышью отключается.