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.
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.
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.
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)
Principala caracteristica a programului este numararea trecerilor magnetului prin fata senzorului. Astfel algoritmul este urmatorul:
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
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:
Fisierele au fost scrise si compilate pe Linux, iar programarea s-a facut de asemenea folosind avrusbboot pentru Linux.
Fisierele sursa: Fisiere Sursa
Datasheet-uri componente:
Alte site-uri care mi-au fost de mare folos: