This shows you the differences between two versions of the page.
pm:prj2022:arosca:radar [2022/05/27 21:47] acirlomaneanu [Download] |
pm:prj2022:arosca:radar [2022/05/27 21:56] (current) acirlomaneanu [Software Design] |
||
---|---|---|---|
Line 40: | Line 40: | ||
Pentru a cauta un obstacol senzorul trimite un semnal si asteapta ecoul acestuia. Se calculeaza durata si se transforma in centimetri. Daca distanta este mai mica de 5 cm LED-ul RGB se aprinde rosu si buzzer-ul vibreaza. Daca distanta gasita este intre 5 si 20 de centimetri LED-ul se coloreaza in galben si buzzer-ul vibreaza mai putin intens. In ambele cazuri se afiseaza pe LCD distanta la care se afla obiectul si unghiul in grade hexazecimale la care era pozitionat servomotorul. In cazul in care distanta la care se afla obiectul este mai mare de 20 cm pe LCD se va scrie faptul ca suntem la o distanta sigura. | Pentru a cauta un obstacol senzorul trimite un semnal si asteapta ecoul acestuia. Se calculeaza durata si se transforma in centimetri. Daca distanta este mai mica de 5 cm LED-ul RGB se aprinde rosu si buzzer-ul vibreaza. Daca distanta gasita este intre 5 si 20 de centimetri LED-ul se coloreaza in galben si buzzer-ul vibreaza mai putin intens. In ambele cazuri se afiseaza pe LCD distanta la care se afla obiectul si unghiul in grade hexazecimale la care era pozitionat servomotorul. In cazul in care distanta la care se afla obiectul este mai mare de 20 cm pe LCD se va scrie faptul ca suntem la o distanta sigura. | ||
+ | |||
+ | <code java> | ||
+ | #include <LiquidCrystal_I2C.h> | ||
+ | #include <Servo.h> | ||
+ | #include <Wire.h> | ||
+ | |||
+ | long duration, cm; | ||
+ | |||
+ | int red_light_pin = 13; | ||
+ | int blue_light_pin = 12; | ||
+ | int green_light_pin = 11; | ||
+ | int buzzer_pin = 10; | ||
+ | Servo servo_7; | ||
+ | int echo = 4; | ||
+ | int trigger = 5; | ||
+ | |||
+ | LiquidCrystal_I2C lcd(0x27, 16, 2); | ||
+ | |||
+ | int pos = 0; | ||
+ | int message = -1; | ||
+ | int obsFound = 0; | ||
+ | |||
+ | void setup() { | ||
+ | // Initiem pinii pentru output | ||
+ | servo_7.attach(7); | ||
+ | pinMode(red_light_pin, OUTPUT); | ||
+ | pinMode(blue_light_pin, OUTPUT); | ||
+ | pinMode(green_light_pin, OUTPUT); | ||
+ | pinMode(buzzer_pin, OUTPUT); | ||
+ | pinMode(echo, INPUT); | ||
+ | pinMode(trigger, OUTPUT); | ||
+ | lcd.init(); | ||
+ | lcd.backlight(); | ||
+ | lcd.setCursor(0,0); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | for (pos = 0; pos <= 180; pos += 1) { | ||
+ | // in steps of 1 degree | ||
+ | servo_7.write(pos); | ||
+ | getDistance(); | ||
+ | } | ||
+ | for (pos = 180; pos >= 0; pos -= 1) { | ||
+ | servo_7.write(pos); | ||
+ | getDistance(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void getDistance() { | ||
+ | // Senzorul cu ultrasuente este declansat de un impuls HIGH | ||
+ | // Dam un scurt impuls pe LOW pentru a ne asigura ca vom emite un semnal | ||
+ | // HIGH neperturbat. | ||
+ | digitalWrite(trigger, LOW); | ||
+ | delayMicroseconds(2); | ||
+ | digitalWrite(trigger, HIGH); | ||
+ | delayMicroseconds(2); | ||
+ | digitalWrite(trigger, LOW); | ||
+ | // Se pune pinul pe input si se gaseste durata in care semnalul gaseste un | ||
+ | // obstacol (durata impulsului care este HIGH de la emitere pana la intoarcerea | ||
+ | // ecoului) | ||
+ | duration = pulseIn(echo, HIGH); | ||
+ | |||
+ | // Obtinerea distantei | ||
+ | cm = microsecondsToCentimeters(duration); | ||
+ | | ||
+ | // Culoarea rosie | ||
+ | if(cm <= 5){ | ||
+ | digitalWrite(red_light_pin, HIGH); | ||
+ | digitalWrite(green_light_pin, LOW); | ||
+ | digitalWrite(blue_light_pin, LOW); | ||
+ | //noTone(buzzer_pin); | ||
+ | tone(buzzer_pin, 120, 200); | ||
+ | message = 1; | ||
+ | |||
+ | } | ||
+ | // Culoarea galbena | ||
+ | else if (cm > 5 && cm < 20){ | ||
+ | digitalWrite(red_light_pin, HIGH); | ||
+ | digitalWrite(green_light_pin, HIGH); | ||
+ | digitalWrite(blue_light_pin, LOW); | ||
+ | //noTone(buzzer_pin); | ||
+ | tone(buzzer_pin, 40, 50); | ||
+ | lcd.clear(); | ||
+ | message = 1; | ||
+ | |||
+ | } | ||
+ | // Culoarea verde | ||
+ | else if (cm > 20) { | ||
+ | digitalWrite(red_light_pin, LOW); | ||
+ | digitalWrite(green_light_pin, HIGH); | ||
+ | digitalWrite(blue_light_pin, LOW); | ||
+ | noTone(buzzer_pin); | ||
+ | message = 0; | ||
+ | } | ||
+ | |||
+ | if (message == 1) { | ||
+ | lcd.clear(); | ||
+ | lcd.print("Obstacle at "); | ||
+ | lcd.print(cm); | ||
+ | lcd.print("cm"); | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print("Angle "); | ||
+ | lcd.print(180 - pos); | ||
+ | lcd.print(" degrees"); | ||
+ | delay(500); | ||
+ | |||
+ | } else if (message == 0) { | ||
+ | lcd.clear(); | ||
+ | lcd.print("Safe distance"); | ||
+ | delay(50); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | long microsecondsToCentimeters(long microseconds) { | ||
+ | // Viteza sunetului in aer este 340 m/s sau 0.034 cm/microsecunda. | ||
+ | // Folosim formula vitezei obtinem distanta parcursa de unda de la | ||
+ | // emitere pana la intoarcere. Impartim distanta la 2 pentru a gasi | ||
+ | // distanta la care se afla obstacolul. | ||
+ | return microseconds * 0.034 / 2; | ||
+ | } | ||
+ | </code> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
Line 54: | Line 176: | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
+ | |||
+ | * 21 aprilie: alegere proiect | ||
+ | * 5 mai: comandare piese | ||
+ | * 12-17 mai: asamblare si scriere cod | ||
+ | * 20-27 mai: finalizare pagina wiki | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||