Arduino:Примеры/JoystickMouseControl

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Управление мышью при помощи джойстика [1]

Используя библиотеку Mouse и плату Arduino (Leonardo, Micro или Due), вы можете управлять экранным курсором компьютера. Конкретно в этом примере для этого используется джойстик, а также кнопка, которая переключает управление курсором с джойстика на мышь и обратно.

Новая позиция курсора на Arduino всегда высчитывается относительно его предыдущей позиции. Таким образом, при любом получении входных аналоговых данных курсор будет менять свое положение относительно того, где он стоял в прошлый раз.

Значения, поданные на два входных аналоговых контакта, будут варьироваться в диапазоне от 0 до 1023, но программа преобразует эти числа в диапазон от 0 до 12. Данный скетч считает, что «неподвижные» значения джойстика находятся в центре этого диапазона, но при этом могут варьироваться в пределах пороговых «рамок».

Кнопка позволяет переключать управление курсором с джойстика на мышь и обратно. Кроме того, об этом будет возвещать светодиод, подключенный к 5-ому контакту – он будет загораться, когда Arduino будет перехватывать управление мышью.

Внимание!

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

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

  • Плата Arduino (Leonardo, Micro или Due);
  • Двухосевой джойстик;
  • Две кнопки;
  • Один резистор на 10 кОм (если потребуется);

Цепь

Подключите Arduino к компьютеру при помощи microUSB-кабеля. Кнопки подключите ко 2-ому и 3-ему цифровым контактам. Если вы используете модуль джойстика как на картинке внизу, стягивающий резистор может не потребоваться. X-ось джойстика подключите к 0-ому аналоговому контакту, а Y-ось – к 1-ому аналоговому контакту.

Схема

Код

/*
 Управление мышью при помощи джойстика
 Позволяет управлять курсором мыши при помощи джойстика и Arduino (Leonardo или Micro).
 Использует две кнопки – одну, чтобы переключать управление курсором с мыши на джойстик и наоборот,
 а вторую для имитации левого клика мыши.
 
 Оборудование:
 * Двухосевой джойстик, подключенный к 0-ому и 1-ому аналоговым контактам
 * Кнопки, подключенные ко 2-ому и 3-ему цифровым контактам 
 
 Позиция курсора всегда высчитывается относительно того, где он находился в прошлый раз.
 Этот скетч считывает данные от двух входных аналоговых контактов,
преобразовывая диапазон от 0 до 1023 (или меньше на какой-либо из осей) в диапазон от -6 до 6. 
 Данный скетч считает, что «неподвижные» значения джойстика находятся в центре этого диапазона
и варьируются в пределах определенных пороговых «рамок».
 
 ВНИМАНИЕ: При использовании команды Mouse.move() плата Arduino перехватывает управление курсором на себя! 
 Поэтому перед использованием этой команды убедитесь, что у вас есть средства управления компьютером.
 Кроме того, этот скетч предусматривает специальную кнопку, 
которая позволяет переключать управление курсором с Arduino на мышь и наоборот.
  
 Создан 15 сентября 2011,
 модифицирован 28 марта 2012 Томом Иго (Tom Igoe).
 
 Этот код не защищен авторским правом.
 
 */

// Задаем номера контактов для кнопок, светодиода и осей джойстика:
const int switchPin = 2;      // кнопка, переключающая управление курсором с Arduino на мышь и наоборот
const int mouseButton = 3;    // кнопка для левой кнопки мыши
const int xAxis = A0;         // X-ось джойстика  
const int yAxis = A1;         // Y-ось джойстика
const int ledPin = 5;         // светодиод, оповещающий о переключении управления курсором 

// Переменные для считывания данных от джойстика:
int range = 12;               // выходной диапазон для перемещения по оси X и Y
int responseDelay = 5;        // задержка в отклике мыши (в миллисекундах)
int threshold = range/4;      // пороговое значение, обозначающее «неподвижную» область джойстика
int center = range/2;         // значение, отвечающее за состояние покоя джойстика

boolean mouseIsActive = false;    // переменная, которая отвечает за то, контролирует Arduino мышь или нет
int lastSwitchState = LOW;        // предыдущее состояние переключательной кнопки

void setup() {
  pinMode(switchPin, INPUT);       // делаем контакт переключательной кнопки входным
  pinMode(ledPin, OUTPUT);         // делаем контакт светодиода выходным  
 // Перехватываем управление мышью:
  Mouse.begin();
}

void loop() {
  // Считываем данные с переключательной кнопки:
  int switchState = digitalRead(switchPin);
  // Если значение на этом контакте поменялось с LOW на HIGH,
  // переключаем состояние кнопки:
  if (switchState != lastSwitchState) {
    if (switchState == HIGH) {
      mouseIsActive = !mouseIsActive;
      // Включаем светодиод, чтобы оповестить о том, что Arduino перехватила управление мыши на себя:
      digitalWrite(ledPin, mouseIsActive);
    } 
  }
  // Сохраняем состояние переключателя для сравнения при следующем проходе через цикл:
  lastSwitchState = switchState;

  // Считываем данные с контактов, отвечающих за оси X и Y:
  int xReading = readAxis(A0);
  int yReading = readAxis(A1);

  // Если Arduino по-прежнему управляет мышью, двигаем ей:
  if (mouseIsActive) {
    Mouse.move(xReading, yReading, 0);
  }  

  // Считываем данные с кнопки, отвечающей за левый клик,
  // а затем либо кликаем, либо нет.
  // То есть, если кнопка, отвечающая за левую кнопку мыши, нажата:
  if (digitalRead(mouseButton) == HIGH) {
    // и если не нажата левая кнопка настоящей мыши:
    if (!Mouse.isPressed(MOUSE_LEFT)) {
    // то аналоговое нажатие переводим в цифровое: 
      Mouse.press(MOUSE_LEFT); 
    }
  } 
  // Кроме того, если кнопка, отвечающая за левую кнопку мыши, не нажата:
  else {
    // и если нажата левая кнопка настоящей мыши:
    if (Mouse.isPressed(MOUSE_LEFT)) {
    // то аналоговое «ненажатие» переводим в цифровое
    // (другими словами, отпускаем кнопку):
      Mouse.release(MOUSE_LEFT); 
    }
  }

  delay(responseDelay);
}

/*
  Считываем данные с «осевых» контактов (0-й контакт для X, 1-ый для Y),
  а затем преобразовываем их в диапазон от 0 до значения в переменной range.
 */

int readAxis(int thisAxis) { 
  // Считываем данные, вошедшие через аналоговые контакты:
  int reading = analogRead(thisAxis);

  // Преобразовываем считанные аналоговые данные в выходной диапазон:
  reading = map(reading, 0, 1023, 0, range);

  // Если выходные данные получились за пределами пороговых «рамок»
  // (т.е. «неподвижной» области джойстика), используем их:
  int distance = reading - center;

  if (abs(distance) < threshold) {
    distance = 0;
  } 

  // Возвращаем значение с дистанцией для этой оси:
  return distance;
}

См.также

  1. Mouse.click()
  2. Mouse.move()
  3. Mouse.press()
  4. Mouse.release()
  5. Mouse.isPressed()

Внешние ссылки