Squat Counter

Autor

Introducere

Proiectul curent constă în realizarea unui contor care să numere genuflexiunile unei persoane și să emită un semnal sonor după terminarea unei serii de 10 de repetări.

Scopul acestuia este destul de intuitiv și anume acela de a ajuta persoanele active din punct de vedere sportiv să țină mai ușor evidența numărului de repetări pe care le realizează la un exercițiu de bază, cum este cel prezentat mai sus.

Ideea a pornit de la o necesitate proprie, deoarece se întâmplă frecvent ca în timpul antrenamentelor de tip fitness în care am de realizat un număr mai mare de repetări, să uit câte genuflexiuni am făcut până la momentul respectiv sau să mă plictisesc numărându-le.

Utilitatea proiectului este aceea că poate ajuta o persoană să se concentreze mult mai bine pe execuția exercițiului în sine și nu pe contorizarea repetărilor. De asemenea, este bine cunoscut faptul că mulți dintre oamenii care fac sport, doresc să asculte muzica în paralel și să se detașeze total. Astfel, ei nu vor mai trebui să țină evidența periodicității exercițiului și vor fi avertizați prin semnalul sonor când se termină seria.

Descriere generală

Hardware Design

1. Listă de piese

  • Plăcuța de bază PM 2019
  • Componente de bază PM 2019 (ATmega324)
  • Breadboard
  • Modul ecran Nokia 5110
  • Modul giroscop + accelerometru MPU 6050
  • Modul cu Buzzer activ
  • Fire de legătură

2. Tabel de prețuri

Piesă Distribuitor Cantitate Preț
Plăcuța de bază PM 2019 ACS 1 buc 10 RON
Componente de bază PM 2019 Seria CA 1 buc 53 RON
Modul ecran Nokia 5110 Ardushop 1 buc 15,47 RON
Modul giroscop + accelerometru MPU 6050 Ardushop 1 buc 15,48 RON
Modul cu Buzzer activ Ardushop 1 buc 4,97 RON
Fire de legătură mamă-mamă Ardushop 40 buc 10,07 RON
Fire de legătură mamă-tată Ardushop 40 buc 14,46 RON
Breadboard Ardushop 1 buc 2,46 RON
Total 125,91 RON

3. Schema electrică

Software Design

1. Mediu de dezvoltare

Pentru realizarea proiectului am folosit mai multe resurse software:

  1. Eagle 9.4.0 → schema electrică
  2. Sublime Text → editor text pentru scrierea codului
  3. HID Boot Flash → Bootloader 2019

2. Biblioteci

Pentru partea de cod a fost necesară includerea de biblioteci. Am folosit atât biblioteci disponibile în standardul C, cât și biblioteci create special, ale căror fisere sursă sunt incluse în arhiva proiectului, în foldere specifice.

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "nokia5110/nokia5110.h"
#include "mpu6050/mpu6050.h"

Așa cum se poate observa și în lista de componente de mai sus, în cadrul proiectului am folosit un LCD Nokia 5110 și un modul de accelerometru cu giroscop MPU 6050. Pentru aceste două componente am folosit două biblioteci (ultimele din lista de mai sus), care mi-au pus la dispoziție funcții pentru a putea lucra mult mai ușor cu datele preluate, respectiv afișate. Link-urile de unde am obținut aceste biblioteci se găsesc mai jos, la secțiunea resurse.

3. Codul propriu-zis

Am încercat să modularizez cât mai mult codul cu scopul de a fi cât mai ușor de înțeles, dar și de modificat. Prin urmare, am început cu crearea unor macrodefinitii, care conțin, de fapt, constantele alese de mine, ce se pot schimba foarte ușor datorită define-urilor.

Acestea furnizează informații despre:

  • dimensiunile ecranului LCD

#define LCD_WIDTH 84
#define LCD_HEIGHT 48

  • pinii și porturile folosite

#define BUTTON_DDR DDRB
#define BUTTON_PORT PORTB
#define BUTTON_PIN PINB
#define BTN PB2
#define BTN_PRESSED ( ( (BUTTON_PIN & (1 « BTN) ) == 0) )

#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED PD7
#define LED_TIME 500

#define BUZZER_DDR DDRA
#define BUZZER_PORT PORTA
#define BUZZER PA7
#define BUZZER_TIME 500

  • pozițiile (stările) în care se poate găsi o persoană care realizează o genuflexiune

#define UP 0
#define DOWN 1

  • cele trei axe de deplasare

#define OX 0
#define OY 1
#define OZ 2

  • numărul de valori pentru care se face media cu scopul de a obține o valoare aproximativă, numărul de repetări după care există semnal sonor sau numărul de milisecunde de întârziere

#define NUM_VALUES 50
#define NUM_REPS 10
#define DELAY 300

Următoarea etapă a fost definirea unor funcții care să afișeze mesaje informative pe ecran, care conțîn instrucțiuni pentru utilizator. În cadrul acestora am folosit foarte mult funcțiile puse la dispoziție in biblioteca folosită pentru Nokia 5110, care presupun ștergerea ecranului, scrierea unui șir de caractere începând de la un anumit pixel și afișarea propriu-zisă pe ecran.

void nokia_lcd_clear();
void nokia_lcd_set_cursor(column, line);
void nokia_lcd_write_string(string, size);
void nokia_lcd_render();

Printre funcționalitățile proiectului se numără și emiterea unui semnal sonor la fiecare 10 repetări, dar și aprinderea LED-ului la fiecare genuflexiune executată. Din acest motiv, mi-am creat și două funcții, una pentru aprinderea LED-ului și una pentru setarea portului care activează buzzer-ul.

void light_led(void);
void buzz(void);

Datele de intrare sunt reprezentate de informațiile oferite de accelerometru. Prin urmare, mi-am creat două funcții care îmi returnează valorile citite de modul. Din păcate, precizia acestuia nu este tocmai exactă, motiv pentru care una dintre funcții realizează o medie a mai multor valori citite la intervale scurte de timp din același loc. Astfel, încerc să obțîn o precizie mai bună și să elimin cazurile in care una dintre măsurători ar fi cu mult mai mică sau mai mare față de celelalte, prin estomparea acestei diferențe folosind media aritmetică. De precizat este că axele pe care se realizează mișcarea în poziția în care am așezat eu modulul pe breadboard sunt Ox și Oz, de aceea funcțiile vor returna doar valorile pentru aceste axe.

void mpu6050_getConvData(&axg, &ayg, &azg, &gxds, &gyds, &gzds);
double get_value(int ax);
double get_avg_value(int ax);

Ideea de bază constă în stabilirea a două poziții relevante pentru mișcarea de genuflexiune(UP și DOWN), preluarea valorilor date de accelerometru pentru acestea și folosirea lor pentru determinarea momentului în care o persoană se află în vreuna din cele două poziții. Așadar, am două funcții care verifică dacă utilizatorul se află în una din cele două situații, prin citirea datelor furnizate de modul la un interval scurt de timp și compararea valorilor de pe axele Ox și Oz cu cele pentru două stări definite.

int wait_down_value(double down_value, int ax);
int wait_up_value(double up_value, int ax);

În funcția principala se apelează toate celelalte funcții implementate. Mai exact, se analizează starea/poziția în care se găsește persoana la momentul curent și se așteaptă până când ajunge în starea/poziția următoare, actualizandu-se contorul, afișând pe ecran mesajul cosrespunzator, aprinzând LED-ul și, eventual, emitând semnalul sonor.

void count(double down_value_oz, double up_value_oz, double down_value_ox, double up_value_ox);

Sursa se găsește sub formă de arhivă mai jos, în secțiunea Download.

Rezultate Obţinute

1. Perspectivă de ansamblu asupra proiectului

Mai jos se regăsesc câteva imagini cu toate piesele asamblate ce intră în componența proiectului.

2. Instrucțiuni pas cu pas

În cele ce urmează voi detalia pașii pe care îi urmează utilizatorul, respectiv voi adăuga imagini cu afișajul de pe ecran de la fiecare instrucțiune.

1. Afișarea mesajului de prezentare 2. Afișarea mesajului de început 3. Afișarea mesajului de poziționare (UP)
4. Afișarea mesajului de orientare a ecranului 5. Afișarea mesajului de colectare de date 6. Afișarea mesajului de poziționare (DOWN)
7. Afișarea mesajului de orientare a ecranului 8. Afișarea mesajului de colectare de date 9. Afișarea mesajului de start
10. Afișarea mesajului de îndrumare (DOWN) 11. Afișarea mesajului de îndrumare (UP) 12. Afișarea mesajului final - rezultatul

Concluzii

Realizarea proiectului a fost interesantă, dar mai ales provocatoare, deoarece mi-a pus la încercare (din nou) abilitățile de a concepe de la zero ceva cu totul și cu totul nou, fără a avea în prealabil vreun fel de cunoștințe în domeniu sau vreun ajutor constant. Satisfacția este și mai mare întrucât nu am crezut că voi reuși nici măcar să lipesc piesele pe plăcută, dar să mai și finalizez proiectul. Cu toate acestea, mă bucur că am reușit să învăț să concep atât partea de hardware, cât și cea de software, ajungând la un tot unitar mulțumitor.

Download

Bibliografie/Resurse

1. Resurse Hardware

2. Resurse Software

3. Alte resurse

4. Pagină PDF

pm/prj2019/amocanu/squat-counter.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0