Главная chevron_right Функции chevron_right USB chevron_right Mouse.move()

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, не вызывая саму функцию. Так можно убедиться, что значения разумны, прежде чем курсор начнёт неконтролируемо перемещаться по экрану.
  • Помните, что пока скетч активно управляет мышью, вернуть контроль над курсором может быть непросто. Предусмотрите аппаратную кнопку или условие, при котором управление мышью отключается.

Полезные материалы