Игра в Ping Pong с использованием Arduino и акселерометра


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

Игра в Ping Pong с использованием Arduino и акселерометра: внешний вид

В этом проекте мы постараемся создать на основе платы Arduino упрощенную модель подобных игровых систем, а именно мы реализуем игру в Ping Pong (настольный теннис), в которую можно будет играть с помощью акселерометра, а управление в этой игре будет осуществляться с помощью движений рук.

В настоящее время для создания подобного проекта можно использовать кучу самых различных программ - мы будем использовать одну из них под названием Processing. Это основанное на JAVA приложение, с помощью которого мы можем сформировать необходимую нам программу в формате .exe и в формате .apk (для android приложения). Ранее программу Processing мы использовали в проекте создания комнаты чата с помощью Arduino и радиочастотных модулей.

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

Внешний вид необходимых компонентов для нашего проекта

Работа схемы

Схема соединений рассматриваемого проекта показана на следующих рисунках.

Схема соединений платы Arduino и акселерометра

Схема нашего проекта

Как видим, схема устройства очень проста и содержит плату Arduino Nano и акселерометр. Но при этом необходимо учитывать ряд моментов:

  1. На акселерометр нельзя подавать питающее напряжение 5V, поэтому его контакт Vcc следует подсоединить к контакту 3.3V платы Arduino.
  2. Каждый акселерометр страдает от силы тяжести, негативные эффекты которой следует обрабатывать программным путем или устранять с помощью фильтра.

Принципы работы акселерометра

Акселерометр представляет собой устройство, которое преобразует ускорение в любом направлении в соответствующее изменение напряжения. Это осуществляется с помощью конденсаторов (см. рисунок) – как только ускоритель (в виде шарика) двигается, одна пластина конденсатора также сдвигается, поэтому его емкость изменяется, что в итоге приводит к изменению напряжения.

Трехмерный разрез акселерометра Принципы работы акселерометра

Как уже было указано, каждый акселерометр страдает от эффекта гравитации. При этом независимо от того с какой точностью откалиброван акселерометр, он все равно будет страдать от этого эффекта. Далее дано более подробное объяснение этого эффекта.

Концептуально, датчик ускорения определяет ускорение устройства, которое зависит от приложенной силы и которое можно рассчитать по следующей формуле:

Ad = - ∑Fs / mass.

Вместе с этим сила гравитации всегда будет влиять на измеряемое ускорение в соответствии со следующим выражением:

Ad = -g - ∑F / mass.

По этой причине когда устройство лежит на столе (то есть не движется с ускорением), акселерометр считывает величину гравитационного ускорения g = 9.81 m/s2. А когда устройство находится в состоянии свободного падения с ускорением по отношению к земле 9.81 m/s2, то акселерометр считывает величину ускорения g = 0 m/s2. Следовательно, для получения точного значения ускорения вклад силы тяжести необходимо вычесть из получаемых акселерометром данных. Это можно сделать с помощью фильтра верхних частот. Наоборот, фильтр нижних частот может быть использован для изоляции эффекта силы тяжести.

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

Программирование Arduino

Полный текст программы для Arduino представлен в конце статьи. Здесь рассмотрим только основные моменты.

Инициализируем объем выборки (Samplesize).

#define Samplesize 13 // filterSample number

Увеличьте объем выборки (Samplesize) если ваш акселерометр по прежнему показывает случайные значения.

Для последовательного порта будем использовать скорость 9600 бод/с. Для увеличения скорости взаимодействия можно увеличить эту скорость, но помните о том, что эти изменения необходимо внести и в программу для Arduino, и для Processing.

void setup(){
Serial.begin(9600);
}

Используемый нами акселерометр показывает значение максимальное значение 193 при ускорении влево и максимальное значение 280 при сдвиге, на вашем акселерометре измерьте эти значения и внесите соответствующие изменения в программу.

toSend = map (smoothData1, 193, 280, 0, 255);

Эти значения упаковываются в отдельный байт данных для их последовательной передачи.

Программирование Processing

Внешний вид необходимой нам программы в Processing

Processing представляет собой программное обеспечение с открытым исходным кодом, удобное для реализации разнообразных проектов. В нем удобно реализовывать проекты похожие на те, которые можно создать с помощью Android Development IDE.

Код Processing для нашего проекта можно скачать по следующей ссылке:

Processing Code for Arduino Ping Ball Game.

Щелкните на этой ссылке правой кнопкой мыши и выберите пункт "Сохранить как". Затем откройте файл в программе Processing и нажмите там Run чтобы запустить процесс игры. Скачанная вами по ссылке программа будет иметь расширение *.pde. Чтобы открывать такие файлы вам необходимо установить программу Processing.

В программе для Arduino в функции void setup() не забудьте не забудьте включить следующий код чтобы указать по какому порту вы будете передавать данные:

port = new Serial(this,Serial.list()[4],9600); //Reads the 4th PORT at 9600 baudrate

Здесь мы указали 4-й порт Arduino, но вы можете указать и другой порт если Arduino у вас подсоединено к другому COM-порту.

Исходный код программы

Теперь, когда наши программы в Processing и Arduino готовы, загрузите программу в плату Arduino и подсоедините ее к компьютеру по USB-кабелю. Запустите на исполнение .pde файл с помощью Processing. Далее берите в руки в акселерометр и начинайте играть в Ping Pong. Более подробно все эти процессы показаны в видео в конце статьи.

Если вы разберетесь с этим проектом то вы на его основе сможете создать много других интересных игр. Здесь мы использовали только X-ось, но вы можете в других проектах задействовать оси Y и Z.

Далее представлен полный текст программы.

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
1 053 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *