Изучаем Arduino: инструметы и методы технического волшебства - [38]

Шрифт
Интервал

int yVal = readJoystick(Y_AXIS);//Получить отклонение джойстика по оси у

Mouse.move(xVal, yVal, 0);//Перемещаем мышь

readButton(LEFT_BUTTON, MOUSE_LEFT);// Чтение состояния левой кнопки

readButton(MIDDLE_BUTTON, MOUSE_MIDDLE);//Чтение состояния средней кнопки

readButton(RIGHT_BUTTON, MOUSE_RIGHT); //Чтение состояния правой кнопки

delay(5);

}

int readJoystick(int axis)// Чтение значения джойстика, масштабирование

{

int val = analogRead(axis);

// Чтение аналогового значения

val = map(val, 0, 1023, -10, 10); // Масштабирование значения

if (val <= 2 && val >= -2)

// Убрать дрейф мыши

return 0;

else// Вернуть значение

return val;

}

// Чтение состояния кнопок и отправка команд мыши

void readButton(int pin, char mouseCommand)

{

// Если кнопка нажата, эмулируем нажатие, если она еще не быпа нажата

if (digitalRead(pin) == HIGH)

{

if ( ! Mouse.isPressed (mouseCommand) )

{

Mouse.press(mouseCommand);

}

}

// Отпустить нажатие мыши

else

{

if (Mouse.isPressed(mouseCommand))

- 151 -

{

Mouse.release(mouseCommand);

}

}

}

Это, безусловно, один из наиболее сложных примеров из всех, рассмотренных до сих пор. Подробно разберем его, чтобы понять новые функции и ход выполнения программы.

В начале программы определены контакты для подключения кнопок и джойстика, в функции setup() подключена библиотека эмулятора мыши. В цикле loop() непрерывно опрашиваются контакты джойстика и выдаются значения для движения курсора мыши. Контакты кнопок также проверяются и при нажатии кнопки сигнал передается в компьютер.

Функция readJoystick() считывает и масштабирует значения от джойстика. По каждой координате джойстик выдает ряд значений от 0 до 1024, полученных от АЦП.

Но курсор мыши перемещается по относительным координатам и передача Mouse.move() нулевого значения соответствует отсутствию движения по этой оси.

Передача положительного значения для оси х будет перемещать курсор мыши вправо, а отрицательного - влево. Чем больше величина, тем дальше будет перемещаться курсор. Таким образом, в функции readJoystick() значения от 0 до 1023 масштабируем к диапазону от -10 до 10.

Для устранения дрейфа предусмотрен небольшой запас в районе нуля, где курсор мыши должен быть неподвижен. Это связано с тем, что во время нахождения рукоятки джойстика в среднем положении фактическое значение может колебаться вокруг 512. Мы должны быть уверены, что при отпускании джойстика курсор мыши не будет двигаться самопроизвольно. Значения х и у передаются функции mouse.move(), что приводит к перемещению курсора на экране. Третий аргумент функции mouse.move() определяет движение колеса прокрутки.

Функция readButton() служит для определения состояния каждой из трех кнопок.

Функция определяет текущее состояние мыши с помощью команды mouse.isPressed() и опрашивает мышь через функции Mouse.press() и Mouse.release().

ПРИМЕЧАНИЕ

Демонстрационный видеоклип эмулятора мыши для управления компьютером с помощью джойстика можно посмотреть на странице http://www.exploringarduino.com/content/ch6.

Резюме

В этой главе вы узнали следующее:

• Как подключить плату Arduino к компьютеру через USB-преобразователь последовательного порта.

- 152 -


• Как осуществляется преобразование USB-интерфейса в последовательный порт на различных платах Arduino.

• Как можно отправлять данные с Arduino в компьютер через USB-интерфейс.

• Как форматировать отправляемые данные с помощью специальных символов.

• Что последовательные данные передаются в виде символа, который можно преобразовать в целые числа различными способами.

• Как отправлять данные в виде списков с разделителями-запятыми и преобразовывать их в команды с помощью встроенных функций.

• Как можно передать данные из Arduino внешнему приложению на языке Processing.

• Что можно отправлять данные из Processing-приложения на периферийные устройства, подключенные к Arduino.

• Что плата Arduino Leonardo может эмулировать клавиатуру и мышь.

Глава 7. Сдвиговые регистры

Список деталей

Для повторения примеров главы вам понадобятся следующие детали:

• плата Arduino Uno;

• USB-кабель А - В (для Uno );

• 8 красных светодиодов;

• 3 желтых светодиода;

• 5 зеленых светодиодов;

• 8 резисторов номиналом 220 Ом;

• сдвиговый регистр SN74HC595N в DIP-корпусе;

• инфракрасный датчик расстояния GP2YOA41 SKOF с кабелем;

• перемычки;

• макетная плата.

Электронные ресурсы к главе

На странице http://www.exploringarduino.com/content/ch7 можно загрузить программный код, видеоуроки и другие материалы для данной главы. Кроме того, листинги примеров можно скачать со страницы www.wiley.com/go/exploringarduino в разделе Downloads.

Что вы узнаете в этой главе

Чем дальше вы продвигаетесь в создании новых устройств на основе Arduino, тем чаще возникает мысль: "Что будет, если закончатся контакты платы Arduino?" Например, в одном из популярных проектов плата Arduino управляет множеством мигающих светодиодов. Осветите свою комнату! Иллюминируйте свой компьютер!

Украсьте светодиодами свою собаку! Последнее, пожалуй, перебор.

Но проблема остается. Как быть, если вы захотите переключать 50 светодиодов (или управлять другими цифровыми выходами), а все контакты ввода-вывода уже