This shows you the differences between two versions of the page.
pm:prj2022:arosca:senzorparcare [2022/05/23 20:02] theodor.grigoras [Software Design] |
pm:prj2022:arosca:senzorparcare [2022/05/23 21:03] (current) theodor.grigoras [Descriere generală] |
||
---|---|---|---|
Line 4: | Line 4: | ||
===== Introducere ===== | ===== Introducere ===== | ||
- | Proiectul consta in implementarea unui sistem care simuleaza functionalitatea senzorilor de parcare de pe masinile moderne. | + | Proiectul constă în implementarea unui sistem care simulează funcționalitatea senzorilor de parcare de pe mașinile moderne. |
- | Sistemul are la baza trei senzori ultrasonici de distanta care scaneaza trei zone diferite, iar cand un obiect se afla la o distanta seminficativ de mica, utilizatorul va fi anuntat. | + | Sistemul are la bază trei senzori ultrasonici de distanță care scaneaza trei zone diferite, iar cand un obiect se află la o distanță seminficativ de mică, utilizatorul va fi anunțat. |
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | Senzorul Ultrasonic de distanta HC-SR04 este un sensor cu un timp de raspuns foarte mic, dar in cazul in care obiectul se afla la o distanta foarte mica, rezultatele obtinute sunt invalide. In cadrul proiectului, am folosit trei astfel de senzori, conectivitatea cu placa Arduino facandu-se cu ajutorul unui Breadboard. Senzorul este format din 4 pini: VCC, GND, Echo si Trigger. | + | Senzorul Ultrasonic de distanță HC-SR04 este un sensor cu un timp de răspuns foarte mic, dar în cazul in care obiectul se află la o distanță foarte mică, rezultatele obținute sunt eronate. În cadrul proiectului, am folosit trei astfel de senzori, conectivitatea cu placa Arduino făcându-se cu ajutorul unui Breadboard. Senzorul este format din 4 pini: VCC, GND, Echo si Trigger. |
- | Pentru a functiona, Trigger Pin-ul senzorului are nevoie de un implus de cel putin 10µS, moment in care senzorul va trimite 8 impulsuri de 40KHz care formeaza "unda ultrasonica". In momentul in care unda intalneste un obiect in calea ei, se reflecta, iar aceasta unda este receptata de catre Pin-ul ECHO, dupa o durata de timp, care va fi transformata in distanta. | + | Pentru a funcționa, Trigger Pin-ul senzorului are nevoie de un implus de cel puțin 10µS, moment în care senzorul va trimite 8 impulsuri de 40KHz care formează "unda ultrasonică". În momentul în care unda intâlnește un obiect în calea ei, se reflectă, iar această unda este receptată de catre Pin-ul ECHO, dupa o durată de timp, care va fi transformată în distanță. |
- | Matricea de LED-uri 8x8, vine impreuna cu un modul MAX7291, pentru a minimiza numarul de pini folositi si pentru a putea folosi o biblioteca aditionala Arduino (LedControl.h). Modulul foloseste 5 pini: VCC, GND, DIN, CS si CLK care sunt legati de placa Ardunio cu ajutorul unui Breadboard. | + | Matricea de LED-uri 8x8, vine impreuna cu un modul MAX7291, pentru a minimiza numarul de pini folosiți si pentru a putea folosi o bibliotecă adiționala Arduino (LedControl.h). Modulul foloseste 5 pini: VCC, GND, DIN, CS si CLK care sunt legați de placa Ardunio cu ajutorul unui Breadboard. |
==== Schema bloc ==== | ==== Schema bloc ==== | ||
Line 41: | Line 41: | ||
**printByte** este o funcție care afișează o matrice de 8x8 biți (afișarea se face linie cu linie). | **printByte** este o funcție care afișează o matrice de 8x8 biți (afișarea se face linie cu linie). | ||
- | #include <LedControl.h> | + | <code java> |
+ | #include <LedControl.h> | ||
+ | |||
+ | const int echoPinRight = 8; | ||
+ | const int trigPinRight = 9; | ||
+ | |||
+ | const int echoPinLeft = 10; | ||
+ | const int trigPinLeft = 11; | ||
+ | |||
+ | const int echoPinBack = 2; | ||
+ | const int trigPinBack = 3; | ||
+ | |||
+ | const int BUZZER = 12; | ||
+ | |||
+ | const int DIN = 7; | ||
+ | const int CS = 6; | ||
+ | const int CLK = 5; | ||
+ | |||
+ | LedControl lc = LedControl(DIN, CLK, CS, 0); | ||
+ | |||
+ | long duration; | ||
+ | int distance; | ||
+ | |||
+ | int distanceRight; | ||
+ | int distanceLeft; | ||
+ | int distanceBack; | ||
+ | |||
+ | int safetyDistance = 3; | ||
+ | |||
+ | void setup() { | ||
+ | // put your setup code here, to run once: | ||
+ | pinMode(echoPinRight, INPUT); | ||
+ | pinMode(trigPinRight, OUTPUT); | ||
+ | |||
+ | pinMode(echoPinLeft, INPUT); | ||
+ | pinMode(trigPinLeft, OUTPUT); | ||
+ | |||
+ | pinMode(echoPinBack, INPUT); | ||
+ | pinMode(trigPinBack, OUTPUT); | ||
+ | |||
+ | pinMode(BUZZER, OUTPUT); | ||
+ | |||
+ | lc.shutdown(0, false); | ||
+ | lc.setIntensity(0, 1); | ||
+ | lc.clearDisplay(0); | ||
| | ||
- | const int echoPinRight = 8; | + | Serial.begin(9600); |
- | const int trigPinRight = 9; | + | } |
- | + | ||
- | const int echoPinLeft = 10; | + | void loop() { |
- | const int trigPinLeft = 11; | + | // put your main code here, to run repeatedly: |
- | + | byte initial[8] = {0b11111111, 0b10000001, 0b10000001, 0b10000001, 0b10000001, 0b10000001, 0b10000001, 0b10000001}; | |
- | const int echoPinBack = 2; | + | |
- | const int trigPinBack = 3; | + | // obtain the distance from every sensor |
- | + | SonarSensor(trigPinLeft, echoPinLeft); | |
- | const int BUZZER = 12; | + | distanceLeft = distance; |
- | + | ||
- | const int DIN = 7; | + | SonarSensor(trigPinRight, echoPinRight); |
- | const int CS = 6; | + | distanceRight = distance; |
- | const int CLK = 5; | + | |
- | + | SonarSensor(trigPinBack, echoPinBack); | |
- | LedControl lc = LedControl(DIN, CLK, CS, 0); | + | distanceBack = distance; |
- | + | ||
- | long duration; | + | // check the distance |
- | int distance; | + | if(distanceBack < safetyDistance || distanceRight < safetyDistance || distanceLeft < safetyDistance) { |
- | + | digitalWrite(BUZZER, HIGH); | |
- | int distanceRight; | + | } else { |
- | int distanceLeft; | + | digitalWrite(BUZZER, LOW); |
- | int distanceBack; | + | |
- | + | ||
- | int safetyDistance = 3; | + | |
- | + | ||
- | void setup() { | + | |
- | // put your setup code here, to run once: | + | |
- | pinMode(echoPinRight, INPUT); | + | |
- | pinMode(trigPinRight, OUTPUT); | + | |
- | + | ||
- | pinMode(echoPinLeft, INPUT); | + | |
- | pinMode(trigPinLeft, OUTPUT); | + | |
- | | + | |
- | pinMode(echoPinBack, INPUT); | + | |
- | pinMode(trigPinBack, OUTPUT); | + | |
- | + | ||
- | pinMode(BUZZER, OUTPUT); | + | |
- | + | ||
- | lc.shutdown(0, false); | + | |
- | lc.setIntensity(0, 1); | + | |
- | lc.clearDisplay(0); | + | |
- | | + | |
- | Serial.begin(9600); | + | |
} | } | ||
- | | + | |
- | void loop() { | + | // set distance matrix according to all sensors |
- | // put your main code here, to run repeatedly: | + | if(distanceBack < 7) { |
- | byte initial[8] = {0b11111111, 0b10000001, 0b10000001, 0b10000001, 0b10000001, 0b10000001, 0b10000001, 0b10000001}; | + | initial[1] = initial[0]; |
- | | + | } |
- | // obtain the distance from every sensor | + | if(distanceBack < safetyDistance) { |
- | SonarSensor(trigPinLeft, echoPinLeft); | + | initial[2] = initial[0]; |
- | distanceLeft = distance; | + | } |
- | | + | |
- | SonarSensor(trigPinRight, echoPinRight); | + | if(distanceLeft < 7) { |
- | distanceRight = distance; | + | for(int i = 0; i < 8; i++) { |
- | + | initial[i] = initial[i] | 0b01000000; | |
- | SonarSensor(trigPinBack, echoPinBack); | + | |
- | distanceBack = distance; | + | |
- | | + | |
- | // check the distance | + | |
- | if(distanceBack < safetyDistance || distanceRight < safetyDistance || distanceLeft < safetyDistance) { | + | |
- | digitalWrite(BUZZER, HIGH); | + | |
- | } else { | + | |
- | digitalWrite(BUZZER, LOW); | + | |
} | } | ||
- | + | } | |
- | // set distance matrix according to all sensors | + | |
- | if(distanceBack < 7) { | + | if(distanceLeft < safetyDistance) { |
- | initial[1] = initial[0]; | + | for(int i = 0; i < 8; i++) { |
+ | initial[i] = initial[i] | 0b00100000; | ||
} | } | ||
- | if(distanceBack < safetyDistance) { | + | } |
- | initial[2] = initial[0]; | + | |
+ | if(distanceRight < 7) { | ||
+ | for(int i = 0; i < 8; i++) { | ||
+ | initial[i] = initial[i] | 0b00000010; | ||
} | } | ||
- | | ||
- | if(distanceLeft < 7) { | ||
- | for(int i = 0; i < 8; i++) { | ||
- | initial[i] = initial[i] | 0b01000000; | ||
- | } | ||
- | } | ||
- | | ||
- | if(distanceLeft < safetyDistance) { | ||
- | for(int i = 0; i < 8; i++) { | ||
- | initial[i] = initial[i] | 0b00100000; | ||
- | } | ||
- | } | ||
- | | ||
- | if(distanceRight < 7) { | ||
- | for(int i = 0; i < 8; i++) { | ||
- | initial[i] = initial[i] | 0b00000010; | ||
- | } | ||
- | } | ||
- | | ||
- | if(distanceRight < safetyDistance) { | ||
- | for(int i = 0; i < 8; i++) { | ||
- | initial[i] = initial[i] | 0b00000100; | ||
- | } | ||
- | } | ||
- | | ||
- | | ||
- | // print the matrix on LED Matrix | ||
- | printByte(initial); | ||
} | } | ||
- | | + | |
- | void SonarSensor(int trigPin,int echoPin) { | + | if(distanceRight < safetyDistance) { |
- | // disable the trigger pin | + | for(int i = 0; i < 8; i++) { |
- | digitalWrite(trigPin, LOW); | + | initial[i] = initial[i] | 0b00000100; |
- | delayMicroseconds(2); | + | |
- | + | ||
- | // enable the trigger pin for 10 microseconds | + | |
- | digitalWrite(trigPin, HIGH); | + | |
- | delayMicroseconds(10); | + | |
- | digitalWrite(trigPin, LOW); | + | |
- | + | ||
- | // receive the duration | + | |
- | duration = pulseIn(echoPin, HIGH); | + | |
- | distance = duration * 0.034 / 2; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void printByte(byte character []) { | + | |
- | int i = 0; | + | |
- | for(i = 0; i < 8; i ++) { | + | |
- | lc.setRow(0, i, character[i]); | + | |
} | } | ||
} | } | ||
- | ===== Rezultate Obţinute ===== | ||
- | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | ||
- | </note> | ||
+ | // print the matrix on LED Matrix | ||
+ | printByte(initial); | ||
+ | } | ||
+ | |||
+ | void SonarSensor(int trigPin,int echoPin) { | ||
+ | // disable the trigger pin | ||
+ | digitalWrite(trigPin, LOW); | ||
+ | delayMicroseconds(2); | ||
+ | |||
+ | // enable the trigger pin for 10 microseconds | ||
+ | digitalWrite(trigPin, HIGH); | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(trigPin, LOW); | ||
+ | |||
+ | // receive the duration | ||
+ | duration = pulseIn(echoPin, HIGH); | ||
+ | distance = duration * 0.034 / 2; | ||
+ | } | ||
+ | |||
+ | |||
+ | void printByte(byte character []) { | ||
+ | int i = 0; | ||
+ | for(i = 0; i < 8; i ++) { | ||
+ | lc.setRow(0, i, character[i]); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | ===== Rezultate Obţinute ===== | ||
+ | {{:pm:prj2022:arosca:theo-rezultate1.jpeg?600x400|}} | ||
+ | {{:pm:prj2022:arosca:theo-rezultate2.jpeg?600x400|}} | ||
+ | {{:pm:prj2022:arosca:theo-rezultate3.jpeg?600x400|}} | ||
+ | {{:pm:prj2022:arosca:theo-rezultate4.jpeg?600x400|}} | ||
+ | {{:pm:prj2022:arosca:theo-rezultate5.jpeg?600x400|}} | ||
+ | {{:pm:prj2022:arosca:theo-rezultate6.jpeg?600x400|}} | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | ===== Download ===== | + | Fiind primul meu proiect de acest tip, am învățat lucruri noi si utile printre care și lipirea folosind Letcon. |
- | <note warning> | + | O problemă prezentă in proiect sunt senzorii, fiind niște senzori basic, in momentul in care distanța față de obiect este mai mică de 2cm, senzorul începe sa ofere rezultate eronate. |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
- | 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**. | + | Proiectul poate fi folositor în cazul în care vrem să construim o mașinuța electrică si dorim ca această mașină sa dispună de un sistem ajutător pentru parcare. |
- | </note> | + | } |
+ | ===== Download ===== | ||
+ | {{:pm:prj2022:arosca:parking_helper.zip|Arhiva Proiectului}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
- | + | * **29 aprilie 2022**: crearea paginii de wiki, alegerea temei proiectului | |
- | <note tip> | + | * **22 mai 2022**: introducere, componente utilizate |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | * **23 mai 2022**: finalizare proiect(parte software, parte hardware, descriere generală, schemă bloc, schemă electrică) |
- | </note> | + | |
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | * [[https://lastminuteengineers.com/arduino-sr04-ultrasonic-sensor-tutorial/|HC-SR04 Ultrasonic Sensor]] |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * [[https://www.electronicshub.org/arduino-led-matrix/|8x8 LED Matrix]] |
- | </note> | + | * [[https://xantorohara.github.io/led-matrix-editor/|8x8 LED Matrix generator]] |
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||