This is an old revision of the document!
Proiectul propune realizarea unui sistem automatizat de cartografiere a suprafețelor, folosind un microprocesor Arduino, un senzor de distanță și un mecanism de scanare pe două axe. Măsurătorile realizate sunt afișate real-time prin intermediul unui ecran LCD, iar la final o aplicație specializată realizează un heat-map și o replică 3D a terenului scanat.
Scopul principal este de a construi un instrument portabil și intuitiv pentru analiza formelor de relief la scară mică, combinând vizualizarea imediată cu interpretarea detaliată pe calculator.
Ideea este inspirată dintr-o demonstrație văzută pe Internet, ce implica o hartă din nisip cu diferite forme de relief și un proiector care colora nisipul în diferite culori pentru a distinge între înălțimile terenului. Această aplicație era folosită pentru a învăța copiii să citească hărțile bazate pe înălțimi și adâncimi prin vizualizarea schimbărilor în timp real.
Consider că un astfel de proiect ar fi util atât pentru scopul prezentat mai sus, de prezentare interactivă a creării unei hărți, dar și pentru observarea imperfecțiunilor sau a diferențelor de nivel de pe o suprafață de dimensiuni reduse.
Componente hardware:
Interacțiune hardware - software
+----------------------+ | Sistem de scanare | | (motoare pas cu pas) | +---------+------------+ | v +----------------------+ | Senzor de distanță | +---------+------------+ | v +-------------------+ | Microprocesor | +---+----------+----+ | | v v +-----------------+ +------------------+ | Ecran LCD | | Laptop | | Afișare locală | | Afișare digitală | +-----------------+ +------------------+
Listă de componente:
Descrierea sistemului mecanic
Sistemul este proiectat pentru a realiza o scanare pe suprafața unei zone plane, utilizând un senzor de distanță ultrasonic montat pe o platformă mobilă în două direcții (Ox și Oy). Mișcarea bidimensională este asigurată de două motoare pas cu pas 28BYJ-48, fiecare fiind responsabil pentru deplasarea senzorului pe una dintre axe.
Mecanismul de transmisie pentru fiecare axă este realizat din roți dințate (gear train), integrate într-un cadru imprimat 3D. Axele au o lungime de aproximativ 30 cm. Axa Oy este fixată pe un suport din carton, astfel încât capetele axei rămân staționare, iar motorul de pe această axă deplasează întregul ansamblu mobil (slider) de-a lungul direcției verticale (în planul scanării).
Pe acest slider este montată și axa Ox, permițând astfel deplasarea senzorului și în direcția orizontală. Ansamblul funcționează ca un sistem de coordonate cartezian, în care senzorul este poziționat succesiv deasupra fiecărui punct dintr-o matrice 2D, în scopul măsurării distanței față de suprafață.
Modul de funcționare
Senzorul parcurge o matrice de 20×20 puncte de măsurare, urmând o traiectorie „linie cu linie”, similară cu următoarea ordine:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
La fiecare punct, senzorul măsoară distanța față de suprafață, iar valorile sunt afișate în timp real pe un ecran LCD și transmise prin portul serial către un computer, unde pot fi salvate sub formă de fișier și ulterior prelucrate (de exemplu, pentru generarea unei hărți de înălțime).
Estetică și stabilitatea mecanică
Un aspect important întâmpinat în timpul realizării sistemului a fost dezechilibrul axei Ox la extindere maximă, cauzat de greutatea motoarelor. Inițial, masa motoarelor afecta distribuția forței, determinând înclinarea platformei mobile. Problema a fost rezolvată prin reconfigurarea poziționării:
Pentru a menține axa Ox cât mai paralelă cu suprafața de scanat, a fost adăugat un element de sprijin din carton, care funcționează ca o bară de susținere orizontală.
Componentele electronice, precum placa Arduino și breadboard-ul, au fost ascunse în spatele unui panou de carton , pe care este montat și afișajul LCD. Acest design asigură un aspect ordonat, oferind totodată protecție componentelor. Placa de dezvoltare este montată într-o carcasă de plexiglas pentru siguranță și vizibilitate parțială.
Software-ul proiectului este împărțit în două componente:
Arduino
Biblioteci utilizate
Variabile globale și inițializare
Funcția setup()
Funcția loop()
Parcurgerea matricei:
for (int y = currentY; y < gridSize; y++) {
for (int x = (y == currentY ? currentX : 0); x < gridSize; x++) {
Măsurarea distanței:
do {
''digitalWrite(trigPin, LOW);'' ''delayMicroseconds(2);'' ''digitalWrite(trigPin, HIGH);'' ''delayMicroseconds(10);'' ''digitalWrite(trigPin, LOW);'' ''duration = pulseIn(echoPin, HIGH);'' ''distance = duration * 0.034 / 2;''
real_distance = 8 - distance;
Python
Partea de cod scris în Python are ca scop crearea a două diagrame: una 2D care reprezintă un heat-map bazat pe matricea de înălțimi și o replică 3D interactivă care simulează forma terenului scanat.
Heat-map-ul este realizat folosind numpy și matplotlib, iar pentru a forma legenda cu numerele corespunzătoare sunt create două heat-map-uri, unul oentru graficul propriu-zis și unul special pentru legendă.
Replica 3D a terenului este implementată folosind pyplot, astfel încât să fie interactiv, utilizatorul putând să se miște în jurul simulării de teren pentru a fi vizualizat din orice unghi.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
În această secțiune voi enumera problemele întâmpinate pe parcursul proiectului, dar și soluțiile găsite în cazul în care problema a fost rezolvată: