Arduino:Примеры/JoystickMouseControl
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Управление мышью при помощи джойстика [1]
Используя библиотеку Mouse и плату Arduino (Leonardo, Micro или Due), вы можете управлять экранным курсором компьютера. Конкретно в этом примере для этого используется джойстик, а также кнопка, которая переключает управление курсором с джойстика на мышь и обратно.
Новая позиция курсора на Arduino всегда высчитывается относительно его предыдущей позиции. Таким образом, при любом получении входных аналоговых данных курсор будет менять свое положение относительно того, где он стоял в прошлый раз.
Значения, поданные на два входных аналоговых контакта, будут варьироваться в диапазоне от 0 до 1023, но программа преобразует эти числа в диапазон от 0 до 12. Данный скетч считает, что «неподвижные» значения джойстика находятся в центре этого диапазона, но при этом могут варьироваться в пределах пороговых «рамок».
Кнопка позволяет переключать управление курсором с джойстика на мышь и обратно. Кроме того, об этом будет возвещать светодиод, подключенный к 5-ому контакту – он будет загораться, когда 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;
}
См.также
- Mouse.begin()
- Mouse.click()
- Mouse.end()
- Mouse.move()
- Mouse.press()
- Mouse.release()
- Mouse.isPressed()
Внешние ссылки
Arduino продукты | |
---|---|
Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino |
Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter |
Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle |
Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap |
3D-печать | Arduino Materia 101 |
Устаревшие устройства | - |
Примеры Arduino | |
---|---|
Стандартные функции | |
Основы |
|
Цифровой сигнал |
|
Аналоговый сигнал |
|
Связь |
|
Управляющие структуры |
|
Датчики |
|
Дисплей |
Примеры, объясняющие основы управления дисплеем:
|
Строки |
|
USB (для Leonardo, Micro и Due плат) |
В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due.
|
Клавиатура |
|
Мышь |
|
Разное |
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino