Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right USB chevron_right Button Mouse Control — управление курсором с помощью кнопок

Button Mouse Control — управление курсором с помощью кнопок

Подключите пять кнопок к Arduino Leonardo и управляйте курсором мыши прямо с макетной платы — без лишнего программного обеспечения.

С помощью библиотеки Mouse можно превратить Arduino Leonardo, Micro или Due в настоящее USB-устройство ввода и управлять курсором прямо с платы. В этом уроке мы подключим пять кнопок: четыре отвечают за направление движения курсора (вверх, вниз, влево, вправо), а пятая имитирует нажатие левой кнопки мыши.

Важно понимать: курсор двигается относительно текущей позиции. Каждый раз, когда Arduino считывает нажатую кнопку, он смещает курсор на фиксированное расстояние от того места, где тот находится прямо сейчас — а не прыгает в абсолютную точку экрана.

При нажатии любой из четырёх направленных кнопок Arduino считывает сигнал HIGH и преобразует его в смещение курсора на 5 единиц в нужную сторону.

Пятая кнопка управляет левым кликом: пока кнопка удерживается — компьютер видит нажатую кнопку мыши, при отпускании — фиксирует отпускание.

Важно! Как только вы вызываете команду Mouse.move(), Arduino перехватывает управление курсором вашего компьютера. Чтобы не потерять контроль над системой, убедитесь, что логика скетча обновляет курсор только при нажатии кнопки, а не в каждом проходе loop(). Именно так и устроен этот пример.

Необходимое оборудование

  • Arduino Leonardo, Micro or Due board
  • 5 тактовых кнопок (momentary pushbuttons)
  • 5 резисторов по 10 кОм
  • соединительные провода
  • макетная плата

Схема подключения

Подключите плату к компьютеру кабелем micro-USB. Кнопки подключаются к цифровым входам со 2-го по 6-й. Резисторы 10 кОм используются как подтягивающие к земле (pull-down) — это обязательное условие корректной работы.

Схема подключения кнопок к Arduino Leonardo на макетной плате для управления мышью

Принципиальная схема

Принципиальная схема подключения пяти кнопок с подтягивающими резисторами к Arduino Leonardo

Как это работает

Каждая кнопка соединяет вход с питанием 5V. Резистор 10 кОм удерживает вход на уровне LOW, пока кнопка не нажата. При нажатии на входе появляется HIGH, и Arduino реагирует: вызывает Mouse.move() с нужным смещением или отправляет команду нажатия/отпускания кнопки мыши.

Почему именно 5 единиц смещения? Это разумный компромисс: курсор движется заметно, но не улетает за край экрана за одно нажатие. Значение легко изменить в коде под свои нужды.

Код

/*

  ButtonMouseControl

  Только для плат Leonardo и Due.

  Управление мышью с помощью пяти кнопок на Arduino Leonardo, Micro или Due.

  Оборудование:

  - пять кнопок, подключённых к D2, D3, D4, D5, D6

  Движение мыши всегда относительное. Скетч считывает четыре кнопки

  и использует их для задания направления движения курсора.

  ВНИМАНИЕ: при вызове Mouse.move() Arduino перехватывает управление

  мышью! Убедитесь, что контролируете ситуацию перед использованием команд мыши.

  создан 15 марта 2012

  изменён 27 марта 2012

  автор Tom Igoe

  Код примера находится в общественном достоянии.

  https://www.arduino.cc/en/Tutorial/ButtonMouseControl

*/

#include "Mouse.h"

// назначение номеров пинов для пяти кнопок:

const int upButton = 2;

const int downButton = 3;

const int leftButton = 4;

const int rightButton = 5;

const int mouseButton = 6;

int range = 5;              // диапазон перемещения по X или Y; влияет на скорость движения
int responseDelay = 10;     // задержка отклика мыши, в мс

void setup() {

  // инициализация входов кнопок:

  pinMode(upButton, INPUT);

  pinMode(downButton, INPUT);

  pinMode(leftButton, INPUT);

  pinMode(rightButton, INPUT);

  pinMode(mouseButton, INPUT);

  // инициализация управления мышью:

  Mouse.begin();
}

void loop() {

  // считывание состояния кнопок:

  int upState = digitalRead(upButton);

  int downState = digitalRead(downButton);

  int rightState = digitalRead(rightButton);

  int leftState = digitalRead(leftButton);

  int clickState = digitalRead(mouseButton);

  // вычисление расстояния перемещения на основе состояний кнопок:

  int  xDistance = (leftState - rightState) * range;

  int  yDistance = (upState - downState) * range;

  // если X или Y не равно нулю — двигаем курсор:

  if ((xDistance != 0) || (yDistance != 0)) {

    Mouse.move(xDistance, yDistance, 0);

  }

  // если кнопка мыши нажата:

  if (clickState == HIGH) {

    // если мышь ещё не нажата — нажать:

    if (!Mouse.isPressed(MOUSE_LEFT)) {

      Mouse.press(MOUSE_LEFT);

    }

  }

  // иначе кнопка мыши не нажата:

  else {

    // если мышь нажата — отпустить:

    if (Mouse.isPressed(MOUSE_LEFT)) {

      Mouse.release(MOUSE_LEFT);

    }

  }

  // задержка, чтобы мышь не двигалась слишком быстро:

  delay(responseDelay);
}

Типичные ошибки

  • Забыли резисторы — без pull-down резисторов входы «висят в воздухе» и курсор хаотично дёргается даже без нажатий.
  • Загрузили скетч и потеряли курсор — если в коде Mouse.move() вызывается без условия, курсор уходит в угол. Всегда проверяйте логику перед загрузкой или держите под рукой комбинацию клавиш для остановки скетча.
  • Использовали Arduino Uno — библиотека Mouse работает только на платах с нативной поддержкой USB HID: Leonardo, Micro, Due. На Uno этот скетч не заработает.
  • Перепутали pull-up и pull-down — в этой схеме используются pull-down резисторы (к GND), а не pull-up (к 5V). Если подключить наоборот, логика нажатий инвертируется.

Как проверить результат

После загрузки скетча откройте любое окно на компьютере и нажмите одну из направленных кнопок — курсор должен плавно сместиться. Нажмите пятую кнопку над каким-нибудь элементом интерфейса — произойдёт клик. Если курсор не реагирует, проверьте соединения и убедитесь, что плата определилась как HID-устройство в диспетчере устройств.

Где пригодится

  • Управление презентацией или медиаплеером без клавиатуры
  • Специальные устройства ввода для людей с ограниченными возможностями
  • Простой геймпад или пульт дистанционного управления курсором
  • Учебные проекты по теме USB HID

Дополнительные материалы

Больше базовых примеров можно найти в разделе built-in examples.

Подробное описание всех функций языка — в справочнике language reference.

Последнее обновление: 28.07.2015, SM