Vitezometru bicicleta

Introducere

Ideea proiectului este de a crea un sistem pentru bicicleta, care sa afiseze informatii referitoare la drumul curent cu aceasta: viteza curenta, distanta parcursa sau alte informatii statistice.

Ca posesor de bicicleta consider ca un asemenea tool mi-ar fi de mare folos. Sistemele similare din comert nu sunt foarte accesibile, preturile unora dintre acestea sarind foarte sus. De asemenea, acest proiect imi permite sa customizez foarte usor informatiile pe care le doresc (de exemplu sa afisez viteza in cm/s sau m/minut sau distanta in yarzi), singurele modificari necesare fiind ale formulelor de calcul.

Descriere generală

Din punctul de vedere al implementarii, am mers pe urmatoarea idee: voi folosi un mic senzor magnetic Hall atasat de cadrul bicicletei si un mic magnet atasat de roata bicicletei. In momentul in care magnetul trece prin fata senzorului, campul magnetic ridicat imi va permite sa detectez trecerea magnetului. Numarand aceste treceri intr-o perioada de timp aleasa (de exemplu 1 sec) si folosind raza rotii, se poate calcula vitez dispozitivului, distanta parcursa, acceleratia si nu numai.

Pentru afisarea informatiilor, am folosit un afisaj LCD text de 16 caractere si 2 linii. Reafisarea informatiilor se face periodic (in varianta finala o data pe secunda). Cotrolul afisajului se face de catre microcontrolerul de pe placa principala.

Hardware Design

Ca mentiuni hardware ar trebui sa adaug faptul ca pentru afisajul LCD, pentru pinul de contrast, am folosit un potentiometru de 10k, astfel incat sa pot pune pe pinul VEE (contrast) o tensiune variabila. Afisajul optim l-am obtinut pentru o tensiune de 1.5V.

De asemenea, dupa cum scrie in datasheet, senzorul SS49 scoate la iesire o tensiune variabila intre 1.75V si 2.25V, cu 2V la 0 gauss. Am folosit convertorul ADC de pe portul PA7 pentru a detecta voltajul de iesire al senzorului.

Lista de piese
  • placa realizata pentru etapa 1
  • senzor Hall - Honeywell SS49
  • afisaj text 1602 - Raystar 1602 Text Display
  • cabluri conectare
  • rezistente de 1k
  • potentiometru de 10k pentru setarea contrastului
Scheme electrice

Senzor magnetic SS49

Schema circuit

Software Design

Ca mediu de dezvoltare folosit am ales Geany (am preferat o dezvoltare pe Linux datorita problemelor pe care le-am intalnit la instalarea corecta a driverelor avrusbbot pe sistemul meu Windows 7)

Algoritmul folosit

Principala caracteristica a programului este numararea trecerilor magnetului prin fata senzorului. Astfel algoritmul este urmatorul:

  • initializez LCD-ul, ADC-ul si Timerul 1 pentru genererarea de intreruperi odata la un interval fix (DISPLAY_SPEED)
  • in programul principal, cat timp nu sunt in fata senzorului astept intrarea in raza acestuia (prin polling)
  • in momentul in care detectez ca sunt langa magnet, ma asigur ca se considera o singura trecere si, la iesire din raza, incrementez contorul de treceri
  • o data la un interval fix (DISPLAY_SPEED) este generata o intrerupere de catre Timerul1 . In acel moment calculez viteza din ultima secunda, distanta parcursa total si celelelalte informatii si realizez reafisarea pe LCD.
Alte mentiuni

Nu am folosit librarii externe, ci doar codul din laboratorul 1 pentru afisajul LCD. Aici am intalnit niste probleme datorate timing-ului (afisajul nu pornea uneori sau afisa mult prea repede pentru ca utilizatorul sa apuce sa vizualizeze textul. Dupa o indelungata analiza am reusit sa rectific problema prin plasarea in diferite portiuni ale codului de afisare a unor apeluri de asteptare (LCD_waitInstructions si _delay_ms).

Pentru a numara o singura data o trecere a magnetului prin fata senzorului, am realizat o verificare a valorii de iesire a senzorului (folosind ADC pe PA7) cu o valoare de referinta obtinuta prin observatie directa - NO_GAUSS. In momentul in care valoarea de la senzor iese din intervalul (NO_GAUSS - GAUSS_THRESHOLD, NO_GAUSS + GAUSS_THRESHOLD), se considera ca senzorul este in fata magnetului. Apoi, printr-un ciclu, ma asigur ca atat timp cat senzorul ramane in fata magnetului, se considera tot o singura trecere.

Pentru calcularea vitezei, am folosit o formula incrementala: viteza_curenta = viteza_din_ultima_perioada * RATIO + viteze_curenta_anterioara * (1 - RATIO), unde RATIO este o valoare momentan aleasa ca fiind 0.8. Viteza din ultima perioada este calculata ca: numar_rotatii/durata_perioadei*2*PI*RADIUS

Rezultate Obţinute si Concluzii

Proiectul a fost finalizat si in varianta aceasta am ales sa realizez afisarea vitezei (in cm/s si rps) si a distantei totale parcurse (in cm/s si numar de treceri prin fata senzorului in total). Asa cum am spus si anterior, alte informatii se pot afisa extrem de usor, prin simpla modificare/adaugare de formula in functia de tratare a semnalului generat de timer (adica inaintea afisarii). Proiectul poate fi dezvoltat si poate fi folosit ca inceput pentru multe alte genuri de proiecte: controler de motoras.

Realizarea proiectului mi s-a parut foarte interesanta (mai putin orele pierdute pentru setarea afisajului) si per ansamplu cred ca a fost o experienta deosebita.

Pentru testare, am realizat un mic sistem rotativ, actionat de un motaras reglabil. Astfel, am dus sistemul pana la 25 de rotatii pe secunda si rezultatele au fost satisfacatoare.

Atasez cateva poze din timpul dezvoltarii si dupa finalizarea acestuia:

Inainte de lucru

Afisaj LCD

Senzor Hall

Placuta initiala

Sistemul functional

Sistemul de test

Download

Fisierele au fost scrise si compilate pe Linux, iar programarea s-a facut de asemenea folosind avrusbboot pentru Linux.

Fisierele sursa: Fisiere Sursa

Bibliografie/Resurse

Datasheet-uri componente:

Alte site-uri care mi-au fost de mare folos:

pm/prj2011/dtudose/vitezometru_bicicleta.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