При помощи акселерометра android
В этом уроке мы научимся работать в Android приложении с акселерометром, одной из многих фишек на современном смартфоне. Мы разберем, что же такое акселерометр и как его можно использовать при программировании приложений.
Взаимодействие с приложением на смартфоне не только через кнопки, но и с помощью жестов, поворотов дает как новые возможности и пользователи, и программисту, так и делает работу со смартфоном более «живой», интересной и необычной.
В этом уроке мы будем работать с такими жестами — пользователь будет встряхивать устройство и на экране будет появляться 6 лотерейных номеров в сопровождении симпатичной анимации.
Начинаем работать. Создаем новый проект, названия либо оставьте по умолчанию, либо введите свои, но потом будете разбираться в них сами:). Наше будущее приложение будет поддерживать только портретную ориентацию. Поэтому сразу идем в файл манифеста приложения AndroidManifest.xml и настроим проекту только портретный вид:
В основном классе программы MainActivity.java нужно выполнить SensorEventListener интерфейс. Для этого, добавляем к строке объявления класса следующее:
Для успешного использования SensorEventListener нужно добавить к строкам импорта следующее:
При объявлении выполнения интерфейса SensorEventListener программа заругалась на нас ошибками. Ничего страшного, просто для реализации этого интерфейса необходимы два особых метода, с которыми мы сейчас разберемся. Ниже метода onCreate добавим следующие методы:
Взглянем на метод onSensorChanged. Этот метод используется для обнаружения жестов. Он вызывается всякий раз, когда в акселерометре устройства происходят какие то перемены. Он вызывается многократно, всякий раз, когда устройство приходит в движение. Для того, чтобы использовать классы Sensor и SensorEvent, необходимо добавить еще пару строк в импорт:
Перед тем, как использовать метод onSensorChanged, нам нужно задекларировать использование следующих переменных:
Если после этого у вас появились ошибки, проверьте, есть ли среди импорта это:
В методе onCreate мы инициализируем наши переменные и создаем слушателя событий:
Для инициализации SensorManager мы вызываем getSystemService, таким образом мы получаем доступ к акселерометру. Метод getSystemService вызывается для получения ссылки на необходимый нам сервис. Отсылка к акселерометру происходит благодаря команде getDefaultSensor. Далее, для регистрации сенсора, мы используем метод registerListener:
Теперь нам нужно описать еще два метода: onPause и onResume. Это будет использоваться для того, чтобы отключать работу с акселерометром, когда мы не работаем в приложении, и опять включать при продолжении работы, что будет способствовать быстродействия аппарата и уровню потребления батареи. Эти методы будут выглядеть примерно так:
Теперь нужно научить наше приложение распознавать жесты. Большинство работ по реализации этого будет происходить внутри метода onSensorChanged. Для начала задекларируем в классе MainActivity.java такие переменные:
Теперь перейдем в работе в методе onSensorChanged. Мы получаем ссылку на акселерометр и проверяем, не ошиблись ли мы с выбором адаптера (акселерометра):
Далее нужно определить положение устройства в трехмерном пространстве по x,y, и z осям. Чтобы лучше понять о чем речь, изучаем следующую картинку:
Для того, чтобы получить эти необходимые нам координаты, мы делаем так:
Сенсоры большинства смартфонов невероятно чувствительны. Неважно, насколько твердо ваша рука держит смартфон, сенсор все равно будет постоянно видеть изменение положения аппарата. Поэтому для мониторинга положения устройства метод onSensorChanged вызывается очень часто, по несколько раз в секунду. Правда нам не нужно так много информации для нашего приложения, поэтому мы сделаем так, что этот методу будет вызываться не чаще, чем раз в 100 миллисекунд:
Теперь усовершенствуем программу до состояния, когда она сможет подсчитывать скорость движения устройства, Для этого мы декларируем особенную переменную SHAKE_THRESHOLD, которая будет показывать, зарегистрировано ли движение устройства или нет. Изменение значения переменной SHAKE_THRESHOLD увеличивает или уменьшает чувствительность сенсора, поэтому здесь можете пофантазировать на свое усмотрение:
И так, у нас уже есть приложение, с помощью акселерометра способное определять жесты и движение. Теперь мы сделаем так, что при встряхивании устройством будет выбираться 6 случайных чисел, но об этом чуть позже. Сейчас нам нужно отредактировать файл activity_main.xml. В уроке в качестве фона используется изображение синего шара, вы можете выбрать на фон, что вам угодно:
Каждый FrameLayout содержит элемент TextView, в котором будет отображаться случайно сгенерированное число от 1 до 49. Удостоверьтесь, что все FrameLayout и TextView имеют свой id, чтобы можно было к ним потом обращаться.
Теперь давайте еще разок вернемся в класс MainActivity.java и добавим туда метод выбора случайного числа от 1 до 49:
Мы создаем объект ArrayList для хранения выбранных 6 чисел и в цикле for с помощью стандартного java класса Random выбираем случайные числа. Также выполняется проверка уже добавленных в ArrayList чисел, чтобы избежать повторов. Чтобы все заработало исправно, добавим еще пару строчек к импорту:
Последним шагом будет отображение выбранных 6 случайных чисел в пользовательском интерфейсе. Получаем ссылки на элементы TextView, созданные ранее, и привязываем к ним числа, а также добавим анимацию нашим FrameLayout:
Добавим к строкам импорта еще такие:
Для настройки анимации нужно создать соответствующий файл, в котором мы ее зададим. Создайте в файлах проекта папку anim и в ней файл move_down_ball_first.xml и добавьте туда следующий код:
Все, что осталось сделать, это вызвать метод getRandomNumber в методе onSensorChanged класса MainActivity.java:
Все, наше приложение, работающее на акселерометре устройства готово! Запускаем на смартфоне программу, трясем как следует аппарат и видим примерно это:
Надеюсь, вам этот урок оказался полезен, удачи!
Источник
Android: измерение скорости и расстояния с помощью акселерометра
С тех пор, как у меня появился гуглофон, периодически бродят в голове мысли «а что бы такого забавного сделать с этим самым телефоном?» Поиграв в игрушки с управлением акселерометром, подумал — а что еще можно с помощью этого датчика сотворить? Конечно же, измерить ускорение! И, как следствие, вычислить скорость и пройденный путь. Разумеется, использование лишь акселерометра накладывает ряд ограничений на измеряемое: во-первых, движение должно быть прямолинейное, во-вторых — ориентация аппарата в пространстве не должна меняться, в третьих — желательно откалибровать датчик перед стартом измерения. Сразу скажу — есть способы смягчить эти требования, но об этом потом.
Главный вопрос, как обычно, «зачем?». Зачем это, если есть GPS? Что ж, верное замечание. Однако, GPS работает не везде, а акселерометр — он с собой в телефоне. Например, пробовали поймать спутники в метро.
С «Зачем» разобрались, переходим к «Как».
Для того, чтобы реагировать на изменение ускорения, необходимо реализовать где-нибудь интерфейс SensorEventListener. Так как мы еще не придумали, что с ним делать, создадим абстрактный класс
И, заодно, класс для хранения показания счетчика датчика:
И подумаем, что же делать дальше. Период обновления информации с сенсора в режиме SENSOR_DELAY_GAME — примерно 20 миллисекунд. Это достаточно часто, наша задача такого не требует. С другой стороны, снимая показания реже, мы рискуем попасть на «выбросы», и потерять точность. Логично каким-то образом регулярно получать усредненное значение ускорения, скажем, за последнюю секунду. Хранить массив и вычислять среднее значение — накладно, гораздо проще складывать все получаемые значения и делить на количество. Также, предусмотрим dX, dY, dZ — нашу еще не реализованную калибровку.
Вот что получится:
С Вашего позволения, я пропущу описания методов калибровки датчика. Достаточно сказать, что необходимо в течении некоторого времени снимать покания, затем установить у нашего XYZAccelerometer соответствующие dX, dY, dZ. Пренебрегать этой процедурой нельзя, т.к. пока мы спим постоянно действует ускорение свободного падения, и датчик его измеряет.
Для пущей важности, обзаведемся классом для хранения и вычисления параметров движения на интервале:
И классом для хранения информации обо всем эксперименте:
Думаю, тут все просто и понятно. Осталось только использовать это в нашей Activity… которой, кстати, еще нет. Начнем с layout:
Вот и все. Удивительно, но на ровной траектории такой метод дает весьма неплохую точность измерения.
Прилагаю график одного эксперимента: синяя линяя — скорость, расчитанная акселерометром, красная — снимаемая с GPS с максимальной частотой. Черная клякса — скорость по спидометру в конце эксперимента.
Источник
Акселерометр в телефоне – что это такое
Современные смартфоны – это достижение инженерной мысли, напичканное миниатюрными датчиками, микросхемами, сенсорами, один из которых отвечает за пространственно-скоростные изменения объекта или его ускорение. Акселерометр: что это такое в телефоне, как работает и зачем нужен, разбираемся в деталях.
Что такое акселерометр и как он устроен
Акселерометр – это электромеханическое устройство, используемое для измерения сил ускорения. Такие силы могут быть статическими, например непрерывная сила тяжести, или, как в случае со многими мобильными устройствами, динамическими – для определения движения или вибрации.
Из всех компонентов смартфона акселерометр, вероятно, является самым технологически захватывающим, но также недооцененным гаджетом на устройстве. Если вы хотите, чтобы изображение на смартфоне отображалось в альбомной или портретной ориентации, все, что нужно сделать, – это повернуть устройство. Вы когда-нибудь задумывались, как гаджет распознает, что его наклонили именно в этом направлении? Как раз акселерометр в телефоне и отвечает за то, чтобы правильно реагировать на поворот корпуса.
Акселерометры состоят из трех основных компонентов:
- корпуса: движется вместе с устройством, в котором он установлен. Он является основанием датчика и движется с той же скоростью, что и устройство;
- подвижной части: смещается при движении корпуса относительно основания акселерометра. Степень смещения зависит от того, насколько наклонено устройство;
- сенсоров: отслеживают, насколько сместилась подвижная часть, и передают информацию программному обеспечению.
В смартфонах акселерометры крепятся на плату и представляют собой миниатюрный черный квадрат с инертной массой, величина смещения которой фиксируется датчиками.
Типы акселерометров
В смартфонах, как правило, используют два типа акселерометров: пьезоэлектрические или емкостные. Оба эти слова звучат очень сложно, но на практике они довольно просты.
Принцип работы емкостных акселерометров разберем на примере. Вам знакомы игрушки-лабиринты с шариками? Представьте себе один из них в виде пустого квадрата без перегородок. Когда вы его наклоняете, мяч перекатывается и ударяется об одну из сторон, в результате чего срабатывает датчик. Конечно, в смартфонах нет маленьких головоломок-лабиринтов, но есть нечто похожее. Вместо мяча в них используется сетка или грузик, закрепленный на опорах. При движении смартфона сетка немного сдвигается и тянет за собой опору. При этом между частями сетки установлены маленькие «пальчики», которые чувствуют, где находится сетка, и фиксируют любое ее движение.
В зависимости от того, по каким осям перемещается подвижная часть акселерометра, различают одноосевые (вверх/вниз), двухосевые (вверх/вниз, вправо/влево) и трехосевые (вверх/вниз, вправо/влево, внутрь/наружу).
Пьезоэлектрический акселерометр – это прибор, фиксирующий пространственную ориентацию устройства, основываясь на пьезоэлектрическом эффекте.
Представьте, если бы вы стояли спиной к стене, держа матрас на расстоянии вытянутой руки с закрытыми глазами. Матраса не видно, но чувствуется, если он движется. Если толкать или тянуть матрас, это вызовет напряжение в руках. Вы почувствуете, либо как матрас отрывается, либо как приближается к вам.
Пьезоэлектрические акселерометры работают аналогично. Они используют механизм, который толкает и притягивает проводник, который, в свою очередь, излучает электричество в зависимости от приложенного напряжения. Именно степенью возникающего напряжения и измеряется движение устройства в системе координат.
Применение акселерометров в смартфонах
В эпоху диджитализации акселерометр в смартфоне – это must-have, без которого функциональность устройства будет неполноценной. Между прочим, компания Apple интегрировала его во все свои устройства iPhone, iPad и iPod еще с 4-го поколения.
Рассмотрим основные моменты, для чего же используется акселерометр в мобильных устройствах.
- Изменение ориентации мобильного приложения. Цифровые помощники, аудио-, видеоплееры управляют пользовательским интерфейсом мобильного приложения с помощью акселерометра. Он регулирует ориентацию контента, делая его удобным для пользователя.
- Поскольку акселерометр в смартфоне фиксирует движение, он используется как шагомер для подсчета шагов и скорости движения. Это позволяет детально анализировать, сколько сожжено калорий, сколько пройдено километров, с какой скоростью движется объект и т. д. Датчик широко используется в приложениях для здоровья и фитнеса, а также в спортивных.
- В некоторых устройствах акселерометр используют как датчик наклона, чтобы устранить дрожание камеры при съемке, управлять смартфоном жестами (например, перевернуть смартфон, чтобы отключить звук входящего звонка), играть в аркадные игры, контролируя скорость движения при помощи угла наклона устройства, и т. д.
- В навигационных приложениях – определяет положение объекта в пространстве, скорость его движения и даже топографию местности.
- В экстренных ситуациях (при падении гаджета) автоматически включает систему защиты. Например, некоторые смартфоны «прячут» выдвигающуюся селфи-камеру если распознают резкую потерю высоты.
Задумывались ли вы, что такое простое устройство, как акселерометр, – неотъемлемая часть навигационных приборов в авиации и космонавтике? Спидометры, видеорегистраторы, смарт-часы, промышленное оборудование, информационные технологии – все эти гаджеты и оборудование также работают с устройствами, в компоновке которых присутствуют акселерометры.
При необходимости датчик акселерометра можно отключить с помощью меню настроек. Это может понадобиться в том случае, когда функция поворота экрана не нужна или мешает выполнению определенных задач.
Интересно, что непосредственно за угол наклона устройства отвечает другой датчик – гироскоп. Он фиксирует данные о положении смартфона относительно земной поверхности. Как правило, гироскоп идет в паре с акселерометром и дополняет данные до шестиосевой системы координат.
Как откалибровать акселерометр
Что такое акселерометр в телефоне, мы разобрались, теперь остановимся на том, как откалибровать устройство для получения точных данных.
Если программным обеспечением смартфона не предусмотрена функция калибровки, то для этого понадобится скачать и установить любое подходящее приложения, доступное в маркете.
Как правило, процесс калибровки занимает несколько минут. Необходимо положить смартфон на ровную горизонтальную поверхность, запустить процесс, следовать инструкциям на экране и получить уведомление о завершении калибровки.
Как понять, что акселерометр нуждается в калибровке?
- Датчик работает неправильно: некорректно отображаются показатели скорости движения, траектории и пройденного расстояния.
- При изменении положения гаджета автоматический поворот экрана запаздывает.
- Сенсорное управление смартфоном подтормаживает, особенно в аркадных играх.
Очевидно, что такое устройство, как акселерометр в мобильном гаджете, – это не просто удобная функция, а полноценная система взаимосвязи между человеком и прибором: от шагомера до навигации, управления жестами и системы безопасности. Крохотный чип (меньше 10-копеечной монеты) мгновенно реагирует на изменения положения устройства в пространстве, улавливает толчки, встряхивания, повороты. И на каждое такое действие происходит ответная реакция, обусловленная программным обеспечением смартфона.
Источник