Система подсчета количества подтягиваний на турнике
Сколько раз вы можете подтянуться? Насколько ваши руки сильны и выносливы? Ответить можно, если подсчитать, сколько раз вы можете подтянуться, и в это вам поможет наш прибор! Он точно определит, сколько раз вы подтянулись!
История проекта
Прообраз проекта был найден на сайте hackster.io: https://www.hackster.io/Nikolas550/smart-pull-up-bar-757617.
В проект были внесены следующие модификации:
- Вместо лазерного датчика используется ультразвуковой эхолот HC SR04.
- Вместо системы выдачи конфет был подключен дисплей с выводом количества засчитанных подтягиваний (имеют место быть соответствующие изменения кода).
- Корпус редуцировался до простой коробочки с датчиком и табло.
- Также динамик теперь просто издаёт сигнал, а не играет музыку.
Описание проекта
Эхолот, находящийся на той же линии, где у человека в верхнем положении подтягивания голова/шея/плечи, замеряет расстояние до ближайшего объекта. Турник пуст/человек висит – расстояние бесконечно большое. Если человек подтянулся – расстояние становится меньше некоторой величины, определяемой из ширины тела подтягивающегося и длины турника (расчётное значение этой величины – ¾ от длины турника), этот процесс отслеживается в контроллере 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 был размечен “плюс”, верх и низ-соответственно верх и низ корпуса, центр-перед, левая и правая “ветки” плюса-боковые стороны, на каждом краю боковой стороны – ”крылья”, служащие креплением боковых сторон с передом и низом. Но! Задняя стенка в реальной модели отсутствует, в отличие от схемы ниже. Корпус скреплялся степлером.



- вход microUSB
- разъём питания 5V
- дисплей
- ультразвуковой датчик расстояния
- динамик.
- Этапы реализации
Прежде всего был подключен и протестирован динамик. Затем был подключен и протестирован эхолот, был налажен вывод расстояния в окне программы. Затем была написана функция, дающая сигнал на динамик при значении расстояния, меньшем определённого. Последними шагами были подключение дисплея и коррекция основного алгоритма подсчета подтягиваний.
- Код
[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); // вывод значения переменной-счётчика на дисплей.
- Примечание к результату
Так как ультразвуковой датчик держится на коротких проводах и, как следствие, очень близок к корпусу, приходится на рабочую высоту помещать корпус, из-за чего может быть неудобным считывание результата(вывода).
Ссылки
- Исток проекта:
https://www.hackster.io/Nikolas550/smart-pull-up-bar-757617 - Подключение динамика: https://arduinomaster.ru/uroki-arduino/pishhalka-pezodinamik-arduino
- Подключение эхолота:
https://arduinomaster.ru/datchiki-arduino/ultrazvukovoj-dalnomer-hc-sr04 - Подключение дисплея:
https://arduinomaster.ru/datchiki-arduino/lcd-i2c-arduino-displey-ekran - Вывод в консоль (для отладки):
https://autohome.org.ua/arduino-lessons/58-arduino-lesson-1-hello-world
Команда проекта
Проект разрабатывал Яцкевич Д. И, студент СПб ГУАП первого курса группы 1043. Реализовывал проект, составил отчёт, фото-видео материалы. Ассистировал преподаватель Седов Б.Н.
Благодарности
Автор приносит благодарность преподавателю Седову Б.Н. за курирование проекта, предоставление ресурсов и помощи в определении способа реализации.