Как сделать шагомер и калькулятор расстояний на базе Arduino

Очень распространенной функцией фитнес-приложений для Android и iOS является вычисление количества шагов, которые пользователь ходит, и расстояния, которое он преодолевает.

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

В этом проекте мы разработали аналогичный калькулятор шагов ходьбы на платформе Arduino. Здесь используется метод отслеживания вектора ускорения устройства. Для этого акселерометр ADXL345 сопряжен с Arduino. Количество шагов, пройденных пользователем, и пройденное им расстояние отображаются на OLED-экране.

Автор проекта - Nikhil Agnihotri, Engineersgarage.com

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

Необходимые компоненты:

Arduino UNO x1;

Датчик акселерометра ADXL345 x1;

SSD1306 OLED-дисплей x1;

Соединительные провода и перемычки.

Схема подключения

Для разработки этого проекта датчик акселерометра ADXL345 и SSD1306 OLED сопрягаются с Arduino. Для этого подключите его контакты GND и VCC к заземлению Arduino и выходным контактам 3,3 В. Затем подключите контакты SDA и SCL датчика акселерометра к контактам SDA и SCL порта I2C на Arduino. В этом проекте 7-контактный OLED-модуль SSD1306 подключен к Arduino UNO.

Принципиальная схема шагомера на базе Arduino

Скетч для Arduino:

Скетч в файле TXT

Как это работает

Когда устройство включено, OLED-дисплей SSD1306 инициализируется, и на экране мигают логотип «EEWORLDONLINE» и название устройства «Steps Counter». Первоначальное количество шагов отображается как 0, а пройденное расстояние также отображается как 0.

Теперь все, что нужно сделать пользователю, - это держать устройство при себе. Устройство постоянно отслеживает свой вектор ускорения с помощью датчика акселерометра ADXL345.

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

Средние значения ускорения рассчитываются при включении устройства и на экране мигают начальные сообщения. Средние значения также вычисляются путем взятия среднего из 50 последовательных показаний акселерометра ADXL345. Эти средние значения ускорения устройства по осям x, y и z служат контрольной точкой.

После завершения первоначальной настройки устройство снова вычисляет ускорение по осям x, y и z 50 раз подряд и вычисляет среднее из этих значений. Вектор ускорения устройства вычисляется путем извлечения квадратного корня из разницы текущих значений ускорения по сравнению с контрольными значениями.

После задержки в 250 миллисекунд устройство снова вычисляет ускорение по осям x, y и z 50 раз подряд и вычисляет среднее из этих значений. Вектор ускорения устройства вычисляется еще раз с интервалом 250 мс путем извлечения квадратного корня из разницы текущих значений ускорения по сравнению с эталонными значениями.

Вычисляется разница между вектором ускорения сейчас и вектором ускорения за 250 мс до этого, и если разница больше 0,05, шаг увеличивается.

Значение пройденного расстояния рассчитывается путем умножения количества шагов на один фут или 0,3048 метра, предполагая, что средняя длина шага составляет один фут.

Количество шагов и пройденное расстояние обновляются на OLED-экране с задержкой 400 мс.

Процесс вычисления разницы между двумя последовательными векторами ускорения устройства с интервалом 250 мс продолжается на всем протяжении для отслеживания движения пользователя.

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

Вы должны отметить, что кнопка сброса Arduino действует как кнопка сброса для устройства и сбрасывает количество шагов и пройденное расстояние до нуля.





Код

Код начинается с импорта wire.h для связи I2C с датчиком акселерометра ADXL345 и SPI.h для связи с OLED-дисплеем SSD1306.

Библиотеки Adafruit для работы с OLED-дисплеями импортируются, а также константы, необходимые для OLED-интерфейса, и определенные параметры. Для класса SSD1306 инициализируется отображение объекта.

Растровое изображение для логотипа EEWORLDONLINE хранится в PROGMEM Arduino и преобразуется в объект массива. Объявляются переменные для хранения средних, текущих и ближайших значений ускорения. Объявлена переменная для хранения количества шагов.

В функции setup () вызываются три разные функции. Ssd1306_init () вызывается для инициализации OLED-дисплея SSD1306 и передачи на него начальных сообщений. Adxl345_init () вызывается для инициализации датчика ускорения.

Функция read_av_acc () вызывается для вычисления опорных значений ускорения, когда устройство находится в состоянии покоя. В функции loop () вектор ускорения вычисляется дважды с интервалом 250 мс, и если разница между двумя значениями больше 0,05, увеличивается один шаг. Количество шагов и пройденное расстояние обновляются на OLED-дисплее.

Результат:

Демонстрационное видео:




Источник: http://electrik.info