Система подсчета количества подтягиваний на турнике

Сколько раз вы можете подтянуться? Насколько ваши руки сильны и выносливы? Ответить можно, если подсчитать, сколько раз вы можете подтянуться, и в это вам поможет наш прибор! Он точно определит, сколько раз вы подтянулись!

О проекте за 40 секунд

История проекта

Прообраз проекта был найден на сайте hackster.io: https://www.hackster.io/Nikolas550/smart-pull-up-bar-757617.

В проект были внесены следующие модификации:

  1. Вместо лазерного датчика используется ультразвуковой эхолот HC SR04.
  2. Вместо системы выдачи конфет был подключен дисплей с выводом количества засчитанных подтягиваний (имеют место быть соответствующие изменения кода).
  3. Корпус редуцировался до простой коробочки с датчиком и табло.
  4. Также динамик теперь просто издаёт сигнал, а не играет музыку.

Описание проекта

Эхолот, находящийся на той же линии, где у человека в верхнем положении подтягивания голова/шея/плечи, замеряет расстояние до ближайшего объекта. Турник пуст/человек висит – расстояние бесконечно большое. Если человек подтянулся – расстояние становится меньше некоторой величины, определяемой из ширины тела подтягивающегося и длины турника (расчётное значение этой величины – ¾ от длины турника), этот процесс отслеживается в контроллере Arduino Mega 2560. Как только тело опустится, расстояние снова увеличится, и именно такой процесс (уменьшение расстояния (поднятие) – увеличение измеряемого расстояния (опускание)) вызовет увеличение счётчика количества подтягиваний на единицу и короткий сигнал динамика. На продолжительный вис прибор не будет видимым образом реагировать, ведь полный заход – это подняться-опуститься.

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

Основа проекта – платформа Arduino. В проекте принимают участие следующие элементы:

  • главная плата – Arduino Mega 2560
  • датчик расстояния HC SR04
  • пассивный зуммер, дисплей LCD1602.
  • Структура проекта
    По своей структуре проект достаточно прост и напоминает мозг с подключенными к нему периферийными органами восприятия. Ядро (мозг) – плата Arduino Mega 2560, к ней подключены динамик, эхолот, дисплей (периферийные органы), также есть возможность подключиться к компьютеру (установить контакт).
  • Взаимодействие между элементами
    Если представлять счётчик как отдельное устройство, то его основное устройство ввода – эхолот, устройства вывода – дисплей и динамик. Эхолот имеет вход (обозначается “Trig”) и выход (обозначается “Echo”). На вход периодически поступает импульс длиной 10 миллисекунд. Излучатель посылает 8 коротких импульсов частотой 40000 Гц. Они отражаются от препятствия и за какое-то время приходят к приёмнику на плате излучателя. Эхолот отдаёт на своём выходе импульс, длительность которого зависит от этого времени. Импульс принимается контроллером Arduino. Несколько операций в коде этого контроллера преобразуют импульс в значение расстояния.
    Эта операция повторяется циклически. Так можно проследить изменение измеряемого расстояния со временем. В функции loop() после измерения расстояния идёт сравнение (первый if) полученного значения с опорным. Можно бы сделать в первом if , в котором сравнивается расстояние, сигнал и увеличение счётчика, но тогда во время долгого удержания наверху алгоритм может срабатывать несколько лишних раз. Проблему можно решить подстройкой задержки прохода по loop(), но мы получаем зависимость от времени. Лучше в первом if присваивать переменной hold значение 1 и второй if сделать с таким условием, которое равно 1 при hold=1 и измеренном расстоянии большем опорного; в теле второго if обнуление hold, инкремент переменной счётчика и функция включения динамика. 1 во втором if означает, что тело только что было поднято (hold=1), но сейчас опущено (замеренное только что расстояние больше опорного), то есть, произошло полное подтягивание. Если тело держится наверху, то условие второго if=0, т.к. измеряемое расстояние меньше опорного; если на турнике висят или там никого нет, то hold=0 и тело второго if также не проходится.
  • Подключение
    Сигнальный вход динамика подключается через двадцать второй цифровой разъём. Вход на эхолот – цифровой разъём № 52, выход с эхолота – разъём №53. Дисплей подключается, соответственно, по шинам SDA и SCL. Дисплей и эхолот запитываются от 5 вольт, динамик-от 3.3 вольт.
Схема подключения элементов
  • Конструирование и расположение элементов корпуса
    Для устройства был изготовлен простой корпус из жёсткой бумаги. Длина – 10 см, ширина – 7 см, высота – 7 см. На листе А4 был размечен “плюс”, верх и низ-соответственно верх и низ корпуса, центр-перед, левая и правая “ветки” плюса-боковые стороны, на каждом краю боковой стороны – ”крылья”, служащие креплением боковых сторон с передом и низом. Но! Задняя стенка в реальной модели отсутствует, в отличие от схемы ниже. Корпус скреплялся степлером.
Общий план развёрнутой в плоскости заготовки корпуса
Расположение элементов на корпусе
Расположение элементов на корпусе
  1. вход microUSB
  2. разъём питания 5V
  3. дисплей
  4. ультразвуковой датчик расстояния
  5. динамик.
  • Этапы реализации
    Прежде всего был подключен и протестирован динамик. Затем был подключен и протестирован эхолот, был налажен вывод расстояния в окне программы. Затем была написана функция, дающая сигнал на динамик при значении расстояния, меньшем определённого. Последними шагами были подключение дисплея и коррекция основного алгоритма подсчета подтягиваний.
  • Код
[code]
#include <LiquidCrystal_PCF8574.h>
#include <Wire.h>
long x;// Промежуточная переменная
long cm;// Расстояние до ближайшего объекта
int n=0;// Количество подтягиваний
int hold=0;// Наличие состояния верхнего положения
int dist=80;// Расстояние, определяемое эхолотом при верхнем положении тела
LiquidCrystal_PCF8574 lcd(0x27); //Адресация дисплея
void setup() {
// put your setup code here, to run once:
Serial.begin (9600);
pinMode(52, OUTPUT);
pinMode(53, INPUT);//Установка входа-выхода для сигнальных контактов эхолота
lcd.begin(16, 2); // Инициализация дисплея
lcd.setBacklight(10); // Подключение подсветки
lcd.clear(); // Установка курсора в начало первой строки
lcd.print("Quantity:"); // Набор текста на первой строке
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(52, LOW);
delay(5);// Предварительная задержка
digitalWrite(52, HIGH);
delay(10);
digitalWrite(52, LOW);// Излучение ультразвукового импульса
x=pulseIn(53, HIGH);
cm=x/58.2;// Вычисление расстояния
if(cm<dist)
{
hold=1;
}
// Проверка на состояние подъёма
if((cm>=dist)&&(hold==1))
{
hold=0;
tone(22,1000,100);
n+=1;
}
// Проверка на последующее состояние виса
Serial.println(cm);
lcd.setCursor(9,0);
lcd.print(n);
// Вывод данных
delay(250);// Задержка между измерениями
}
  • Краткое пояснение к работе кода
    • lcd.print(“Quantity:”); // вывод подписи к результату. Делается единственный раз, далее пойдут операции из повторяющегося алгоритма.
    • digitalWrite(5, HIGH);
      delay(10);
      digitalWrite(5, LOW);
      // генерирование импульса длиной 10 миллисекунд на входе эхолота. Последний при этом импульсе посылает 8 коротких импульсов частотой 40000 Гц.
    • x=pulseIn(6, HIGH);
      cm=x/58.2;
      // приём импульса с выхода датчика и вычисление расстояния до ближайшего объекта.
    • if(cm=dist)&&(hold==1))
      {
      hold=0;
      tone(2,1000,100);#
      n+=1;
      }
      // важный блок. Он проверяет, совершено ли полное подтягивание. Оно означает, что сначала расстояние стало меньше опорной величины (верхнее положение cm<dist), затем опускание и простой провис ((cm=dist)&&(hold==1), hold=1, если до этого было верхнее положение, иначе-не было ничего). При опускании переменная счётчика увеличивается и выводится сигнал на динамик.
    • Serial.println(cm); // отладочный вывод расстояния до ближайшего.
    • lcd.print(n); // вывод значения переменной-счётчика на дисплей.
  • Примечание к результату
    Так как ультразвуковой датчик держится на коротких проводах и, как следствие, очень близок к корпусу, приходится на рабочую высоту помещать корпус, из-за чего может быть неудобным считывание результата(вывода).

Ссылки

  1. Исток проекта:
    https://www.hackster.io/Nikolas550/smart-pull-up-bar-757617
  2. Подключение динамика: https://arduinomaster.ru/uroki-arduino/pishhalka-pezodinamik-arduino
  3. Подключение эхолота:
    https://arduinomaster.ru/datchiki-arduino/ultrazvukovoj-dalnomer-hc-sr04
  4. Подключение дисплея:
    https://arduinomaster.ru/datchiki-arduino/lcd-i2c-arduino-displey-ekran
  5. Вывод в консоль (для отладки):
    https://autohome.org.ua/arduino-lessons/58-arduino-lesson-1-hello-world

Команда проекта

Проект разрабатывал Яцкевич Д. И, студент СПб ГУАП первого курса группы 1043. Реализовывал проект, составил отчёт, фото-видео материалы. Ассистировал преподаватель Седов Б.Н.

Благодарности

Автор приносит благодарность преподавателю Седову Б.Н. за курирование проекта, предоставление ресурсов и помощи в определении способа реализации.

Next Article