Introducere
Proiectul meu este o reprezentare practica a conceptului de “Cruise Control Adaptiv” introdus de marile firme de automobile. O mica demonstratie a ideii din spatele acestui proiect:
<flash center 425×344 http://www.youtube.com/v/CkEipB8lvOA>
hl en_US
fs 1
allowFullScreen true
allowscriptaccess always
</flash>
Un astfel de sistem ajuta la condusul automobilului in conditii de autostrada, unde viteza ramane constanta o perioada lunga de timp.
Primele sisteme de pilot automat pastrau doar viteza dorita de sofer, fara a tine cont de ceea ce se petrece in fata masinii. Fata de acestea, un “Cruise Control Adaptiv” detecteaza viteza masinilor din fata si adapteaza viteza automobilului in consecinta, incetinind sau chiar oprind in caz de pericol imediat.
Descriere generală
Din punct de vedere logic, proiectul este compus din urmatoarele:
Ca punct de plecare s-a folosit o masinuta de jucarie cumparata din comert care a oferit atat spatiul pentru bateriile care alimenteaza motorul, cat si spatiul de prindere al placii si mai ales angrenajul pentru motor. Am folosit o baterie de 9V pentru a alimenta partea digitala a circuitului (printr-un regulator de tensiune 7805) si un set de 6 baterii de 1.5V legate in serie pentru a asigura o autonomie mai mare. Capacitatea unei baterii standard de 9V este de ~10 ori mai mica decat a unui grup de 6 baterii de 1.5V legate in serie.
Mod de functionare
Initial, utilizatorul trebuie sa selecteze viteza dorita. Aceasta se face prin intermediul a 3 butoane, 2 pentru crestere/descrestere a vitezei si unul pentru a confirma alegerea facuta. LCD-ul ofera constant feedback asupra setarilor curente.
Rezultatele de la senzorul de distanta se primesc prin intermediul convertorului A/D de pe microcontroller.
Senzorul trimite la iesire o tensiune cu un interval de 2.2V, unde pragul maxim reprezinta un obiect situat la 4cm, iar valoarea minima un obiect situat la 30 cm. (Valorile absolute depind de opacitatea obiectului)
Ajustarea vitezei se face in functie de variatia distantei pana la obstacol, pe 3 intervale de distanta. Motorul este controlat printr-un semnal PWM .
Hardware Design
Principalele piese folosite
ATMega 16
Driver de motoare L298
Senzor Sharp de distanta
LCD alfanumeric 16×2


Nu puteti alimenta circuitul digital (microcontroller-ul si celelalte intrari logice) din aceeasi sursa de curent din care veti alimenta si motoarele.
JP4 este un header cu 2 pini la 90 grade. La el voi conecta prima sursa de tensiune (>=7V pentru ca regulatorul de tensiune (7805) sa poata functiona).
Am montat un condensator de 1mF pentru a asigura o tensiune cat se poate de constanta regulatorului. Acelasi rol il are si condensatorul mai mic, de dupa regulator.

Primi 2 pini sunt Ground si Vcc.
Pinul 3 regleaza contrastul, pentru contrast maxim l-am conectat la masa.
Pinii 15 si 16 sunt (+) si (-) pentru backlight-ul LCD-ului. Se foloseste o rezistenta intocmai ca la un LED normal.

Pinul 1 reprezinta alimentarea
Pinul 2 masa
Pinul 3 va furniza tensiunea pentru convertorul A/D.

Driver-ul este unul DUAL, ceea ce inseamna ca poate fi folosit pentru a comanda 2 motoare
Viteza motoarelor se poate controla folosind PWM. Este foarte usor de implementat (3 linii de cod) si da rezultate foarte bune.
Alimentarea motorului se face printr-un set de 6 baterii conectate la JP1 si mai departe la pinul 4. Eu am folosit 6 baterii de 1.5V legate in serie cu o capacitate ~2000mAh, fata de 200mAh cat are o baterie de 9V pe care o gasiti in comert.
Pinul 11 (ENABLE B) va primi semnalul PWM care va controla efectiv viteza masinutei.
Pinii 10 si 12 (INPUTs) primesc semnal logic. Cand au valori opuse, masinuta merge intr-o anumita directie. Daca ambii au aceeasi valoare si pinul de ENABLE are valoare logica 1, atunci se realizeaza franare activa.
Diodele au rolul de a proteja driver-ul. Se recomanda diode rapide/ultra-rapide cu timpi de comutatie cat mai mici.
Recomand citirea cu atentie a datasheet-ului, va scuteste de foarte multe neplaceri.
Piesele le-am procurat in principal de la Syscom si Farnell. Am avut o tentativa cu Adelaida, dar dupa ce mi-au intarziat cu 1 saptamana proiectul, am renuntat. Farnell sunt cei mai buni si va recomand sa luati toate piesele de la ei, mai ales daca stiti exact de ce aveti nevoie. Mie si inca unui coleg (comenzi separate) ne-au ajuns toate piesele in o singura zi, din momentul in care am dat comanda. Ambalarea este profesionist facuta, nu va faceti griji ca se deterioreaza pe parcursul transportului.
De mare ajutor in realizarea proiectului au fost simularile in Proteus alaturi de care am lucrat pas cu pas. Orice lucru implementat pe placuta era mai intai simulat pentru a ma asigura de corectitudinea schemelor.
La fel de mult m-a ajutat faptul ca am realizat o placuta imprimata, nu am incercat sa realizez tot circuitul pe o placuta de test. Desi este un pic mai mult de munca, in final veti aprecia ca nu trebuie sa lipiti zeci de fire pentru a va realiza circuitul.
Mare atentie totusi la schema electrica. E recomandat sa fie facuta bine pentru ca modificarile pe PCB sunt relativ greu de facut (in functie de greseala facuta) si un moment de neatentie poate avea consecinte nefaste.
Greseli facute pe parcurs
Cauza | Efect | Solutie |
Conectarea butoanelor la pinii programatorului USB | Nu mai mergeau nici programatorul, nici butoanele | Legarea butoanelor pe alti pini decat cei folositi de programatorul USB. |
Alimentarea ambelor circuite de la 2 baterii conectate in paralel | Introducerea motorului in circuit reseta microcontrollerul | Separarea circuitelor de alimentare. |
Alegerea unui senzor cu o distanta de detectie mult prea mica | Masinuta nu poate accelera foarte mult pentru ca raza de detectie nu ii ofera suficient timp sa opreasca. | Cumpararea unui senzor nou. |
Software Design
Codul l-am scris in Programmer's Notepad si Notepad++ folosindu-ma de laboratoarele implementate la PM si de tutoriale/sfaturi de pe internet.
Singura biblioteca externa folosita este cea de interfatare a LCD-ului din laboratorul 1. O problema intalnita in comunicarea cu LCD-ul a fost atunci cand se activau intreruperile (apelul sei(); ). In acel moment display-ul se reseta si nu mai afisa nimic. Cea mai simpla solutie mi s-a parut adaugarea unui ISR care sa trateze toate intreruperile ce nu au propriul macro de tratare:
ISR(__vector_default)
{
// Bad interrupt code goes here
}
Algoritm
La fiecare pas, este citita valoarea distantei de la convertorul A/D. Aceasta poate fi interpretata foarte usor ca o distanta, exprimata in cm.
In functie de aceasta distanta am stabilit 3 intervale
Daca se intalneste vreun obstacol in intervalul 0-20cm
Daca obstacolul este prezent in intervalul 20-25cm
Daca obstacolul este la peste 25cm
Dupa cum am mai spus, un senzor cu o raza de detectie mai mare ar fi permis stabilirea unor intervale mai realiste si o functionare mai buna a masinii.
Rezultate Obţinute
In ciuda unor probleme aparute pe parcurs, proiectul este functional.
Masinuta detecteaza obstacolele din intervalul 4-30cm si ia deciziile asa cum este prezentat in sectiunea 'Algoritm'.
Mentine o viteza constanta in spatele unui obiect ce se deplaseaza in fata ei.
Singura problema apare in cazul unei opriri bruste cand intervalul mic de detectie nu ii permite sa reactioneze suficient de repede.
Functiile de selectare a vitezei cu ajutorul LCD-ului si a butoanelor functioneaza perfect.
Concluzii
A fost o experienta extrem de interesanta si recomand tuturor sa se apuce si sa termine acest proiect.
Mi-am imbogatit cunostintele de electronica si am invatat sa lucrez cu programe de design al PCB-urilor.
Pornesti de la o idee, incepi si te documentezi, realizezi schemele, implementezi hardware-ul si codul. Testezi.
Senzatia pe care o ai la sfarsit cand vezi ca ce a pornit ca o idee vaga s-a transformat intr-un proiect functional este extraordinara. GARANTAT!
Download
Jurnal
Data | Progres |
7-9 mai | Documentare, stabilire in principiu a modului cum va functiona |
10-13 mai | Realizare scheme electrice. |
13 mai - 21 mai | Alergat dupa piese, realizat PCB-ul si cumparat intr-un final toate piesele importante |
21 mai - 24 mai | Implementat hardware. Descoperit 1.000 de probleme. Peticit placa. Am terminat partea de selectie a vitezei |
24 mai | Descoperit ca nu merge L298. Schimbat cu altul. Aceeasi problema. Multi nervi. |
25 mai | Aflat de ce nu merge L298. Neatentie mare la corespondenta dintre ce am desenat in Eagle si cum am asezat L298-ul pe placa. |
25 mai - 31 mai | Pauza. |
1 iunie - 2 iunie | Terminat hardware-ul. Facut conectori si cabluri. Primele teste pe module individuale |
3 iunie | Scris codul. Prezentat. Totul a fost ok! |
Bibliografie/Resurse
Software:
-
-
-
Hardware:
-
http://elf.cs.pub.ro/pm/wiki/ - foarte utile sunt schemele de la placuta programator, placuta folosita in laborator si alte detalii despre hardware pe care le veti gasi in laboratoare
-
-