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> | ||