Фитнес-браслеты становятся очень популярными в наши дни, они не только подсчитывают шаги, но и отслеживают количество сожженных калорий, отображают частоту сердечных сокращений, показывают время и многое другое. И эти устройства Интернета вещей (IoT) синхронизируются с облаком, так что вы можете легко получить всю историю вашей физической активности на смартфоне.

Шагомеры – это устройства, которые реализуют часть функционала фитнес-гаджетов и используются только для подсчета шагов. Итак, в этом уроке мы собираемся создать простой и дешевый шагомер, используя Arduino и акселерометр. Этот шагомер будет подсчитывать количество шагов и отображать их на ЖК-модуле 16x2.
В качестве акселерометра был взят ADXL335. ADXL335 – это трехосевой аналоговый акселерометр, работающий по принципу емкостного измерения. Это небольшой, тонкий, маломощный модуль с поликремниевым поверхностно-микрообработанным датчиком и схемой формирования сигналов. Акселерометр ADXL335 может измерять как статическое, так и динамическое ускорение. Здесь, в этом проекте шагомера на основе Arduino, акселерометр ADXL335 будет действовать как датчик шагомера.
Акселерометр – это устройство, которое может преобразовывать ускорение в любом направлении в соответствующее переменное напряжение. Это достигается за счет использования конденсаторов, так как при движении конденсатор, находящийся внутри акселерометра, также претерпит изменения емкости в зависимости от движения, и поскольку емкость изменяется, можно также получить переменное напряжение.

Ниже приведены изображения модуля акселерометра с передней и задней стороны.

Его распиновка:
- Vcc - 5 вольт должен подключаться к этому контакту.
- X-OUT - этот вывод дает аналоговый выход в направлении х
- Y-OUT - этот вывод дает аналоговый выход в направлении y
- Z-OUT - этот вывод дает аналоговый выход в направлении z
- GND - Земля
- ST - Этот контакт используется для настройки чувствительности датчика
Принципиальная схема счетчика шагов на основе Arduino акселерометра и Arduino приведена далее.

В этой схеме мы связываем Arduino Nano с акселерометром ADXL335. Контакты X, Y и Z акселерометра соединены с аналоговыми контактами (A1, A2 и A3) Arduino Nano. Для взаимодействия ЖК-модулей 16x2 с Arduino мы используем модуль I2C. Контакты SCL и SDA модуля I2C подключены к контактам A5 и A4 Arduino Nano соответственно.
Для быстрого прототипирования можно собрать схему на макетной плате.

И после успешного тестирования можно запаять компоненты на печатную плату.


Но как же работает такой шагомер? Шагомер вычисляет общее количество шагов, предпринятых человеком, используя три составляющих движения: прямое, вертикальное и боковое. Система шагомера использует акселерометр для получения этих значений. Акселерометр постоянно обновляет максимальные и минимальные значения 3-осевого ускорения после каждого определенного набора выборок. Среднее значение этих 3-х осевых значений (макс. + мин.)/2 называется динамическим пороговым уровнем, и это пороговое значение используется для определения того, предпринят ли шаг или нет. Во время работы шагомер может быть в любой ориентации, поэтому шагомер рассчитывает шаги, используя ось, изменение ускорения которой является наибольшим.
Теперь рассмотрим более подробно принцип работы данного шагомера. Сначала шагомер начинает калибровку, как только он включается. Затем в функции void loop он непрерывно получает данные с осей X, Y и Z. После этого он рассчитывает суммарный вектор ускорения от начальной точки. Вектор ускорения - это квадратный корень значений осей X, Y и Z, т.е. (x ^ 2 + y ^ 2 + z ^ 2). Затем он сравнивает средние значения ускорения с пороговыми значениями для подсчета количества шагов. Если вектор ускорения пересекает пороговое значение, то он увеличивает количество шагов; в противном случае он отбрасывает недопустимые вибрации.

Полный код шагомера на основе Arduino приведен далее.
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int xpin = A1;
const int ypin = A2;
const int zpin = A3;
byte p[8] = {
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F
};
float threshold = 6;
float xval[100] = {0};
float yval[100] = {0};
float zval[100] = {0};
float xavg, yavg, zavg;
int steps, flag = 0;
void setup()
{
Serial.begin(9600);
lcd.begin();
lcd.backlight();
lcd.clear();
calibrate();
}
void loop()
{
for (int w = 0; w < 16; w++) {
lcd.write(byte(0));
delay(500);
}
int acc = 0;
float totvect[100] = {0};
float totave[100] = {0};
float xaccl[100] = {0};
float yaccl[100] = {0};
float zaccl[100] = {0};
for (int a = 0; a < 100; a++)
{
xaccl[a] = float(analogRead(xpin) - 345);
delay(1);
yaccl[a] = float(analogRead(ypin) - 346);
delay(1);
zaccl[a] = float(analogRead(zpin) - 416);
delay(1);
totvect[a] = sqrt(((xaccl[a] - xavg) * (xaccl[a] - xavg)) + ((yaccl[a] - yavg) * (yaccl[a] - yavg)) + ((zval[a] - zavg) * (zval[a] - zavg)));
totave[a] = (totvect[a] + totvect[a - 1]) / 2 ;
Serial.println("totave[a]");
Serial.println(totave[a]);
delay(100);
if (totave[a] > threshold && flag == 0)
{
steps = steps + 1;
flag = 1;
}
else if (totave[a] > threshold && flag == 1)
{
}
if (totave[a] < threshold && flag == 1)
{
flag = 0;
}
if (steps < 0) {
steps = 0;
}
Serial.println('\n');
Serial.print("steps: ");
Serial.println(steps);
lcd.print("Steps: ");
lcd.print(steps);
delay(1000);
lcd.clear();
}
delay(1000);
}
void calibrate()
{
float sum = 0;
float sum1 = 0;
float sum2 = 0;
for (int i = 0; i < 100; i++) {
xval[i] = float(analogRead(xpin) - 345);
sum = xval[i] + sum;
}
delay(100);
xavg = sum / 100.0;
Serial.println(xavg);
for (int j = 0; j < 100; j++)
{
yval[j] = float(analogRead(ypin) - 346);
sum1 = yval[j] + sum1;
}
yavg = sum1 / 100.0;
Serial.println(yavg);
delay(100);
for (int q = 0; q < 100; q++)
{
zval[q] = float(analogRead(zpin) - 416);
sum2 = zval[q] + sum2;
}
zavg = sum2 / 100.0;
delay(100);
Serial.println(zavg);
}
Когда ваше оборудование и код будут готовы, подключите Arduino к ноутбуку и загрузите код. Теперь возьмите шагомер в свои руки и начните делать шаг за шагом, на ЖК-дисплее должно отображаться количество шагов. Иногда количество шагов увеличивается, когда шагомер вибрирует очень быстро или очень медленно.

© digitrode.ru